RabbitMQ集群+Haproxy部署for Centos7

RabbitMQ专有名词

1
2
3
4
5
6
7
8
producer:		生产者,是消息产生的源头。
consumer: 消费者,连接到队列并取走消息的客户端。
queues: 队列,装载消息的缓存容器。
exchange: 交换机,可以理解为具有路由表的路由规则。
exchange type: 交换机类型
channel: 通道,amqp支持一个tcp连接上启用多个mq通信通道,每个通道都可以被作为通信流。

bind: 绑定,实际上可以理解为交换机的路由规则。每个消息都有一个称为路由键的属性(routing key),就是一个简单的字符串。一个绑定将【交换机,路由键,消息送达队列】三者绑定在一起,形成一条路由规则。

RabbitMQ集群模式

1)单机模式:最简单的模式,非集群模式,没什么好说的,就是一台机器部署多个RabbitMQ服务
2)普通模式:默认的集群模式,官方说明:http://www.rabbitmq.com/clustering.html

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

3)镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的高可用方案,官方说明:http://www.rabbitmq.com/ha.html

该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

RabbitMQ集群节点类型

1
2
1)内存节点(RAM):内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中
2)磁盘节点(Disk):将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。

注意:

1
2
3
1)RabbitMQ要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复, 或者可以设置两个磁盘节点,以保持有一个是可用的。
2)内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。
3)如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

RabbitMQ集群部署思路

1
2
3
1)首先搭建RabbitMQ集群的普通模式
2)在普通模式的基础上再配置镜像模式实现高可用
3) 内存节点无疑速度更快,因此我们在集群前增加haproxy做负载均衡,让客户端 (consumer、producer)连接访问内存节点,而磁盘模式的节点,由于磁盘IO相对较慢,因此仅做数据备份使用

RabbitMQ集群镜像模式+Haproxy拓扑

PjkYUH.png

软件包版本

1
2
3
otp_src_20.2.tar.gz
rabbitmq-server-generic-unix-3.7.0.tar.xz
haproxy-1.7.9.tar.gz

RabbitMQ集群普通模式环境准备

1
2
3
4
IP地址				  	  主机名
192.168.10.144 rabbitram1
192.168.10.141 rabbitram2
192.168.10.21 rabbitdisk

RabbitMQ集群普通模式部署

该集群模式中,有三台机器,其中一台使用磁盘节点,另两台使用内存节点

Centos7永久修改主机名:hostnamectl set-hostname rabbitram1

第一步:在三台节点服务器中,分别修改/etc/hosts文件

1
2
3
192.168.10.144  rabbitram1
192.168.10.141 rabbitram2
192.168.10.21 rabbitdisk

第二步:三台节点服务器分别安装RabbitMQ-Server,安装后分别启动RabbitMQ-Server

(安装步骤省略)

第三步:设置每个节点Cookie

Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。

我的这个cookie是存放在/root/目录下的,文件的权限是400权限,我们将其中一台机器的cookie文件scp到别的机器即可,拷贝完成后重启下RabbitMQ,别忘记设置cookie的权限也要一样是400,否则可能会遇到错误

PjAVQP.png

1
2
scp /root/.erlang.cookie root@192.168.10.144:/root/.erlang.cookie
scp /root/.erlang.cookie root@192.168.10.141:/root/.erlang.cookie

1
2
chmod 400 /root/.erlang.cookie
chmod 400 /root/.erlang.cookie

重启所有节点

1
2
3
systemctl restart rabbitmq
systemctl restart rabbitmq
systemctl restart rabbitmq

查看所有节点状态

1
systemctl status rabbitmq

PjAeL8.png

第四步:将rabbitram1、rabbitram2作为内存节点与rabbitdisk连接起来

在rabbitram1和rabbitram2上分别执行:

1
rabbitmqctl stop_app

PjAlJs.png

1
rabbitmqctl join_cluster --ram rabbit@rabbitdisk

PjA3zq.png

1
rabbitmqctl start_app

PjAJyV.png

第五步:查看一下集群状态

方法一:web界面查看IP:15672

PjAUwF.png

方法二:三台主机上分别rabbitmqctl cluster_status查看

PjAao4.png

到此RabbitMQ集群的普通模式部署完成

RabbitMQ集群镜像模式部署

