rabbitmq集群

2019-10-05 17:35:00
aolens
原创
463
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方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。


环境准备
dev01:192.168.0.15
dev02:192.168.0.20
路径:/home/rabbitmq/
rabbitmq  erlang的版本
erlang-22.1.1-1.el7.x86_64.rpm  
rabbitmq-server-3.7.19-1.el7.noarch.rpm
安装:
yum install socat -y
rpm -ivh erlang-22.1.1-1.el7.x86_64.rpm
rpm -ivh rabbitmq-server-3.7.19-1.el7.noarch.rpm


安装启动过程中如果出现error,那可参考下面几个方案试试:

vim /etc/rabbitmq/enable_plugins :删除文件中的内容。
查看hosts文件是否配置完善,相互是否可以ping通
查看相关端口是否被占用,如若占用kill掉
如果已经集群,那么要查看所有集群中的/var/lib/rabbitmq/.erlang.cookie是否一致。
如果不存在上述文件,echo $HOME ,打开此文件夹,查看cookie文件是否一致。
重启电脑,防止缓存数据配置未更新过来。
常用操作:



[root@dev01 bin]# ./rabbitmq-server -deched  --后台启动服务
[root@dev01 bin]# ./rabbitmqctl start_app  --启动服务
[root@dev01 bin]# ./rabbitmqctl stop_app  --关闭服务
[root@dev01 bin]# ./rabbitmq-plugins enable rabbitmq_management --启动web管理插件
[root@dev01 bin]# ./rabbitmqctl add_user zlh zlh  --添加用户,密码
[root@dev01 bin]# ./rabbitmqctl set_user_tags zlh administrator --设置zlh为administrator权限
安装rabbitmq plugin 插件


[root@dev02 /home/rabbitmq]# rabbitmq-plugins enable amqp_client rabbitmq_management rabbitmq_management_agent
Enabling plugins on node rabbit@dev02:
amqp_client
rabbitmq_management
rabbitmq_management_agent
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@dev02...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

set 3 plugins.
Offline change; changes will take effect at broker restart.
[root@dev02 /home/rabbitmq]# rabbitmq-server -deched

  ##  ##
  ##  ##      RabbitMQ 3.7.19. Copyright (C) 2007-2019 Pivotal Software, Inc.
  ##########  Licensed under the MPL.  See https://www.rabbitmq.com/
  ######  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@dev02.log
                    /var/log/rabbitmq/rabbit@dev02_upgrade.log

              Starting broker...
 completed with 3 plugins.


搭建rabbitmq的一般模式集群

在上述的两台机器上安装rabbitmq完成之后,你可以看到你的机器中有如下1个文件。路径在$HOME中或者在/var/lib/rabbitmq中,文件名称为.erlang.cookie,他是一个隐藏文件

rabbitmq集群依赖erlang的集群。erlang是通过cookie值一致,且权限owner只读

复制dev01上的/var/lib/rabbitmq/.erlang_cookie 到dev02

修改dev01/dev02的权限
chmod 600 .erlang.cookie
在dev01上停止服务
rabbitmqctl stop_app
把dev02上的rabbitmq添加进集群来
rabbitmqctl join_cluster --ram rabbit@dev02
启动rabbitmq的服务
rabbitmqctl start_app
查看rabbitmqctl cluster_status 
[root@dev01 /var/lib/rabbitmq]# rabbitmqctl cluster_status 
Cluster status of node rabbit@dev01 ...
[{nodes,[{disc,[rabbit@dev02]},{ram,[rabbit@dev01]}]},
 {running_nodes,[rabbit@dev02,rabbit@dev01]},
 {cluster_name,<<"rabbit@dev01">>},
 {partitions,[]},
 {alarms,[{rabbit@dev02,[]},{rabbit@dev01,[]}]}]


搭建rabbitmq的镜像高可用模式集群

参考文章:http://www.rabbitmq.com/ha.html

首先镜像模式要依赖policy模块,这个模块是做什么用的呢?

policy中文来说是政策,策略的意思,那么他就是要设置,那些Exchanges或者queue的数据需要复制,同步,如何复制同步?对就是做这些的。

这里有点内容的,我先上例子慢慢说:


rabbitmqctl set_policy --vhost /inf-rpc ha-all "^" '{"ha-mode":"all"}'
下面是一个政策,队列的名字从“two.”镜像集群中的任意两个节点,自动同步:
rabbitmqctl
rabbitmqctl set_policy ha-two "^two\." \
  '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
rabbitmqctl (Windows)
rabbitmqctl set_policy ha-two "^two\." ^
   "{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}"
HTTP API
PUT /api/policies/%2f/ha-two
{
  "pattern":"^two\.",
  "definition": {
    "ha-mode":"exactly",
    "ha-params":2,
    "ha-sync-mode":"automatic"
  }
}
Web UI
Navigate to Admin > Policies > Add / update a policy.
Enter "ha-two" next to Name and "^two\." next to Pattern.
Enter "ha-mode" = "exactly" in the first line next to Policy, then "ha-params" = 2 in the second line, then "ha-sync-mode" = "automatic" in the third, and set the type on the second line to "Number".
Click Add policy.
下面的示例声明了一个名为ha-all的政策匹配的队列的名字从“ha-all”。并配置镜像到集群中的所有节点
rabbitmqctl
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
rabbitmqctl (Windows)
rabbitmqctl set_policy ha-all "^ha\." "{""ha-mode"":""all""}"
HTTP API
PUT /api/policies/%2f/ha-all {"pattern":"^ha\.", "definition":{"ha-mode":"all"}}
Web UI
Navigate to Admin > Policies > Add / update a policy.
Enter "ha-all" next to Name, "^ha\." next to Pattern, and "ha-mode" = "all" in the first line next to Policy.
Click Add policy.
一个政策,队列的名字开始“nodes”。是反映特定集群中的节点:
rabbitmqctl
rabbitmqctl set_policy ha-nodes "^nodes\." \
'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
rabbitmqctl (Windows)
rabbitmqctl set_policy ha-nodes "^nodes\." ^
"{""ha-mode"":""nodes"",""ha-params"":[""rabbit@nodeA"", ""rabbit@nodeB""]}"
HTTP API
PUT /api/policies/%2f/ha-nodes
{"pattern":"^nodes\.", "definition":{"ha-mode":"nodes", "ha-params":["rabbit@nodeA", "rabbit@nodeB"]}
Web UI
Navigate to Admin > Policies > Add / update a policy.
Enter "ha-nodes" next to Name and "^nodes\." next to Pattern.
Enter "ha-mode" = "nodes" in the first line next to Policy, then "ha-params" in the second line, set the second line's type to "List", and then enter "rabbit@nodeA" and "rabbit@nodeB" in the sublist which appears.
Click Add policy.