RabbitMQ 集群高可用部署详细介绍

共 4022字,需浏览 9分钟

 ·

2019-12-16 23:22

5b51067e18e1d81205f98d2538f7916e.webp

11a09336c9eb03e926e03f36d528d908.webp

链接:cnblogs.com/knowledgesea/p/6535766.html

清风万里的季节,周末本该和亲人朋友一起消遣这烂漫的花花草草,或是懒洋洋的晒个太阳听听风声鸟鸣。无奈工作使然,理想使然,我回到啦公司,敲起啦键盘,撸起啦代码,程序狗的世界一片黯然,一片黯然,愿天下所有努力的程序狗都梦想成真吧!!

回到正题,为什么搭建rabbitmq集群?rabbitmq集群有那些模式?如何搭建Rabbitmq集群?rabbitmq镜像高可用策略有那些?

1、首先这款产品本身的优点众多,大家最看好的便是他的异步化提高系统抗峰值能力,然后便是系统及功能结构解耦,那么照此两点来说,他的在整个系统中的作用还是至关重要的,那么如此重要,当然要考虑他的高可用性,那么便有啦第一个问题的解答。

2、rabbitmq有3种模式,但集群模式是2种。详细如下:

  • 单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。
  • 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  • 镜像模式:把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。


我的环境如下:1、两台Centos7的机器,hostname分别为:F , G .2、IP地址分别为:F—172.18.8.229 , G—172.18.8.224。3、修改hosts文件如下,下面是G这台机器的hosts文件内容,F也需要如下配置:
[root@G bin]# cat /etc/hosts
127.0.0.1 G localhost localhost.localdomain localhost4 localhost4.localdomain4
::1       G localhost localhost.localdomain localhost6 localhost6.localdomain6

172.18.8.224 G
172.18.8.229 F
4、保证两台机器都能够相互ping通,如下图:

8ef6a88f024b2e8ce80943e71e3af0cb.webp

好啦,环境到此就就能满足啦,接下来我们把rabbitmq装在2台机器上。学习不看官方文档,那就别学啦,地址如下:http://www.rabbitmq.com/install-rpm.html安装rabbitmq依赖erlang环境,所以我们要先安装erlang环境。

dcd076f88a141f26700c7b9beacdd817.webp

安装完成之后,下载rabbitmq的rpm包ivh即可。如果实在不会安装,Linux系统(二)软件的安装与卸载 里面有安装rabbitmq的实例,看官笑纳,实在不会装那加入左上方群,或者点击网页右上方的X吧,一定要相信不是你的错,是你与rabbitmq缘分不到。安装启动过程中如果出现error,那可参考下面几个方案试试:
  • vim /etc/rabbitmq/enable_plugins :删除文件中的内容。
  • 查看hosts文件是否配置完善,相互是否可以ping通
  • 查看相关端口是否被占用,如若占用kill掉
  • 如果已经集群,那么要查看所有集群中的/var/lib/rabbitmq/.erlang.cookie是否一致。
  • 如果不存在上述文件,echo $HOME ,打开此文件夹,查看cookie文件是否一致。
  • 重启电脑,防止缓存数据配置未更新过来。


这里安装启动成功之后,来几个常用的操作。
[root@G bin]# ./rabbitmq-server -deched --后台启动服务
[root@G bin]# ./rabbitmqctl start_app --启动服务
[root@G bin]# ./rabbitmqctl stop_app --关闭服务
[root@G bin]# ./rabbitmq-plugins enable rabbitmq_management --启动web管理插件
[root@G bin]# ./rabbitmqctl add_user zlh zlh --添加用户,密码
[root@G bin]# ./rabbitmqctl set_user_tags zlh administrator --设置zlh为administrator权限
如果你看到如下操作,即表明启动成功啦,并且web管理页面的插件也启动成功,如果下面的6为0,则需要启动web管理插件

c90daa3ad8836a45c11ff61b1b2c916a.webp

那具体rabbitmqctl 的命令详细还要看官网文档:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html 在上述的两台机器上安装rabbitmq完成之后,你可以看到你的机器中有如下1个文件。路径在$HOME中或者在/var/lib/rabbitmq中,文件名称为.erlang.cookie,他是一个隐藏文件。那么这文件存储的内容是什么,是做什么用的呢?这样说吧:RabbitMQ的集群是依赖erlang集群,而erlang集群是通过这个cookie进行通信认证的,因此我们做集群的第一步就是干cookie。怎么干?1、必须使集群中也就是F,G这两台机器的.erlang.cookie文件中cookie值一致,且权限为owner只读。机器G中的Cookie:

c8606bbb38abd0837033d34c1919c88d.webp

 机器F中的Cookie:

b9a9b86eb8936eec889a3190a84618ca.webp

修改文件权限如下:
[root@F ~]# chmod 600 .erlang.cookie
2、查看集群状态,我的是已经做好的。
[root@F bin]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@F ...
[{nodes,[{disc,[rabbit@G]},{ram,[rabbit@F]}]},
 {running_nodes,[rabbit@G,rabbit@F]},
 {cluster_name,<<"rabbit@F">>},
 {partitions,[]},
 {alarms,[{rabbit@G,[]},{rabbit@F,[]}]}]
3、停止当前机器中rabbitmq的服务
[root@F bin]# ./rabbitmqctl stop_app
4、把G中的rabbitmq加入到集群中来
[root@F bin]# ./rabbitmqctl join_cluster --ram rabbit@G
5、开启当前机器的rabbitmq服务
[root@F bin]# ./rabbitmqctl start_app
6、打开网页管理页面查看nodes

bd951319caa3becb1b974738ac73fe75.webp

如此便可以啦,你可以做下测试,验证下我们序言中说的普通模式的说明,那必须是杠杠对的。写到这里,接下来,有朋友要请我吃饭啦,我就速战速决赴会去啦,即便如此该有的也会都有的。go,go,go。这一节要参考的文档是:http://www.rabbitmq.com/ha.html首先镜像模式要依赖policy模块,这个模块是做什么用的呢?policy中文来说是政策,策略的意思,那么他就是要设置,那些Exchanges或者queue的数据需要复制,同步,如何复制同步?对就是做这些的。这里有点内容的,我先上例子慢慢说:
[root@G ~]# ./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
参数意思为:ha-all:为策略名称。^:为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue。ha-mode:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为F与G这2台机器。)。参考示例如下

354dc4446616409845dce245f380b531.webp

当然在web管理界面也能配置:

558097eb675da547082ca75efa2f3cb7.webp

配置完看队列如下,其中表示ha-haall的说明用我的ha-haall策略啦,属于镜像模式,没有表示的就是普通模式:

c7fad95a88f5454020a0f83d65e3691f.webp



- End -

36e830c456558ae1581e23f42dbc1351.webp


面试题系列教程  点击--> 面试题技术干货连载目录 跳转


Maven系列教程  点击--> Maven技术干货连载目录 跳转


MyBatis系列教程  点击--> MyBatis技术干货连载目录 跳转


JVM调优总结系列教程  点击--> JVM调优技术干货连载目录 跳转





, ae15046a07d5ca9fb95a0bb85641398d.webp

浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报