RabbitMQ 集群过程中,找到了一些资料。看的不是很明白,所以在这里对这些资料进行验证并一步步进行整理。

 

说明

我在虚拟机中的Cent OS 7系统安装了RabbitMQ-Server的服务, 在之前一章中进行了整理:《CentOS7 erlang RabbitMQ 安装并且配置远程访问》,然后对该虚拟机进行了复制,同时运行了2个虚拟机,接下来是对系统的一些配置介绍以及操作

 

严重的问题: 安装好的RabbitMQ 最好不要采用复制形式,会找不到自己的Rabbit Name 以及 PID的。

所以,两个系统, 每个系统都是要安装的。

 

介绍

 

单一模式:最简单的情况,非集群模式。没什么好说的。

普通模式:默认的集群模式。对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的Queue中后,consumer从B节点拉取时,rabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,然后就没有然后了……

镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于rabbitMQ的HA方案。该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用(后面会详细介绍这种模式,目前我们搭建的环境属于该模式)了解集群中的基本概念:rabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。不过,如前文所述,如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。一个rabbitMQ集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的,一个例外是,那些当前只属于创建它的节点的消息队列,尽管它们可见且可被所有节点读取。rabbitMQ节点可以动态的加入到集群中,一个节点它可以加入到集群中,也可以从集群环集群会进行一个基本的负载均衡。

 

 

集群中有两种节点:

内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk)

磁盘节点:保存状态到内存和磁盘。内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了 如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

 

 

 

集群配置

我们这边有两台服务器,hostname分别为:rabbit181(192.168.1.181)、rabbit162(192.168.1.162)。

 

 

配置步骤如下:

1.   rabbit181和rabbit162做为rabbitMQ集群节点,分别安装rabbitMQ-Server ,安装后分别启动rabbitMQ-server

2.   在安装好的两台节点服务器中,分别修改/etc/hosts文件,指定rabbit181和rabbit162的hosts:192.168.1.181 rabbit181 192.168.1.162 rabbit162 

 

3.   还有hostname文件也要正确,分别是rabbit181和rabbit162,如果修改hostname建议安装rabbitMQ前修改。请注意rabbitMQ集群节点必须在同一个网段里,如果是跨广域网效果就差。

修改hostname的方法:

 

a)   启用root用户

运行命令 sudo passwd root 为root用户设置密码

b)   以root用户身份登录

c)   编辑文件/etc/hosts 将下面的一行

127.0.1.1   替换为 127.0.1.1  

d)   编辑 /etc/hostname文件 删除该文件的所有内容,添加newhostname

e)   运行一下命令 hostname newhostname

f)   退出root用户 改用一般用户登录即可

 

注: 我是临时做测试, 没有永久修改,而是用临时修改方法

a)hostname rabbit181

b)su

两条命令完成

 

 

 

4.   设置每个节点Cookie:rabbitMQ的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitMQ/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。将其中一台节点上的.erlang.cookie值复制下来保存到其他节点上,要注意文件的权限和属主属组。先修改下.erlang.cookie权限:

#chmod 777  /var/lib/rabbitMQ/.erlang.cookie

复制完后重启下rabbitMQ。

复制好后别忘记还原.erlang.cookie的权限,否则可能会遇到错误:

#chmod 400 /var/lib/rabbitMQ/.erlang.cookie
设置好cookie后先将三个节点的rabbitMQ重启:
# rabbitmqctl stop
# rabbitMQ-server start
 注:由于我系统下的.erlang.cookie  在root下, 所以我要去root根目录下  我在 /var/lib/找不到rabbitMQ 所以我检索了下系统,看这个文件实在哪
find / -name .erlang.cookie
用这条命令查看到了文件位置,然后在执行修改该文件权限
 
 
 
5.   停止所有节点rabbitMQ服务,然后使用detached参数独立运行,这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可以参照这个顺序:
rabbit@rabbit162# rabbitmqctl stop
rabbit@rabbit162# rabbitMQ-server –detached
 
 
 
6.   将rabbit181和rabbit162连接起来,执行如下命令:
rabbit@rabbit162# rabbitmqctl stop_app
rabbit@rabbit162# rabbitmqctl reset
rabbit@rabbit162# rabbitmqctl cluster rabbit@rabbit3 rabbit@rabbit1   
rabbit@rabbit162# rabbitmqctl start_app

 

7. 设置镜像队列策略

在任意一个节点上执行:
 

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。

 

 

完成这 7 个步骤后,RabbitMQ 高可用集群就已经搭建好了