Loading

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
posted @ 2022-12-11 15:53  知科行技  阅读(27)  评论(0编辑  收藏  举报