“Rabbitmq cluster on centos7”的版本间的差异
docker>Evan |
(→docker) |
||
(未显示同一用户的1个中间版本) | |||
第196行: | 第196行: | ||
− | ==docker == | + | |
+ | |||
+ | [https://blog.csdn.net/winy_lm/article/details/81128181 Rabbitmq镜像集群部署] | ||
+ | |||
+ | ==docker 不要的了== | ||
[https://www.cnblogs.com/xmai/p/7493062.html RabbitMQ:Docker环境下搭建rabbitmq集群] | [https://www.cnblogs.com/xmai/p/7493062.html RabbitMQ:Docker环境下搭建rabbitmq集群] |
2019年10月22日 (二) 09:00的最新版本
目录
Note
Note: 另外一个docker
Rabbitmq cluster on docker-compose
前提是rabbitmq安装
介绍
运行模式大概有3种:
单一模式:非集群模式,单台。
普通模式:RabbitMQ默认的集群模式。
对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。
所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。
该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。
如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化会丢失消息。
镜像模式:Queue同时存在多个节点,可通过改模式实现HA高可用 该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。
该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
rabbitmq-server-3.7.7-1.el7
配置hosts文件
echo '192.168.0.202 mq01 192.168.0.202 mq02' >>/etc/hosts hostnamectl --static set-hostname mq01 hostnamectl --static set-hostname mq02 #注意 这个格式是不对的 不能并列 只能有一个 #192.168.0.201 master zoo1 192.168.0.202 mq01 192.168.0.203 mq02
三台主机上安装的 RabbitMQ 都保证都可以正常启动,才可以进行以下操作
停止RabbitMQ 服务
systemctl stop rabbitmq-server
拷贝erlang.cookie
#要先启动 不然没有cookie 文件 systemctl start rabbitmq-server [root@node1 ~]cat /var/lib/rabbitmq/.erlang.cookie RDZZRBEWSOOIYHOABHTI 将cookie中的内容复制到mq02的cookie文件中。 这里将 node1 的该文件复制到 node2、node3,由于这个文件权限是 400为方便传输,先修改权限,非必须操作,所以需要先修改 node2、node3 中的该文件权限为 777 #这操作太low scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/ chmod 400 /var/lib/rabbitmq/.erlang.cookie chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie 注意事项 cookie在所有节点上必须完全一样,同步时一定要注意。 erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败
启动rabbitmq服务
systemctl restart rabbitmq-server # on all node
在node2 mq02上停止rabbitmq应用程序,并重置(重置只是清除节点的配置,如果没有配置过,则可以省略),然后加入node1集群
[root@mq02 rabbitmq]# rabbitmqctl stop_app Stopping node rabbit@mq02 ...
reset节点 [root@mq02 rabbitmq]# rabbitmqctl reset Resetting node rabbit@mq02 ...
加入集群
[root@mq02 ~]# rabbitmqctl join_cluster rabbit@mq01 Clustering node rabbit@mq02 with rabbit@mq01 ... 启动rabbitmq应用 [root@mq02 ~]# rabbitmqctl start_app Starting node rabbit@mq02 ...
查看集群状态
node2上查看集群状态 rabbitmqctl cluster_status [root@mq02 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]}, {running_nodes,[rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}] node1上查看集群状态 [root@mq01 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq01 ... [{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]}, {running_nodes,[rabbit@mq02,rabbit@mq01]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq02,[]},{rabbit@mq01,[]}]}]
更改节点类型
节点有两种类型:磁盘节点和内存节点,集群中必须至少有一个磁盘节点,否则队列元数据无法写入到集群中,当磁盘节点宕掉时,集群将无法写入新的队列元数据信息。
从上面集群状态可以看出,mq01和mq02 均为磁盘节点,可以通过命令
还有很多好的 如下 URL
http://blog.51cto.com/zengestudy/1885054
运行各节点 rabbitmqctl stop
rabbitmq-server -detached
other
组成集群 [root@mq01 ~] rabbitmqctl stop_app [root@mq02 ~]# rabbitmqctl stop_app # 停止rabbitmq服务 n[root@mq02 ~]# rabbitmqctl join_cluster rabbit@mq01 # node2和node1构成集群, node2必须能通过node1的主机名ping通 [root@mq02 ~]# rabbitmqctl start_app # 开启rabbitmq服务 查看日志 less /var/log/rabbitmq/[email protected] 在node2 mq02上停止rabbitmq应用程序,并重置(重置只是清除节点的配置,如果没有配置过,则可以省略),然后加入node1集群 [root@mq02 rabbitmq]# rabbitmqctl stop_app # Stopping node rabbit@mq02 ... reset节点 [root@mq02 rabbitmq]# rabbitmqctl reset Resetting node rabbit@mq02 ...
trouble shooting
rabbitmqctl reset
23:49:15.657 [error] Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces
see also
CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务与使用
docker 不要的了
RabbitMQ:Docker环境下搭建rabbitmq集群