1: rabbitMQ的集群部署,以及通过使用keepalived+haproxy作为反向代理访问rabbitMQ,从而实现负载均衡及高可用,具体配置如下:
172.20.8.100 rabbitmq-server1
172.20.8.101 rabbitmq-server2
172.20.8.102 rabbitmq-server3
2: 各rabbitMQ服务器更改hosts文件:
[root@rabbitmq-server1 ~]# vim /etc/hosts
172.20.8.100 rabbitmq-server1
172.20.8.101 rabbitmq-server2
172.20.8.102 rabbitmq-server3
3: 各rabbitMQ服务器安装并启动rabbitMQ服务:
[root@rabbitmq-server1 ~]# yum install rabbitmq-server
[root@rabbitmq-server1 ~]# systemctl start rabbitmq-server
[root@rabbitmq-server1 ~]# rabbitmq-plugins enable rabbitmq_management #开启web管理界面插件
[root@rabbitmq-server1 ~]# systemctl restart rabbitmq-server #重启rabbitMQ服务
4: 常用命令:
[root@rabbitmq-server1 ~]# rabbitmqctl add_vhost xxx #创建vhost
Creating vhost "xxx" ...
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl list_vhosts #遍历所有vhost信息
Listing vhosts ...
/
xxx
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl delete_vhost xxx #删除vhost
Deleting vhost "xxx" ...
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl add_user test 123456 #添加用户test密码为123456
Creating user "test" ...
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl change_password test 654321 #更改test用户的密码为654321
Changing password for user "test" ...
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl set_permissions -p xxx test ".*" ".*" ".*" #绑定test用户对xxx的vhost的读写权限
Setting permissions for user "test" in vhost "xxx" ...
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl list_queues #列出所有队列
Listing queues ...
...done.
5: 访问web界面:默认用户名为guest密码为guest
6 :部署rabbitMQ集群:
[root@rabbitmq-server1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 172.20.8.101:/var/lib/rabbitmq/.erlang.cookie
root@172.20.8.101's password:
.erlang.cookie 100% 20 0.0KB/s 00:00
[root@rabbitmq-server1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 172.20.8.102:/var/lib/rabbitmq/.erlang.cookie
root@172.20.8.102's password:
.erlang.cookie 100% 20 0.0KB/s 00:00
7: 各节点重启rabbitMQ服务并验证端口:
[root@rabbitmq-server1 ~]# systemctl restart rabbitmq-server
[root@rabbitmq-server2 ~]# systemctl restart rabbitmq-server
[root@rabbitmq-server3 ~]# systemctl restart rabbitmq-server
5672:消费者访问的 端口
15672:web管理端口
25672:集群状态通信端口
8:停止所有节点RabbitMq服务,然后使用detached参数独立运行,这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可以参照这个顺序
[root@rabbitmq-server1 ~]# systemctl stop rabbitmq-server
[root@rabbitmq-server2 ~]# systemctl stop rabbitmq-server
[root@rabbitmq-server3 ~]# systemctl stop rabbitmq-server
[root@rabbitmq-server1 ~]# rabbitmq-server -detached
[root@rabbitmq-server2 ~]# rabbitmq-server -detached
[root@rabbitmq-server3 ~]# rabbitmq-server -detached
9: 查看各rabbitMQ服务的集群状态:
[root@rabbitmq-server1 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbitmq-server1' ...
[{nodes,[{disc,['rabbit@rabbitmq-server1']}]},
{running_nodes,['rabbit@rabbitmq-server1']},
{cluster_name,<<"rabbit@rabbitmq-server1">>},
{partitions,[]}]
...done.
[root@rabbitmq-server2 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbitmq-server2' ...
[{nodes,[{disc,['rabbit@rabbitmq-server2']}]},
{running_nodes,['rabbit@rabbitmq-server2']},
{cluster_name,<<"rabbit@rabbitmq-server2">>},
{partitions,[]}]
...done.
[root@rabbitmq-server3 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbitmq-server3' ...
[{nodes,[{disc,['rabbit@rabbitmq-server3']}]},
{running_nodes,['rabbit@rabbitmq-server3']},
{cluster_name,<<"rabbit@rabbitmq-server3">>},
{partitions,[]}]
...done.
10:将rabbitMQ的节点添加到集群,在rabbitmq-server1作为内存节点连接起来,并作为内存节点,在rabbitmq-server1执行以下命令:
[root@rabbitmq-server1 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbitmq-server1' ...
[{nodes,[{disc,['rabbit@rabbitmq-server1']}]},
{running_nodes,['rabbit@rabbitmq-server1']},
{cluster_name,<<"rabbit@rabbitmq-server1">>}, #未添加到集群之前只有自己一台节点
{partitions,[]}]
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl stop_app #停止应程序
[root@rabbitmq-server1 ~]# rabbitmqctl reset #清空元数据
[root@rabbitmq-server1 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-server2 --ram #将rabbitmq-server1添加到集群当中,并成为内存节点,不加--ram默认是磁盘节点
Clustering node 'rabbit@rabbitmq-server1' with 'rabbit@rabbitmq-server2' ...
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbitmq-server1' ...
[{nodes,[{disc,['rabbit@rabbitmq-server2']}, #默认是磁盘节点
{ram,['rabbit@rabbitmq-server1']}]}] #内存节点
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl start_app #不要忘记启动应用程序
Starting node 'rabbit@rabbitmq-server1' ...
...done.
[root@rabbitmq-server1 ~]# rabbitmqctl cluster_status #添加之后的集群状态
Cluster status of node 'rabbit@rabbitmq-server1' ...
[{nodes,[{disc,['rabbit@rabbitmq-server2']}, #默认的是磁盘节点
{ram,['rabbit@rabbitmq-server1']}]}] #自己被添加为内存节点
...done.
11: 将rabbitmq-server3添加到集群:
[root@rabbitmq-server3 rabbitmq]# rabbitmqctl cluster_status #未添加到集群之后只有自己一个节点
Cluster status of node 'rabbit@rabbitmq-server3' ...
[{nodes,[{disc,['rabbit@rabbitmq-server3']}]},
{running_nodes,['rabbit@rabbitmq-server3']},
{cluster_name,<<"rabbit@rabbitmq-server3">>},
{partitions,[]}]
...done.
[root@rabbitmq-server3 rabbitmq]# rabbitmqctl stop_app #停止应用程序
Stopping node 'rabbit@rabbitmq-server3' ...
...done.
[root@rabbitmq-server3 rabbitmq]# rabbitmqctl reset #重设元数据
Resetting node 'rabbit@rabbitmq-server3' ...
...done.
[root@rabbitmq-server3 rabbitmq]# rabbitmqctl join_cluster rabbit@rabbitmq-server2 --ram #添加到集群当中并设置为内存节点
Clustering node 'rabbit@rabbitmq-server3' with 'rabbit@rabbitmq-server2' ...
...done.
[root@rabbitmq-server3 rabbitmq]# rabbitmqctl start_app #驱动应用程序
Starting node 'rabbit@rabbitmq-server3' ...
...done.
[root@rabbitmq-server3 rabbitmq]# rabbitmqctl cluster_status #查看集群状态
Cluster status of node 'rabbit@rabbitmq-server3' ...
[{nodes,[{disc,['rabbit@rabbitmq-server2']}, #一个磁盘节点,集群当中最少有一个磁盘节点用于消息的持久化
{ram,['rabbit@rabbitmq-server3','rabbit@rabbitmq-server1']}]}, #两个内存节点
{running_nodes,['rabbit@rabbitmq-server1','rabbit@rabbitmq-server2', #当前正在运行的节点
'rabbit@rabbitmq-server3']},
{cluster_name,<<"rabbit@rabbitmq-server2">>}, #集群名称
{partitions,[]}]
...done.
12:更改为镜像模式,只要在其中一台节点执行以下命令即可:
[root@rabbitmq-server1 ~]# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}' #"#"为任意0个或多个即为所有,也可以使用"^test"匹配开头,还可以使用其他正则匹配
Setting policy "ha-all" for pattern "#" to "{\"ha-mode\":\"all\"}" with priority "0" ...
...done.
13: 在任意一台节点的管理界面创建一个queue,验证是可以同步到其他节点:
14:在其他rabbitMQ节点进行验证queue是否存在:
15: 使用命令也可以验证:
[root@rabbitmq-server1 ~]# rabbitmqctl list_queues
Listing queues ...
test 0
test1 0
test2 0
...done.
16: 通过haproxy 实现反向代理:
[root@rabbitmq-server3 ~]# cat /etc/haproxy/haproxy.cfg
global
maxconn 100000
uid 99
gid 99
daemon
nbproc 1
log 127.0.0.1 local0 info
defaults
option http-keep-alive
#option forwardfor
maxconn 100000
mode tcp
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen rabbitmq 0.0.0.0:5671
mode tcp
log global
balance roundrobin
server rabbitmq1 172.20.8.100:5672 check inter 2000 rise 3 fall 3
server rabbitmq2 172.20.8.101:5672 check inter 2000 rise 3 fall 3
server rabbitmq3 172.20.8.102:5672 check inter 2000 rise 3 fall 3
listen rabbitmq_cluster 0.0.0.0:15671
mode tcp
log global
balance roundrobin
server rqslave1 172.20.8.100:15672 check inter 2000 rise 3 fall 3
server rqslave2 172.20.8.101:15672 check inter 2000 rise 3 fall 3
server rqslave3 172.20.8.101:15672 check inter 2000 rise 3 fall 3