xuqm před 1 rokem
rodič
revize
4358c1fd7e
2 změnil soubory, kde provedl 202 přidání a 2 odebrání
  1. 23 2
      README.md
  2. 179 0
      RabbitMQ集群部署.md

+ 23 - 2
README.md

@@ -1,3 +1,24 @@
-# ImGroup
+[TOC]
+
+
+
+## 官网
+
+### [RabbitMQ-官网](https://www.rabbitmq.com/)
+
+
+
+## 服务搭建
+
+### [RabbitMQ-集群搭建](./RabbitMQ集群部署.md)
+
+
+
+## 客户端相关
+
+
+### [RabbitMQ-JAVA](https://www.rabbitmq.com/tutorials/tutorial-one-java.html)
+### [RabbitMQ-JavaScript](https://www.rabbitmq.com/tutorials/tutorial-one-javascript.html)
+### [RabbitMQ-swift](https://www.rabbitmq.com/tutorials/tutorial-one-swift.html)
+### [RabbitMQ-object-c](https://www.rabbitmq.com/tutorials/tutorial-one-objectivec.html)
 
-im即时通讯相关整合

+ 179 - 0
RabbitMQ集群部署.md

@@ -0,0 +1,179 @@
+[TOC]
+
+# 集群概述
+
+### 计划部署3节点的mq集群:
+
+| 主机名 | 控制台端口      | AMQP通信端口  |
+| ------ | --------------- | ------------- |
+| mq1    | 8081 ---->15672 | 8071---->5672 |
+| mq2    | 8082 ---->15672 | 8072---->5672 |
+| mq3    | 8083 ---->15672 | 8073---->5672 |
+
+# 获取cookie
+
+> RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。
+> 要使两个节点能够通信,它们必须具有相同的共享秘密,称为Erlang cookie。
+> 每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。
+
+##### 先创建一个mq容器,然后获取这个mq容器的cookie,作为之后mq集群的cookie:
+
+```bash
+docker run -d -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root --name mq --hostname mq -p 8074:5672 -p 8084:15672 rabbitmq
+```
+
+```bash
+docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie
+```
+
+##### 得到cookie如下:
+
+```bash
+DFPDFJPEQOYLQYMOSKNE
+```
+
+##### 接下来,停止并删除当前的mq容器:
+
+```bash
+docker rm -f mq
+```
+
+
+
+# 准备集群配置
+
+##### 在虚拟机中新建一个目录 `/rabbitmq` 来存放集群的配置文件:
+
+##### 进入该目录,新建一个配置文件 `rabbitmq.conf`:
+
+```bash
+cd /rabbitmq
+# 创建文件
+touch rabbitmq.conf
+```
+
+##### 使用vim编辑该文件,加入如下内容:
+
+
+```tex
+loopback_users.guest = false
+listeners.tcp.default = 5672
+cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
+cluster_formation.classic_config.nodes.1 = rabbit@mq1
+cluster_formation.classic_config.nodes.2 = rabbit@mq2
+cluster_formation.classic_config.nodes.3 = rabbit@mq3
+```
+
+##### 再创建一个文件,记录cookie:
+
+```bash
+# 创建cookie文件
+touch .erlang.cookie
+# 写入cookie
+echo "DFPDFJPEQOYLQYMOSKNE" > .erlang.cookie
+# 修改cookie文件的权限
+chmod 600 .erlang.cookie
+```
+
+##### 准备三个目录,mq1、mq2、mq3来模拟集群:
+
+![](.\images\集群文件目录.png)
+
+然后拷贝rabbitmq.conf、cookie文件到mq1、mq2、mq3:
+
+```bash
+# 进入/rabbitmq
+cd /rabbitmq
+# 拷贝
+cp rabbitmq.conf mq1
+cp rabbitmq.conf mq2
+cp rabbitmq.conf mq3
+cp .erlang.cookie mq1
+cp .erlang.cookie mq2
+cp .erlang.cookie mq3
+```
+
+# 启动集群
+
+##### 创建一个网络:
+
+```bash
+docker network create mq-net
+```
+
+##### 然后进入 /rabbitmq 目录,执行以下命令分别部署mq1、mq2、mq3:
+
+> rabbitmq:3.13-rc-management 可替换新版本,但是必须是包含`management`的版本。
+
+```bash
+docker run -d --net mq-net \
+-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
+-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
+-e RABBITMQ_DEFAULT_USER=root \
+-e RABBITMQ_DEFAULT_PASS=root \
+--name mq1 \
+--hostname mq1 \
+-p 8071:5672 \
+-p 8081:15672 \
+rabbitmq:3.13-rc-management
+```
+```bash
+docker run -d --net mq-net \
+-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
+-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
+-e RABBITMQ_DEFAULT_USER=root \
+-e RABBITMQ_DEFAULT_PASS=root \
+--name mq2 \
+--hostname mq2 \
+-p 8072:5672 \
+-p 8082:15672 \
+rabbitmq:3.13-rc-management
+```
+```bash
+docker run -d --net mq-net \
+-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
+-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
+-e RABBITMQ_DEFAULT_USER=root \
+-e RABBITMQ_DEFAULT_PASS=root \
+--name mq3 \
+--hostname mq3 \
+-p 8073:5672 \
+-p 8083:15672 \
+rabbitmq:3.13-rc-management
+```
+
+##### 到此集群就部署完成了,可以通过docker命令查看是否部署成功:
+
+```bash
+docker ps
+```
+
+# 测试
+
+##### 通过8081端口访问mq1,可以看到集群状态:
+
+> 用户名:root
+>
+> 密码:root
+
+![image-20230907150902619](E:\XuqmProjects2\ImGroup\images\集群部署情况.png)
+
+# 镜像模式
+
+##### 一旦创建队列的主机宕机,队列就会不可用。不具备高可用能力。
+
+### exactly模式
+
+```bash
+docker exec -it mq1 rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
+```
+
+> - docker exec -it mq1:对mq1容器做操作
+> - rabbitmqctl set_policy:固定写法
+> - ha-two:策略名称,自定义
+> - "^two\.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以two.开头的队列名称
+> - '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}': 策略内容
+> - "ha-mode":"exactly":策略模式,此处是exactly模式,指定副本数量
+> - "ha-params":2:策略参数,这里是2,就是副本数量为2,1主1镜像
+> - "ha-sync-mode":"automatic":同步策略,默认是manual,即新加入的镜像节点不会同步旧的消息。如果设置为automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销。
+