RabbitMQ集群创建

来源:互联网 发布:可靠性仿真软件 编辑:程序博客网 时间:2024/05/16 08:08

环境:

OS:

RabbitMQ Vervison :


节点:

node1 : mq01  

node2:  mq02   


配置:

1、两台机器上都安装RabbitMQ

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


2、配置hosts文件

mq01 

[root@mq01 ~]# cat /etc/hosts   localhost  localhost4 ::1         localhost  localhost6  mq01 mq02


mq02

[root@mq01 ~]# cat /etc/hosts

   localhost  localhost4 ::1         localhost  localhost6  mq01 mq02


3、拷贝  

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

[root@mq01 ~]# cat /var/lib/rabbitmq/ FNMCAWWQGOJIQKDJQUQG

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


4、启动rabbitmq服务

/etc//rabbitmq-server start


在node2 mq02上停止rabbitmq应用程序,并重置(重置只是清除节点的配置,如果没有配置过,则可以省略),然后加入node1集群

[root@mq02 rabbitmq]# rabbitmqctl stop_appStopping node rabbit@mq02 ...


reset节点

rabbitmqctl reset
[root@mq02 rabbitmq]# rabbitmqctl resetResetting node rabbit@mq02 ...


5、加入集群

rabbitmqctl join_cluster rabbit@mq01
[root@mq02 ~]# rabbitmqctl join_cluster rabbit@mq01 Clustering node rabbit@mq02 with rabbit@mq01 ...


启动rabbitmq应用

[root@mq02 ~]# rabbitmqctl start_appStarting node rabbit@mq02 ...


6、查看集群状态

node2上查看集群状态

rabbitmqctl cluster_status
[root@mq02 ~]# rabbitmqctl cluster_statusCluster 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_statusCluster 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更改为内存节点

[root@mq02 ~]# rabbitmqctl stop_appStopping node rabbit@mq02 ...[root@mq02 ~]#  rabbitmqctl change_cluster_node_type ramTurning rabbit@mq02 into a ram node ...[root@mq02 ~]# rabbitmqctl start_app                    Starting node rabbit@mq02 ...[root@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上查看集群状态

[root@mq02 ~]# rabbitmqctl stopStopping and halting node rabbit@mq02 ...

node1 上查看集群状态

[root@mq01 ~]# rabbitmqctl cluster_statusCluster 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的服务

[root@mq02 ~]# /etc//rabbitmq-server startStarting rabbitmq-server: SUCCESSrabbitmq-server.

再来查看两台机器集群状态

[root@mq01 ~]# rabbitmqctl cluster_statusCluster 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,[]}]}]
[root@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虚拟机停掉

[root@mq01 ~]# rabbitmqctl stop                 

Stopping and halting node rabbit@mq01 ...


登录rabbitmq web管理控制台,创建新的队列,报错


恢复node1 erlang虚拟机服务

[root@mq01 ~]# /etc//rabbitmq-server start

Starting rabbitmq-server: SUCCESS

rabbitmq-server.

重新创建队列,成功



10、当磁盘节点挂了时

将node2 erlang虚拟机停掉

[root@mq02 ~]# rabbitmqctl stop                 

Stopping and halting node rabbit@mq02 ...

登录node1的web管理控制台,创建新的队列,成功

总结

结合9 和10 的测试来看,集群中没有没有磁盘节点,那么集群不能创建新的队列元数据,但是仍能继续工作,如果内存几点挂了,则集群不受影响,这也是为什么集群中至少要有一个磁盘节点的原因,单个节点不能设置为内存节点。



11、集群镜像模式

上面的集群模式为普通模式,镜像模式实在普通模式的基础之上加一些策略。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。具体如下:

队列通过策略来使能镜像。策略能在任何时刻改变,rabbitmq队列也近可能的将队列随着策略变化而变化;非镜像队列和镜像队列之间是有区别的,前者缺乏额外的镜像基础设施,没有任何slave,因此会运行得更快。为了使队列称为镜像队列,你将会创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下面表格说明这些key的选项:


语法讲解:

在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]
(/man/)


创建策略

set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
[root@mq02 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0" ...


查看策略: 

[root@mq01 ~]# rabbitmqctl list_policiesListing policies .../       ha-all  all     ^       {"ha-mode":"all"}       0

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



12、将节点移出集群

将节点node2 移出集群前,先要stop_app,人后reset节点。

[root@mq02 ~]# rabbitmqctl stop_appStopping node rabbit@mq02 ...[root@mq02 ~]# rabbitmqctl resetResetting node rabbit@mq02 ...[root@mq02 ~]# rabbitmqctl cluster_statusCluster status of node rabbit@mq02 ...[{nodes,[{disc,[rabbit@mq02]}]},{alarms,[]}]


node1上查看集群状态

[root@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,[]}]}]