上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。镜像模式和普通模式之间相对比,镜像模式提供高可用性,普通模式会提供更高的吞吐量。我们看看如何配置镜像模式来解决复制的问题,从而提高可用性

接着上边的继续部署即可。

第一步:增加Haproxy负载均衡器

互联网公司常用的软件LB一般有LVS、HAProxy、Nginx等。LVS是一个内核层的产品,主要在第四层负责数据包转发,使用较复杂。HAProxy和Nginx是应用层的产品,但Nginx主要用于处理HTTP,所以这里选择HAProxy作为RabbitMQ前端的LB。

1、增加一台机器作为负载均衡器:192.168.10.27
2、创建源码目录
1
2
mkdir -p /a01/apps/apps_src
cd /a01/apps/apps_src/
3、解压
1
2
tar -zxvf haproxy-1.7.9.tar.gz
cd haproxy-1.7.9
4、查看内核
1
2
uname -r
2.6.32-431.el6.x86_64
5、make
1
make TARGET=linux26 PREFIX=/a01/apps/haproxy && echo $?
6、make install
1
make install PREFIX=/a01/apps/haproxy && echo $?
7、创建软链接
1
ln -s /a01/apps/haproxy/sbin/haproxy /usr/local/sbin/
8、配置全局变量
1
2
echo "PATH=$PATH:/a01/apps/haproxy/sbin" >> /etc/profile
source /etc/profile
9、查看Haproxy版本
1
haproxy -v

PjABWR.png

10、创建Haproxy用户
1
useradd -M -s /sbin/nologin haproxy
11、配置Haproxy服务启动文件
1
2
3
cp /a01/apps/apps_src/haproxy-1.7.9/examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy
vim /etc/init.d/haproxy

PjAgeO.png

12、Haproxy加入系统服务开机自启
1
2
chkconfig --add haproxy
chkconfig haproxy on
13、手动编写Haproxy配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
mkdir -p /etc/haproxy
vim /etc/haproxy/haproxy.cfg

global
log 127.0.0.1 local0
maxconn 204800
chroot /a01/apps/haproxy
user haproxy
group haproxy
daemon
nbproc 1
pidfile /var/run/haproxy.pid
stats socket /a01/apps/haproxy/stats
description haproxy server

defaults
log global
log 127.0.0.1 local3
mode http
maxconn 10000
option httplog
option httpclose
option dontlognull
option forwardfor except 127.0.0.0/8
retries 3
option redispatch
option abortonclose
balance roundrobin
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s


listen admin_stats
bind *:9188
mode http
log 127.0.0.1 local3 err
stats refresh 60s
stats uri /haproxy_status
stats realm welcome login\ Haproxy
stats auth nong:123456
stats hide-version
stats admin if TRUE

listen rabbitmq_cluster
bind *:5672
mode tcp
balance roundrobin
server rabbitram1 192.168.10.144:5672 check inter 2000 rise 2 fall 3 weight 1
server rabbitram2 192.168.10.141:5672 check inter 2000 rise 2 fall 3 weight 1

负载均衡器会监听5672端口,轮询我们的两个内存节点192.168.10.144和192.168.10.141的5672端口,192.168.10.21为磁盘节点。只做备份不提供给生产者、消费者使用。

14、启动Haproxy
1
service haproxy start
15、查看一下Haproxy监听端口
1
netstat -anupt | grep haproxy

PjAfFH.png

16、访问一下Haproxy健康检测页面

PjAolt.png

第二步:配置策略

使用Rabbit镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改集群范围的某个vhost队列行为和Exchange行为

在cluster中任意节点启用策略,策略会自动同步到集群节点

下边来配置策略,策略名称为ha-all,通配符^表示匹配到的所有队列,复制到所有节点:

1
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

PjAq0S.png

也可以复制匹配到的队列到集群中的任意两个或多个节点,而不是到所有节点,并进行自动同步:

1
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

或者复制匹配到的队列到集群中的指定节点:

1
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"nodes","ha-params":["rabbit@rabbitram1","rabbit@rabbitram2"]}'

第三步:添加一个queues队列来看看效果

访问我们的rabbitmq网页管理端Queues菜单,然后Add a new queue

PjALTg.png

添加:

PjAvfs.png

刷新一下查看结果

PjAzpn.png

PjESlq.png

博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%