设为首页 收藏本站
查看: 892|回复: 0

[经验分享] RabbitMQ集群创建

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-23 09:20:59 | 显示全部楼层 |阅读模式
环境:
OS:CentOS6.75
RabbitMQ Vervison :3.6.5

节点:
node1 : mq01  172.16.42.128
node2:  mq02  172.16.42.135


配置:

1、两台机器上都安装RabbitMQ
这里的安装包括socat、Erlang、rabbitmq-server包的安装,已经环境变量和config文件的配置,请参考RabbitMQ安装,先不要急着创建用户、虚拟主机和配置权限。这些等集群创建好了再做

2、配置hosts文件
mq01
1
2
3
4
5
[iyunv@mq01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.42.128 mq01
172.16.42.135 mq02




mq02
[iyunv@mq01 ~]# cat /etc/hosts
1
2
3
4
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.42.128 mq01
172.16.42.135 mq02




3、拷贝erlang.cookie  
Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中(像我的root用户安装的就是放在我的root/.erlang.cookie中),文件是400的权限。所以必须包管各节点cookie对峙一致,不然节点之间就无法通信。
1
2
[iyunv@mq01 ~]# cat /var/lib/rabbitmq/.erlang.cookie
FNMCAWWQGOJIQKDJQUQG



将cookie中的内容复制到mq02的cookie文件中。

4、启动rabbitmq服务
1
/etc/init.d/rabbitmq-server start




在node2 mq02上停止rabbitmq应用程序,并重置(重置只是清除节点的配置,如果没有配置过,则可以省略),然后加入node1集群
1
2
[iyunv@mq02 rabbitmq]# rabbitmqctl stop_app
Stopping node rabbit@mq02 ...




reset节点
rabbitmqctl reset
1
2
[iyunv@mq02 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@mq02 ...




5、加入集群
rabbitmqctl join_cluster rabbit@mq01
1
2
[iyunv@mq02 ~]# rabbitmqctl join_cluster rabbit@mq01
Clustering node rabbit@mq02 with rabbit@mq01 ...




启动rabbitmq应用
1
2
[iyunv@mq02 ~]# rabbitmqctl start_app
Starting node rabbit@mq02 ...




6、查看集群状态
node2上查看集群状态
rabbitmqctl cluster_status
1
2
3
4
5
6
7
[iyunv@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上查看集群状态
1
2
3
4
5
6
7
[iyunv@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,[]}]}]




7、更改节点类型
节点有两种类型:磁盘节点和内存节点,集群中必须至少有一个磁盘节点,否则队列元数据无法写入到集群中,当磁盘节点宕掉时,集群将无法写入新的队列元数据信息。

从上面集群状态可以看出,mq01和mq02 均为磁盘节点,可以通过命令
rabbitmqctl change_cluster_node_type disc将mq02更改为内存节点
[iyunv@mq02 ~]# rabbitmqctl stop_appStopping node rabbit@mq02 ...[iyunv@mq02 ~]#  rabbitmqctl change_cluster_node_type ramTurning rabbit@mq02 into a ram node ...[iyunv@mq02 ~]# rabbitmqctl start_app                    Starting node rabbit@mq02 ...[iyunv@mq02 ~]# rabbitmqctl cluster_status               Cluster status of node rabbit@mq02 ...[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]}, {running_nodes,[rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}, {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]也可以在将mq02 加入集群只带上--ram参数,即设置mq02为内存节点.
注意:更改节点类型前,必须将节点rabbitmq应用停掉。

8、验证节点crash后又恢复时,是否能自动加入集群
将node2 mq02 服务停掉,在node1上查看集群状态

1
2
[iyunv@mq02 ~]# rabbitmqctl stop
Stopping and halting node rabbit@mq02 ...



node1 上查看集群状态
1
2
3
4
5
6
7
[iyunv@mq01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]},
{running_nodes,[rabbit@mq01]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{rabbit@mq01,[]}]}]



从上面可以看到running_nodes 只有node1了

启动node2的服务
1
2
3
[iyunv@mq02 ~]# /etc/init.d/rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.



再来查看两台机器集群状态
1
2
3
4
5
6
7
[iyunv@mq01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]},
{running_nodes,[rabbit@mq02,rabbit@mq01]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{rabbit@mq02,[]},{rabbit@mq01,[]}]}]



1
2
3
4
5
6
7
[iyunv@mq02 ~]# rabbitmqctl cluster_status      
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]},
{running_nodes,[rabbit@mq01,rabbit@mq02]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]




9、当磁盘节点挂了时
将node1erlang虚拟机停掉
[iyunv@mq01 ~]# rabbitmqctl stop                 
Stopping and halting node rabbit@mq01 ...

登录rabbitmq web管理控制台,创建新的队列,报错
QQ截图20161223092113.png

恢复node1 erlang虚拟机服务
[iyunv@mq01 ~]# /etc/init.d/rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.
重新创建队列,成功
QQ截图20161223092117.png


10、当磁盘节点挂了时
将node2 erlang虚拟机停掉
[iyunv@mq02 ~]# rabbitmqctl stop                 
Stopping and halting node rabbit@mq02 ...
登录node1的web管理控制台,创建新的队列,成功
QQ截图20161223092122.png
总结:
结合9 和10 的测试来看,集群中没有没有磁盘节点,那么集群不能创建新的队列元数据,但是仍能继续工作,如果内存几点挂了,则集群不受影响,这也是为什么集群中至少要有一个磁盘节点的原因,单个节点不能设置为内存节点。


