MessageQueue-RabbitMQ-02-RabbitMQ-Cluster
前置条件
- CentOS7:2009
- 保证需要部署的这几个节点在同一个局域网内
- 需要有相同的Erlang Cookie,否则不能进行通信,为保证cookie的完全一致,采用从一个节点copy的方式
环境
Socat:1.7.3.2-2.el7
Erlang:R16B03-1
RabbitMQ:3.3.5
VIP(虚拟IP):172.16.120.132
服务器:
主机名 | IP地址 |
---|---|
node01 | 172.16.120.130 |
node02 | 172.16.120.131 |
概念
Erlang Cookie
Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie
镜像模式
ha-mode | ha-params | 功能 |
---|---|---|
all | 空 | 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份 |
exactly | count | 镜像队列将会在集群上复制count份。如果集群数量少于count时候,队列会复制到所有节点上。如果大于Count集群,有一个节点crash后,新进入节点也不会做新的镜像 |
nodes | node name | 镜像队列会在node name中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个node list中没有一个节点在线,那么这个queue会被声明在client连接的节点 |
下载相关软件包
以node01节点为例,RabbbitMQ基与erlang开发,首先安装erlang,采用yum方式。
# 以下命令在所有节点中执行
yum install -y rabbitmq-server-3.3.5-34.el7
系统配置
添加Hosts
# 以下命令在所有节点中执行
# 修改hosts 增加3个服务器的ip及hostname
vi /etc/hosts
配置 RabbitMQ
自动启动
# 启用开机启动
systemctl enable rabbitmq-server
# 确认开机启动已启用
systemctl is-enabled rabbitmq-server
启动
# 启动
systemctl start rabbitmq-server
# 查看状态
systemctl status rabbitmq-server
防火墙
# 客户端连接端口
firewall-cmd --add-port=5672/tcp --permanent
# UI管理端口
firewall-cmd --add-port=15672/tcp --permanent
# 集群端口
firewall-cmd --add-port={4369/tcp,25672/tcp} --permanent
# 重启防火墙 以便上述规则生效
firewall-cmd --reload
# 验证规则已成功加入
firewall-cmd --list-all
RabbitMQ集群
分发.erlang.cookie到其他节点
scp /var/lib/rabbitmq/.erlang.cookie node02:/var/lib/rabbitmq/
搭建集群
其它节点加入主节点
# 以下在节点2和3都需要执行
systemctl restart rabbitmq-server
# rabbitmqctl stop
# rabbitmq-server -detached
# 停止rabbitmq应用
rabbitmqctl stop_app
# 重置节点配置
rabbitmqctl reset
# 节点以ram节点的形式加入集群
rabbitmqctl join_cluster --ram rabbit@node01
# 启动rabbitmq应用
rabbitmqctl start_app
# 查看集群状态,验证集群搭建成功:nodes字段应该包含其它节点
rabbitmqctl cluster_status
# Cluster status of node rabbit@node01
# [{nodes,[{disc,[rabbit@node01]},{ram,[rabbit@node03,rabbit@node02]}]},
# {running_nodes,[rabbit@node03,rabbit@node02,rabbit@node01]},
# {cluster_name,<<"rabbit@node01">>},
# {partitions,[]},
# {alarms,[{rabbit@node03,[]},{rabbit@node02,[]},{rabbit@node01,[]}]}]
从集群中删除节点
# 停止rabbitmq
rabbitmqctl stop_app
# 重置节点配置
rabbitmqctl reset
# 启动rabbitmq
rabbitmqctl start_app
#首先将要移除的节点停机.
rabbitmqctl stop
#然后在主节点,也就是发起进群的主机上进行节点的移除.
rabbitmqctl forget_cluster_node k8s_node2
#然后查看集群状态, 确认节点从集群中移除成功
rabbitmqctl cluster_status
镜像队列测率
设置镜像队列高可用
# 以下在节点1执行
# 设置镜像队列策略为所有节点,节点小于等于2时,方可选该策略,否则会因为复制队列数据占用大量网络带宽和磁盘IO
rabbitmqctl set_policy -p / ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
# 设置镜像队列策略为两份,节点大于等于3个时推荐,以便减少队列复制产生的网络带宽和磁盘IO
# rabbitmqctl set_policy -p / ha-two "" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
# 任意节点查看镜像队列策略
rabbitmqctl list_policies
# Listing policies for vhost "/" ...
# vhost name pattern apply-to definition priority
# / ha-all ^ all {"ha-mode":"all"} 0
# 清除镜像同步策略
# rabbitmqctl clear_policy <PolicyName>
创建管理员账号
在任意节点新建账号并设置密码,以node01节点为例
# 以下在节点1执行
# 创建用户
rabbitmqctl add_user <UserName> <Password>
# 赋予角色
rabbitmqctl set_user_tags <UserName> administrator
# 针对一个vhosts给用户赋予相关权限;
# sudo rabbitmqctl set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p / <UserName> ".*" ".*" ".*"
# 列出所有用户,验证创建用户成功
rabbitmqctl list_users
# 用新创建的账号密码登录
安装启用Web管理插件
# 以下在所有节点中执行
# 启用管理界面插件
rabbitmq-plugins enable rabbitmq_management
# 禁用管理界面插件
# rabbitmq-plugins disable rabbitmq_management
# 列出所有插件,确认管理界面插件已启用
rabbitmq-plugins list
# 重启rabbitmq-server服务,以便加载管理界面插件
systemctl restart rabbitmq-server
#sudo chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/
验证Web管理插件安装启用成功
在浏览器内地址栏
输入ip:port/15672 访问打开页面
用户名:guest
密码:guest
RabbitMQ集群访问
RabbitMQ的VIP端口在HAProxy中设置的为5673;
rabbit://rabbitmq:Aa123456@10.15.253.88:5673
直接连接RabbitMQ集群(建议)
rabbit://rabbitmq:Aa123456@node01:5672,rabbitmq:Aa123456@node02:5672