集群创建表空间

集群创建表空间,第1张

RabbitMQ集群创建

环境:

*** 作系统:厘斯6.75

RabbitMQ版本:3.6.5


节点:

节点1:mq01172.16.42.128

节点2:mq02172.16.42.135


配置:

1.两台机器上都安装了RabbitMQ。

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


2。配置主机文件

将两个MQ节点的计算机名更改为mq01和mq02,然后修改主机配置文件

mq01

[root@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

[root@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


3。复制erlang.cookie

Rabbitmq的集群是依附于erlang的集群的,所以首先要搭建erlang的集群场景。Erlang的集群中的每个节点都是通过一个神奇的cookie来实现的,这个cookie存储在/var/lib/rabbitMQ/.Erlang.cookie中(就像我的root用户安装在我的root/.erlang.cookie中一样),文件是400权限。因此,有必要确保每个节点的cookie是一致的,否则节点无法相互通信。

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

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


4。启动rabbitmq服务

/etc/init.d/rabbitmq-server start


在node2mq02上停止rabbitmq应用,复位(复位只是清除节点的配置,如果没有配置可以省略),然后加入node1集群。

[root@mq02 rabbitmq]# rabbitmqctl stop_app Stopping node rabbit@mq02 ...


节点复位

rabbitmqctl reset


[root@mq02 rabbitmq]# rabbitmqctl reset Resetting 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_app Starting node rabbit@mq02 ...


6。检查集群状态

查看节点2上的集群状态

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


查看节点1上的集群状态

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


7。更改节点类型

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


从上面的集群状态可以看出,mq01和mq02都是磁盘节点,可以通过命令进行访问

rabbitmqctl change_cluster_node_type disc


将mq02更改为内存节点

[root@mq02 ~]# rabbitmqctl stop_app Stopping node rabbit@mq02 ... [root@mq02 ~]#  rabbitmqctl change_cluster_node_type ram Turning 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,[]}]}]


也可以只使用-ram参数将mq02添加到集群中,即设置mq02为内存节点。

注意:在改变节点类型之前,必须停止noderabbitmq的应用。


8。验证节点在崩溃后恢复时是否可以自动加入集群

停止节点2mq02的服务,并检查节点1上的群集状态

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

查看节点1上的集群状态

[root@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。


启动节点2的服务

[root@mq02 ~]# /etc/init.d/rabbitmq-server start Starting rabbitmq-server: SUCCESS rabbitmq-server.

检查两台机器的集群状态。

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

停止和暂停节点rabbit@mq01...


登录rabbitmqweb管理控制台,创建新队列并报告错误。


还原节点1erlang虚拟机服务

[root@mq01~]#/etc/init.d/rabbitMQ-服务器启动

启动rabbitmq-server:成功

rabbitMQ-服务器。

重新创建队列,成功



10。当磁盘节点挂起时

停止节点2erlang虚拟机

[root@mq02~]#rabbitmqctlstop

停止和暂停节点rabbit@mq02...

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

总结:

根据9和10的测试,如果集群中没有磁盘节点,集群无法创建新的队列元数据,但仍然可以工作。如果内存在某个点挂起,集群不会受到影响,这也是为什么集群中必须至少有一个磁盘节点,不能将单个节点设置为内存节点的原因。



十一。集群镜像模式

上面的集群模式是正常模式,镜像模式是在正常模式的基础上加上一些策略。它的本质不同于普通模式,因为消息实体将在镜像节点之间主动同步,而不是在消费者获取数据时临时拉取数据。这种模式带来的副作用也很明显。除了降低系统性能,如果镜像队列太多,大量消息进来,集群内部的网络带宽也会被这种同步通信大量消耗。因此适用于可靠性要求高的场合。如果一个队列希望成为镜像队列,则必须首先设置策略。然后,当客户端创建队列时,rabbitmqcluster会根据“队列名”自动将其设置为普通集群模式或镜像队列。如下所示:

通过队列策略启用镜像。策略可以随时改变,rabbitmq队列很可能会随着策略的改变而改变队列。非镜像队列和镜像队列是有区别的。前者缺少额外的镜像基础设施,也没有任何从设备,因此运行速度会更快。为了使队列称为镜像队列,您将创建一个策略来匹配该队列。有两个键用于设置策略“ha-mode和ha-params(可选)”。Ha-params根据Ha模式设置不同的值。下表描述了这些键的选项:


解释语法:

在集群中的任意节点启用策略,策略会自动同步到集群节点
rabbitmqctlset_policy-phrsystemha-allqueue""{"ha-mode":"all"}'
该命令在vhost中创建一个名称为HRsystem的策略。策略名为ha-allqueue,策略模式为all,即复制到所有节点,包括新添加的节点。策略正则表达式是“”,这意味着所有匹配的队列名称。
比如rabbitmqctlset_policy-pHRsystemha-allqueue"message"'{"ha-mode":"all"}'
注意:这个"message"的规则要根据自己修改。这是指以“message”开头的队列的名称。我们的配置中使用的适用于所有队列,因此表达式为""
See
set_policy[-pvhostpath]{name}{pattern}{definition}[priority]
(http://www.rabbitmq.com/man/rabbitmqctl.1.man.html)


创建策略

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_policies Listing policies ... /       ha-all  all     ^       {"ha-mode":"all"}       0

注意:如果在创建策略时没有指定vhost,您将为默认/虚拟主机创建策略。



12。将节点移出群集

在将node2移出集群之前,您需要首先停止_app,然后重置该节点。

[root@mq02 ~]# rabbitmqctl stop_app Stopping node rabbit@mq02 ... [root@mq02 ~]# rabbitmqctl reset Resetting node rabbit@mq02 ... [root@mq02 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq02]}]},{alarms,[]}]


查看节点1上的集群状态

[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


删除远程脱机的节点

 rabbitmqctl forget_cluster_node rabbit@mq02


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

注意:只有当远程节点脱机时,才可以执行此命令来删除节点。否则,报告一个错误。

1.停止节点2上的rabbitmq应用程序

[root@mq02 ~]# rabbitmqctl stop_app Stopping node rabbit@mq02 ...

2.在node1上执行deletenode命令,然后检查集群状态。

[root@mq01 ~]# rabbitmqctl forget_cluster_node rabbit@mq02 Removing 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 123456 Creating user "spms" ... [root@mq02 ~]# rabbitmqctl list_users Listing users ... spms    [] guest   [administrator] [root@mq01 ~]# rabbitmqctl list_users Listing users ... spms    [] guest   [administrator]

如您所见,在任何节点上创建的帐户都将与其他节点同步。


14。在集群中创建VHOST

rabbitmqctl add_vhost vhost_name

[root@mq01 ~]# rabbitmqctl add_vhost spms Creating vhost "spms" ... [root@mq01 ~]# rabbitmqctl list_vhosts Listing vhosts ... spms / [root@mq02 ~]# rabbitmqctl list_vhosts Listing 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_permissions Listing permissions in vhost "/" ... guest   .*      .*      .* [root@mq02 ~]# rabbitmqctl list_permissions -p spms Listing permissions in vhost "spms" ... spms    .*      .*      .* [root@mq01 ~]#  rabbitmqctl list_permissions Listing permissions in vhost "/" ... guest   .*      .*      .* [root@mq01 ~]#  rabbitmqctl list_permissions -p spms Listing permissions in vhost "spms" ... spms    .*      .*      .*


16.设置集群名称。

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






参考:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

http://www.rabbitmq.com/clustering.html



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/778023.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-03
下一篇2022-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存