RabbitMQ集群部署

1,189 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

RabbitMQ集群镜像模式部署

rabbitmq集群模式有2种

  • 普通集群模式(无高可用性): 默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。

  • 镜像集群模式(高可用性): 最常用的集群模式,把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。

RabbitMQ集群镜像模式部署过程

部署包含三个节点node1,node2和node3的集群。

以 node1 节点为基准,将 node2,node3 节点 加入 node1 节点的集群中。这3个节点是平等的

一. 安装Rabbitmq软件(node1,node2,node3)

1.下载Erlang源码并安装

wget https://github.com/erlang/otp/releases/download/OTP-24.0/otp_src_24.0.tar.gz
tar zxvf otp_src_24.0.tar.gz
cd otp_src_24.0
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-java

make
make install  

可能提示错误:configure: error: No curses library functions found 原因:缺少ncurses依赖库 安装ncurses:

wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz
tar -zxvf ncurses-6.1.tar.gz
cd ncurses-6.1
./configure --with-shared --without-debug --without-ada --enable-overwrite  
make
make install

2.下载Rabbitmq源码并安装

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.19/rabbitmq-server-generic-unix-3.8.19.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.8.19.tar.xz
mv rabbitmq_server-3.8.19 /usr/local/

3.添加环境变量配置

cat >> /etc/profile << -'EOF'
export PATH=$PATH:/usr/local/erlang/bin:/usr/local/rabbitmq_server-3.8.19/sbin
-EOF

source /etc/profile

4.验证各节点rabbitmq

# 启动rabbitmq,-detached代表后台守护进程方式启动。
rabbitmq-server -detached

# 查看状态,确定rabbitmq已经成功运行
rabbitmqctl status

# 先暂停各节点
rabbitmqctl stop

二. 部署Rabbitmq集群

1.统一认证Erlang Cookie

设置不同节点间同一认证的Erlang Cookie,采用从某个节点copy的方式保持Cookie的一致性。

启动rabbitmq之后会在~/.erlang.cookie/var/lib/rabbitmq/下生成一个.erlang.cookie隐藏文件,即使你把这个文件给删除了运行rabbitmq-server也会再次生成新的.erlang.cookie。

将node1的.erlang.cookie文件覆盖node2,node3节点上的.erlang.cookie文件(先暂停各节点的rabbitmq服务)。

# 复制 node1节点的.erlang.cookie文件到node2,node3
node1: scp ~/.erlang.cookie {node2_host_or_ip}:~/.erlang.cookie
node1: scp ~/.erlang.cookie {node3_host_or_ip}:~/.erlang.cookie
 
# 重新启动
node1: rabbitmq-server -detached
node2: rabbitmq-server -detached
node3: rabbitmq-server -detached  

2.创建并部署集群(在node2,node3上执行):

# node2
node2:rabbitmqctl stop_app
node2:rabbitmqctl reset
# 将node2加入node1节点所在集群
node2:rabbitmqctl join_cluster rabbit@{node1_host_or_ip}
node2:rabbitmqctl start_app
node2:rabbitmqctl cluster_status

# node3
node3:rabbitmqctl stop_app
node3:rabbitmqctl reset
# 将node3加入node1节点所在集群
node3:rabbitmqctl join_cluster rabbit@{node1_host_or_ip}
node3:rabbitmqctl start_app
node3:rabbitmqctl cluster_status

在node1上执行:rabbitmqctl cluster_status 查看节点是否成功加入集群

新建 virtualhost,并创建administrator权限的用户名和密码
# 创建名为 demo 的 VirtualHost
rabbitmqctl add_vhost demo

# 添加用户,密码
rabbitmqctl add_user your_username your_password

# 设置your_username为administrator权限
rabbitmqctl set_user_tags your_username administrator

# 使用户your_username具有demo这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
rabbitmqctl set_permissions -p demo your_username '.*' '.*' '.*'

将 队列 镜像到所有的rabbitmq集群中
rabbitmqctl set_policy -p demo ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

其他

常用操作命令:

# 查看状态
rabbitmqctl status  

# 关闭服务:
rabbitmqctl stop

# 关闭应用(关闭当前启动的节点)
rabbitmqctl stop_app

# 启动应用,和stop_app关闭命令配合使用,达到清空队列的目的
rabbitmqctl start_app

# 创建VirtualHost
rabbitmqctl add_vhost demo

# 启动web管理插件
rabbitmq-plugins enable rabbitmq_management

# 列出角色:
rabbitmqctl list_users

# 添加用户,密码
rabbitmqctl add_user patrick pwd123

# 设置patrick为administrator权限
rabbitmqctl set_user_tags patrick administrator

# 使用以下命令集群状态,目前相互独立,没有形成集群
rabbitmqctl cluster_status

# rabbitmq设置内存限制系数, 内存限制大小=机器内存 * 系数,eg: 1G = 4G * 0.25
rabbitmqctl set_vm_memory_high_watermark 0.4

# 剔除集群某个节点NodeX
NodeX: rabbitmqctl stop_app
NodeX: rabbitmqctl reset
NodeX: rabbitmqctl start_app