在各项生产环境使用中,容灾总是一个很重要的话题,如果单点故障会导致整个系统奔溃或者是丢失数据是不是好气好气的,领导会追着你问这是怎么了?你只能说是我们没有经验什么什么组件故障了,这个是低级玩法,高级玩法是配置好集群容灾,告诉老板死一两台机器宕机了没有事没有影响,所以我们今天就来讲讲RabbitMQ的集群模式...
附上:
喵了个咪的博客:w-blog.cn
RabbitMQ官网 :http://www.rabbitmq.com/
1.配置集群
RabbitMQ通过ssh通道进行集群直接的链接,这里准备了两台服务器分别如下
- 192.168.0.1 主机名 RabbitMQ-1
- 192.168.0.1 主机名 RabbitMQ-2
首先我们需要在这两台机器上配置好互相的host可以通过主机名进行访问
vim /etc/hosts
内网地址 RabbitMQ-1
内网地址 RabbitMQ-2
service network restart
#在 RabbitMQ-1 能通:
ping RabbitMQ-2
#在 RabbitMQ-2 能通:
ping RabbitMQ-1
1.1 配置 Erlang Cookie
当我们可以ping通之后我们需要设置一下 Erlang Cookie 让两台机器保持同样的 Cookie 才能顺利的建立集群
- 先启动双方的RabbitMQ
- 复制 RabbitMQ-1 中 /var/lib/rabbitmq/.erlang.cookie 文件中的值
- 粘贴到 RabbitMQ-2 /var/lib/rabbitmq/.erlang.cookie中 使用:wq! 保存
- 重启RabbitMQ-2 RabbitMQ服务
1.2 join服务器建立关联
Cookie我们已经配置好了 接下来需要把两个集群关联起来
对 RabbitMQ-1 节点做如下操作
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
这个是用来在rabbitmq1上执行的,这个也可以不执行,直接在节点服务器执行下边的脚本,不过得保证这个rabbitmq服务是正常启动的.
RabbitMQ-2 节点服务配置脚本
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@RabbitMQ-1
rabbitmqctl start_app
1.3 查看集群状态
可以通过 rabbitmqctl cluster_status 查看到如下状态证明集群已经配置成功
[root@Sunmi-RabbitMQ-1 ~]# rabbitmqctl cluster_status
Cluster status of node ‘rabbit@Sunmi-RabbitMQ-1’ …
[{nodes,[{disc,[‘rabbit@Sunmi-RabbitMQ-1’]},
{ram,[‘rabbit@Sunmi-RabbitMQ-2’]}]},
{running_nodes,[‘rabbit@Sunmi-RabbitMQ-2’,’rabbit@Sunmi-RabbitMQ-1’]},
{cluster_name,<<“rabbit@Sunmi-RabbitMQ-1”>>},
{partitions,[]},
{alarms,[{‘rabbit@Sunmi-RabbitMQ-2’,[]},{‘rabbit@Sunmi-RabbitMQ-1’,[]}]}]
注意:建立好集群之后需要重新配置一下用户 配置的用户会影响整个集群
2. 集群的各项模式
关于RabbitMQ 集群有两大模式需要说明,一个是磁盘模式或内存模式,一个是普通模式和镜像模式,我们先说磁盘和内存模式
2.1 磁盘和内存模式
磁盘模式故名思议,磁盘模式就是把数据持久化到磁盘让整个服务重启时数据也不会丢,缺点是I/O吞吐依赖磁盘性能
内存模式也就是把数据存在内存空间中读取写入速度非常快,缺点是当重启服务内存中的数据会丢失
可以通过web管理界面看到各个节点的运行模式,也可以通过命令来改变节点运行模式但是注意集群中必须有一个磁盘节点才能运行
2.2 普通模式和镜像模式
普通模式就是默认模式,我们现在集群有 A B 两台服务器,这个时候向A写入了一条数据,然后连接B去读取这条数据,B会先找到A去获取这条数据然后返回给用户,B并不存储向A写入的数据,反过来也是如此向B写入数据不会再A存储
这样看起来并没有什么问题,集群不就是这样吗?但是会产生两个问题
- A 节点会去找B节点获取数据 ,如果B节点死了怎么办
- 数据只在B节点存储B节点是内存模式不就丢了吗
第二点比较好解决,都用磁盘模式,写都只写磁盘模式的节点,虽然会降低性能但是没法解决第一个问题,B节点死了数据就没有来源了,这个时候就需要镜像模式出手了
镜像模式会在所有节点之间同步数据,也就是集群中有一个节点存活就能正常的使用下去,一般我们会用磁盘节点专门做持久化,内存节点提供使用
配置镜像模式只需要在主节点运行如下命令:
- p 之后加上你需要的Vhost
rabbitmqctl set_policy -p / ha-all “^” ‘{“ha-mode”:”all”}’
在web管理界面队列里面也能够判断出来数据存储在几个节点上
不要盲目追求镜像模式,镜像模式节点之间同步数据也会带来开销所以更具场景来做出合理的判断
3 总结
关于RabbitMQ的介绍,单机模式,集群模式的博文以及列举完了,在之后又在使用RabbitMQ的心得以及一些有意思的地方,也会分享出啦和大家一起学习讨论,多谢大家的支持本小节就到这里了....
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!