您的位置:首页 > 运维架构 > Linux

RabbitMQ集群搭建

2018-01-09 21:01 239 查看

前言

  我们希望建立高可用的队列,以及高性能的队列,但是,我们这次的重点是高可用。RabbitMQ集群可以通过增加节点来增加性能,但是,默认是不会将队列的内容复制到整个集群的。

  磁盘节点会保存集群中所有的队列、交换器、绑定、用户、权限和vhost的元数据,但是队列的内容仅在对应的节点中,如果该节点崩溃则队列不可用(持久化队列,内存队列可以重建,但消息会丢失)。如果集群中只有一个磁盘节点,并且该磁盘节点崩溃,则集群可以正常收发消息,但是不可以变更元数据。复制队列中的数据,需要使用镜像队列。

  一个集群中如果仅有一个磁盘节点,则磁盘节点崩溃会导致集群无法变更。如果队列没有镜像队列,则节点崩溃后其承载的队列无法访问(持久化队列,考虑到可靠性,我们会全部使用持久化队列)。所以,我们这次的集群配置是,两个磁盘节点,所有队列均为镜像队列。

集群搭建

  两个服务器分别安装RabbitMQ,安装过程见:http://blog.csdn.net/linghuanxu/article/details/78608369 本地搭建版本rabbitmq-server-3.6.14-1.el7.noarch.rpm 操作系统,centos7-1708

  我们这里是每台虚拟机建立一个rabbitmq集群,就不介绍单台虚拟机启动三个进程的方式了

1、 统一erlang cookie 我们将1节点的erlang cookie复制到二节点中。Erlang cookie就是/var/lib/rabbitmq/.erlang.cookie这个文件中的内容。要注意的是,这是一个只读文件,要先修改权限,改完了之后记得把权限改回来(chmod 400 文件名)

2、 修改机器名,以及对应的hosts指向,因为rabbitmq节点的名称是rabbit@机器名的,而它会根据机器名去寻找对应的节点,所以,我们这里需要让它在找机器名的时候可以找到。修改/etc/hostname,在/etc/hosts中的127.0.0.1 中添加自己机器名,并对每个需要的机器名配置局域网IP的hosts指向,我的是

192.168.137.98 nature_rabbitmq1
192.168.137.97 nature_rabbitmq2


  然后重启虚拟机,这个操作重启mq貌似是无效的,原因现在暂未探查,但是,重启虚拟机后就一切正常了

  

3、配置节点。先启动每个节点

rabbitmqctl stop
rabbitmq-server -detached


然后可以用rabbitmqctl cluster_status查看集群状态。然后我们把nature_rabbitmq2加入到nature_rabbitmq1中。在nature_rabbitmq2的机器上执行:

rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@ nature_rabbitmq1 //这个名称在nature_rabbitmq1这该机器上查询状态能看到,也可以在后面加如—disk参数,就不用进行第四步了
rabbitmqctl start_app


  然后再查看集群状态就可以看到两边都有对方节点了,但是nature_rabbitmq2似乎和nature_rabbitmq1不一样,因为这个时候nature_rabbitmq2是内存节点

4、 修改队列类型。默认加入集群的是内存节点,我们需要的是双磁盘节点

rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
rabbitmqctl start_app


  再查看集群状态,就可以看到两边一模一样了

rabbitmq-server -detached  //集群启动命令


两个mq之间队列、交换器以及消息是否同步

消息记录表rabbitmq_record

  该表是为了记录消息及接收消息状态而设计的表,发送消息前在数据库中进行记录。接收数据后增加一次接收次数

id:唯一记录ID
receive_time: 接收的次数
createtime:创建时间
updatetime:更新时间
recore_type:测试类型
remark:记录备注,可以详细解释说明测试类型


测试1

  向nature_rabbitmq1中发送消息,从nature_rabbitmq2中订阅消息,如果可以订阅到,则说明镜像队列之间消息是同步的,队列也在两个节点质检同步创建了。

测试2

  向nature_rabbitmq1发送事件,从nature_rabbitmq2中消息,两个订阅者,两个订阅者应该均收到消息。如果可以订阅到,则说明镜像队列之间消息是同步的,交换器也在两个节点质检同步创建了。

搭建Nginx负载均衡

  Nginx 1.9之后提供了和http模块平级的stream模块,可以做tcp的负载均衡,默认是不会安装的,需要重新编译nginx

./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --with-stream
make
make install
nginx –t


配置如下:

stream {
upstream rabbitmq {
server 192.168.137.98:5672;
server 192.168.137.97:5672;
}
server {
listen 5673;
proxy_pass rabbitmq;
}
}

http {…}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息