Haproxy + RabbitMQ集群 Centos搭建及使用

RabbitMQ是一个免费的开源企业消息代理软件。 它是用Erlang编写的,并实现了高级消息队列协议(AMQP)。 它提供所有主要编程语言的客户端库。 它支持多种消息传递协议,消息队列,传送确认,灵活的路由到队列,多种交换类型。 它还提供易于使用的HTTP-API,命令行工具和用于管理RabbitMQ的Web UI;在本教程中,我们将在CentOS 7服务器上安装RabbitMQ。

环境

  • Centos7
  • Erlang 22.3
  • RabbitMQ 3.8.3
  • Haproxy 1.5.18

网络拓扑图

网络拓扑图

安装Erlang

Erlang安装包官网下载地址:https://www.erlang.org/downloads

1
2
3
4
5
wget http://erlang.org/download/otp_src_22.3.tar.gz
tar -zxvf otp_src_22.3.tar.gz
cd otp_src_22.3
./configure
make && make install

到此,Erlang安装完成,直接输入erl

1
2
3
4
5
[root@iz7ejqa3pg6fglz ~]# erl
Erlang/OTP 22 [erts-10.7] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]

Eshell V10.7 (abort with ^G)
1>

安装RabbitMQ Server

RabbitMQ官方下载地址:https://www.rabbitmq.com/install-rpm.html#downloads

我这里选择RPM for RHEL Linux 7.x, CentOS 7.x, Fedora 24+ (supports systemd)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.el7.noarch.rpm
#如果提示erlang >= 21.3 is needed by之类的信息,则试试在后面加上:--nodeps
#启动rabbitmq-server
systemctl start rabbitmq-server
# 后台启动rabbitmq服务
rabbitmq-server -detached
#查看状态
rabbitmqctl status
#列出用户
rabbitmqctl list_users
#添加用户
rabbitmqctl add_user admin admin
#设置用户类型
rabbitmqctl set_user_tags admin administrator
#重启rabbitmq-server
systemctl restart rabbitmq-server
#开启远程管理界面插件
rabbitmq-plugins enable rabbitmq_management
#启用了rabbitmq的管理插件,会有一个web管理界面,默认监听端口15672,将此端口在防火墙上打开,则可以访问web界面

集群配置

RabbitMQ利用erlang的分布式特性组建集群,erlang集群通过magic cookie实现,此cookie保存在$home/.erlang.cookie,这里即:/var/lib/rabbitmq/.erlang.cookie,需要保证集群各节点的此cookie一致,可以选取一个节点的cookie,采用scp同步到其余节点。

同步cookie

1
2
3
#注意.erlang.cookie文件的权限,rabbitmq账号,权限400或600即可,为组或other账号赋权会报错
[root@rmq-node1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@172.16.3.232:/var/lib/rabbitmq/
[root@rmq-node1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@172.16.3.233:/var/lib/rabbitmq/

配置hosts

1
2
3
#组建集群时采用”cluster@node”的格式,需要提前设置hosts文件;
#rmq-node2/3配置相同
[root@rmq-node1 ~]# echo -e "172.16.3.231 rmq-node1\n172.16.3.232 rmq-node2\n172.16.3.233 rmq-node3" >> /etc/hosts

使用-detached参数启动节点

1
2
3
#rmq-node2/3因更换了.erlang.cookie,使用此命令会无效并报错,可以依次采用“systemctl stop rabbitmq-server”停止服务,“systemctl start rabbitmq-server”启动服务,最后再“rabbitmqctl stop”
[root@rmq-node1 ~]# rabbitmqctl stop
[root@rmq-node1 ~]# rabbitmq-server -detached

组建集群(rmq-node2&rmq-node3)

组建集群(disk节点)
1
2
3
4
5
6
7
8
9
#“rabbitmqctl join_cluster rabbit@rmq-node1”中的“rabbit@rmq-node1”,rabbit代表集群名,rmq-node1代表集群节点(节点名同hostname,hostname与/etc/hosts中设置必须保持一致);rmq-node2与rmq-node3均连接到rmq-node1,它们之间也会自动建立连接。
#如果需要使用内存节点,增加一个”--ram“的参数即可,如“rabbitmqctl join_cluster --ram rabbit@rmq-node1”,一个集群中至少需要一个”disk”节点
[root@rmq-node2 ~]# rabbitmqctl stop_app
[root@rmq-node2 ~]# rabbitmqctl join_cluster rabbit@rmq-node1
[root@rmq-node2 ~]# rabbitmqctl start_app

[root@rmq-node3 ~]# rabbitmqctl stop_app
[root@rmq-node3 ~]# rabbitmqctl join_cluster rabbit@rmq-node1
[root@rmq-node3 ~]# rabbitmqctl start_app
修改disk节点到内存节点
1
2
3
4
#如果节点已是"disk"节点,可以修改为内存节点
[root@rmq-node3 ~]# rabbitmqctl stop_app
[root@rmq-node3 ~]# rabbitmqctl change_cluster_node_type ram
[root@rmq-node3 ~]# rabbitmqctl start_app

查看集群状态

1
rabbitmqctl cluster_status

集群状态

  1. 3个节点正常运行,其中rmq-node3是内存节点;
  2. 另外节点间的元数据也会同步,如前文只在rmq-node1节点创建的admin账号,此时也可在其他两个节点查询

但节点间的配置文件不会同步,如前文在rmq-node1节点允许的guest账号远程登录,此时其他节点的guest账号并不具备登录权限。

设置镜像队列高可用

到目前为止,集群虽然搭建成功,但只是默认的普通集群,exchange,binding等数据可以复制到集群各节点。

但对于队列来说,各节点只有相同的元数据,即队列结构,但队列实体只存在于创建该队列的节点,即队列内容不会复制(从其余节点读取,可以建立临时的通信传输)。

这样此节点宕机后,其余节点无法从宕机节点获取还未消费的消息实体。如果做了持久化,则需要等待宕机节点恢复,期间其余节点不能创建宕机节点已创建过的持久化队列;如果未做持久化,则消息丢失。

1
2
3
4
#任意节点执行均可如下命令:将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直;
#可通过命令查看:rabbitmqctl list_policies;
#镜像队列相关解释与设置&操作等请见:http://www.ywnds.com/?p=4741
[root@rmq-node1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

Haproxy安装

1
yum install haproxy

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
#绑定配置
listen rabbitmq_management
#配置TCP模式
mode http
#加权轮询
balance roundrobin
#访问端口
bind 0.0.0.0:16672
#RabbitMQ集群节点配置
server node1 x.x.x.x:15672 check inter 2000 rise 2 fall 3
server node1 x.x.x.x:15672 check inter 2000 rise 2 fall 3

listen rabbitmq
#配置TCP模式
mode tcp
#加权轮询
balance roundrobin
#访问端口
bind 0.0.0.0:6672
#RabbitMQ集群节点配置
server node1 x.x.x.x:5672 check inter 5s rise 2 fall 3

#haproxy监控页面地址
listen admin_stats
bind *:8100
mode http
option httplog
stats enable
stats refresh 5s
log 127.0.0.1 local3 err
stats uri /
stats realm welcome login\ Haproxy
stats auth admin:admin
stats hide-version
stats admin if TRUE

启动Haproxy

1
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg

关于RabbitMQ还想提几点,队列有。1.单机模式,2.普通模式集群,3.镜像队列,在普通模式上搭建起来的镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作,在 某台 rabbitmq节点上,执行 : rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’ 可以把队列设置为镜像队列

参考:

0%