diff --git a/README.md b/README.md index 8bfc026..1abbac6 100644 --- a/README.md +++ b/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即时通讯相关整合 \ No newline at end of file diff --git a/RabbitMQ集群部署.md b/RabbitMQ集群部署.md new file mode 100644 index 0000000..b15eb8a --- /dev/null +++ b/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,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销。 +