11、集群镜像模式
上面的集群模式为普通模式,镜像模式实在普通模式的基础之上加一些策略。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。具体如下:
队列通过策略来使能镜像。策略能在任何时刻改变,rabbitmq队列也近可能的将队列随着策略变化而变化;非镜像队列和镜像队列之间是有区别的,前者缺乏额外的镜像基础设施,没有任何slave,因此会运行得更快。为了使队列称为镜像队列,你将会创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下面表格说明这些key的选项:
Center.jpg
语法讲解:
在cluster中任意节点启用策略,策略会自动同步到集群节点
rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'
这行命令在vhost名称为hrsystem创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示所有匹配所有队列名称。
例如rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'
注意:"^message" 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"^"
官方set_policy说明参见
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

创建策略
1
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]



1
2
[iyunv@mq02 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0" ...




查看策略:
1
2
3
[iyunv@mq01 ~]# rabbitmqctl list_policies
Listing policies ...
/       ha-all  all     ^       {"ha-mode":"all"}       0



注意:前面创建策略时没有指定vhost,则对默认的/ 虚拟主机创建策略


12、将节点移出集群
将节点node2 移出集群前,先要stop_app,人后reset节点。
1
2
3
4
5
6
7
[iyunv@mq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@mq02 ...
[iyunv@mq02 ~]# rabbitmqctl reset
Resetting node rabbit@mq02 ...
[iyunv@mq02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq02]}]},{alarms,[]}]




node1上查看集群状态
1
2
3
4
5
6
7
[iyunv@mq01 ~]# rabbitmqctl cluster_status      
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]}]},
{running_nodes,[rabbit@mq01]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{rabbit@mq01,[]}]}]




查看策略,仍然存在。
1
2
3
[iyunv@mq01 ~]# rabbitmqctl list_policies
Listing policies ...
/       ha-all  all     ^       {"ha-mode":"all"}       0




移除远程offline的节点

rabbitmqctl forget_cluster_node rabbit@mq02上面的方法是在节点本地执行命令,将节点从集群中删除,但是如果节点出现故障,连不上节点时,就无法用这种方式删除节点了,我们可以从远程节点删除该节点
注意:必须是远程节点offline时,才能执行执行此命令删除节点。否则报错
1、在node2 上停掉rabbitmq应用

1
2
[iyunv@mq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@mq02 ...



2、在node1上执行删除节点命令,然后查看集群状态
1
2
3
4
5
6
7
8
9
[iyunv@mq01 ~]# rabbitmqctl forget_cluster_node rabbit@mq02
Removing node rabbit@mq02 from cluster ...
[iyunv@mq01 ~]# rabbitmqctl cluster_status   
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]}]},
{running_nodes,[rabbit@mq01]},
{cluster_name,<<"my_cluster">>},
{partitions,[]},
{alarms,[{rabbit@mq01,[]}]}]





13、集群上创建账号
rabbitmqctl add_user user_name
1
2
3
4
5
6
[iyunv@mq02 ~]# rabbitmqctl add_user spms 123456
Creating user "spms" ...
[iyunv@mq02 ~]# rabbitmqctl list_users
Listing users ...
spms    []
guest   [administrator]



1
2
3
4
[iyunv@mq01 ~]# rabbitmqctl list_users
Listing users ...
spms    []
guest   [administrator]



可以看到,在任意节点上创建的账号,会同步到其他节点上

14、集群中创建vhost
rabbitmqctl add_vhost vhost_name
1
2
3
4
5
6
[iyunv@mq01 ~]# rabbitmqctl add_vhost spms
Creating vhost "spms" ...
[iyunv@mq01 ~]# rabbitmqctl list_vhosts
Listing vhosts ...
spms
/



1
2
3
4
[iyunv@mq02 ~]# rabbitmqctl list_vhosts
Listing vhosts ...
spms
/



可以看到,在任意节点上创建的vhost,会同步到其他节点上

15、设置vhost权限
rabbitmqctl set_permissions -p vhost_name username conf write read
1
2
3
4
5
6
7
8
[iyunv@mq02 ~]# rabbitmqctl set_permissions -p spms spms '.*' '.*' '.*'
Setting permissions for user "spms" in vhost "spms" ...
[iyunv@mq02 ~]# rabbitmqctl list_permissions
Listing permissions in vhost "/" ...
guest   .*      .*      .*
[iyunv@mq02 ~]# rabbitmqctl list_permissions -p spms
Listing permissions in vhost "spms" ...
spms    .*      .*      .*



1
2
3
4
5
6
[iyunv@mq01 ~]#  rabbitmqctl list_permissions
Listing permissions in vhost "/" ...
guest   .*      .*      .*
[iyunv@mq01 ~]#  rabbitmqctl list_permissions -p spms
Listing permissions in vhost "spms" ...
spms    .*      .*      .*




16、设置cluster_name
rabbitmqctl set_cluster_name cluster_name[iyunv@mq02 ~]# rabbitmqctl set_cluster_name my_cluster
Setting cluster name to my_cluster ...
[iyunv@mq02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]},
{running_nodes,[rabbit@mq01,rabbit@mq02]},
{cluster_name,<<"my_cluster">>},
{partitions,[]},
{alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-318216-1-1.html 上篇帖子: ssh密钥失败排错 下篇帖子: SuSe 11g下的一次磁盘分区记录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表