查看策略,仍然存在。

[root@mq01 ~]# rabbitmqctl list_policies Listing policies .../       ha-all  all     ^       {"ha-mode":"all"}       0


移除远程offline的节点

rabbitmqctl forget_cluster_node rabbit@mq02

上面的方法是在节点本地执行命令,将节点从集群中删除,但是如果节点出现故障,连不上节点时,就无法用这种方式删除节点了,我们可以从远程节点删除该节点

注意:必须是远程节点offline时,才能执行执行此命令删除节点。否则报错

1、在node2 上停掉rabbitmq应用

[root@mq02 ~]# rabbitmqctl stop_appStopping node rabbit@mq02 ...

2、在node1上执行删除节点命令,然后查看集群状态

[root@mq01 ~]# rabbitmqctl forget_cluster_node rabbit@mq02Removing node rabbit@mq02 from cluster ...[root@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


[root@mq02 ~]# rabbitmqctl add_user spms 123456Creating user "spms" ...[root@mq02 ~]# rabbitmqctl list_usersListing users ...spms    []guest   [administrator]
[root@mq01 ~]# rabbitmqctl list_usersListing users ...spms    []guest   [administrator]

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


14、集群中创建vhost

rabbitmqctl add_vhost vhost_name
[root@mq01 ~]# rabbitmqctl add_vhost spmsCreating vhost "spms" ...[root@mq01 ~]# rabbitmqctl list_vhostsListing vhosts ...spms/
[root@mq02 ~]# rabbitmqctl list_vhostsListing vhosts ...spms/

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


15、设置vhost权限

rabbitmqctl set_permissions -p vhost_name username conf write read
[root@mq02 ~]# rabbitmqctl set_permissions -p spms spms '.*' '.*' '.*'Setting permissions for user "spms" in vhost "spms" ...[root@mq02 ~]# rabbitmqctl list_permissionsListing permissions in vhost "/" ...guest   .*      .*      .*[root@mq02 ~]# rabbitmqctl list_permissions -p spmsListing permissions in vhost "spms" ...spms    .*      .*      .*
[root@mq01 ~]#  rabbitmqctl list_permissionsListing permissions in vhost "/" ...guest   .*      .*      .*[root@mq01 ~]#  rabbitmqctl list_permissions -p spmsListing permissions in vhost "spms" ...spms    .*      .*      .*


16、设置cluster_name

rabbitmqctl set_cluster_name cluster_name

[root@mq02 ~]# rabbitmqctl set_cluster_name my_cluster

Setting cluster name to my_cluster ...

[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,<<"my_cluster">>},

 {partitions,[]},

 {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]






参考链接: /man/

/



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝支付失败可钱扣了怎么办 苹果nfc感应坏了怎么办 老鼠添过的盘子怎么办 ie浏览器页面显示网页错误怎么办 Ⅵvo手机声音小怎么办 小米手机预约错了怎么办 小米note二手没解锁怎么办 艾灸后脸色越黑怎么办 淘宝软件类目不能上架宝贝怎么办 ae中没有mpg格式怎么办 淘宝小二处理不公怎么办 遇到卖保险的人怎么办 租房合同没理家电清单怎么办 普雪油烟机坏了怎么办 我累了 真的累了怎么办 u盘15g变成4g了怎么办 属兔的买了东户怎么办 玩时时彩输了2万怎么办 胸变的又软又小怎么办 u盘16g变成4g了怎么办 1岁宝宝吃了就吐怎么办 脚崴了肿了很痛怎么办 九格拼图5在9那怎么办 4s锁屏密码忘了怎么办 6p触屏偶尔乱跳怎么办 新办劳务公司的劳务资质怎么办 汽车没电了打不着火怎么办 吃凉的甜的牙疼怎么办 学车对点对不上怎么办 发现老公有外遇最明智的怎么办 想开个童装店但是没经验怎么办 母乳不够吃宝宝又不喝奶粉怎么办 掉头发很厉害怎么办有什么偏方 红米2a刷死机了怎么办 公司退市我们买的股票怎么办 黑魂3把npc杀了怎么办 摔倒了膝盖摔肿了又痛怎么办 厕所堵了怎么办疏通马桶有妙招 月经不来怎么办如何让它快点来 苹果手机进水了开不了机怎么办 苹果5s进水了怎么办修要多少钱