RabiitMQ3.7.24主从环境搭建指南.md 9.6 KB

  • 目标

消息通知:RabbitMQ 3.7.24 (master-slave)

IP 端口 账号 密码
10.18.226.160(主) 15672 admin jhlrb0715
10.18.226.167(从) 15672 admin jhlrb0715

访问地址:

http://10.18.226.160:15672/#/

http://10.18.226.167:15672/#/

RabbitMQ 安装

参考 : https://www.cnblogs.com/yingxiaocao/p/13282058.html https://www.cnblogs.com/yang-hao/p/11737646.html

1. 准备

yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC unixODBC-devel httpd python-simplejson

2. 安装erlang

因为 rabbitmq 是 erlang 语言开发的,所以安装 rabbitmq 之前要安装 erlang 环境。

根据要安装的 rabbitmq 版本安装对应的 erlang 版本,它们的对应关系参考https://www.rabbitmq.com/which-erlang.html

#1.下载安装包(如果下载太慢的话,可以本地下载完后再上传到服务器)
wget http://www.erlang.org/download/otp_src_21.3.tar.gz

#2.解压
tar -zxvf otp_src_21.3.tar.gz -C /usr/local/

#3.进入解压目录
cd /usr/local/otp_src_21.3/

./configure --prefix=/usr/local/erlang --enable-smp-support --enable-threads --enable-sctp --enable-kernel-poll --enable-hipe --with-ssl --without-javac

#4.编译并安装
make && make install

#5.配置环境变量
vim /etc/profile
`export PATH=$PATH:/usr/local/erlang/bin`
source /etc/profile

#6.验证,进入erlang开发命令行,输入 halt(). 退出
erl
>halt().

3. 安装 rabbitMQ

#1.下载页面 https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.24
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.24/rabbitmq-server-generic-unix-3.7.24.tar.xz

#2.解压
xz -d rabbitmq-server-generic-unix-3.7.24.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.7.24.tar -C /usr/local/

#4.配置环境变量,方便执行命令
vim /etc/profile
`export PATH=$PATH:/usr/local/rabbitmq_server-3.7.24/sbin`
source /etc/profile

#3.启动
#启动
rabbitmq-server -detached

#开启管理插件 
rabbitmq-plugins enable rabbitmq_management
#开启 rabbitmq
rabbitmqctl start_app

#4.添加用户
#新增用户
rabbitmqctl add_user admin admin
#分配角色
rabbitmqctl set_user_tags admin administrator
#分配权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
#查看用户
rabbitmqctl list_users

#5.访问http://10.18.226.160:15672

rabbitMQ 常用命令

  • rabbitmq-server -detached 开启rabbitmq服务
  • rabbitmqctl status 查看服务状态:
  • rabbitmqctl start_app 开启rabbitmq
  • rabbitmq-plugins enable rabbitmq_management 开启管理插件
  • rabbitmq-plugins list 查看插件集合:
  • http://192.168.200.130:15672 访问可视化界面:
  • rabbitmqctl stop :停止rabbitmq
  • rabbitmq-server restart : 重启rabbitmq

用户管理命令:

  • rabbitmqctl list_users 查看所有用户
  • rabbitmqctl add_user admin admin 添加一个用户
  • rabbitmqctl change_password Username 'Newpassword' 修改密码
  • rabbitmqctl set_permissions -p "/" zhaobl "." "." ".*" 配置权限
  • rabbitmqctl list_user_permissions zhaobl 查看用户权限
  • rabbitmqctl set_user_tags zhaobl administrator 设置tag
  • rabbitmqctl delete_user guest 删除用户(安全起见,删除默认用户)

注意:端口 15672 需要对外开放。 当不知道端口15672是否开放时,尝试 1)cur http://localhost:15672 ,如果有内容,证明可视化界面是开启了的 2)将 80 端口的请求转发给 15672(因为一般80端口都是开放的),在外部访问 http://10.18.226.160 ,看是否出现可视化界面。出现说明15672在外部无法访问。

4. 开启启动

RabbitMQ 主从配置

参考 https://blog.csdn.net/weixin_34290631/article/details/91704046

1. 确保节点之间主机名称可以相互解析

在两台节点服务器上分别配置hosts文件,加入所有的节点主机名称

vim /etc/hosts
192.168.10.5 aiot-1-1
192.168.10.9 aiot-1-2

注意:配置的主机名不要含有特殊符号,如.-之类的,如主机名不能为node1.xxx.com

2. 同步.erlang.cookie文件

Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在$HOME/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。

#1.查看.erlang.cookie文件的权限
ll ~/.erlang.cookie
-r-------- 1 root root 20 Dec  7 00:00 /root/.erlang.cookie

#2.将node1中的.erlang.cookie通过scp传输到node1中去
scp -rp ~/.erlang.cookie root@192.168.10.9:/root

#3.分别在node1和node2查看同步后的.erlang.cookie是否一致
cat ~/.erlang.cookie

3.查看集群状态

#分别查看一下集群状态
rabbitmqctl cluster_status

node1:

[root@aiot-1-1 sbin]# rabbitmqctl cluster_status
Cluster status of node rabbit@aiot-1-1 ...
[{nodes,[{disc,['rabbit@aiot-1-1']}]},
 {running_nodes,['rabbit@aiot-1-1']},
 {cluster_name,<<"rabbit@aiot-1-1">>},
 {partitions,[]},
 {alarms,[{'rabbit@aiot-1-1',[]}]}]

node2:

[root@aiot-1-2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@aiot-1-2 ...
[{nodes,[{disc,['rabbit@aiot-1-2']}]},
 {running_nodes,['rabbit@aiot-1-2']},
 {cluster_name,<<"rabbit@aiot-1-2">>},
 {partitions,[]},
 {alarms,[{'rabbit@aiot-1-2',[]}]}]
 

4. 将node2加入node1节点,创建主从同步

主机在加入集群之前必须停掉本机的集群服务; 如node2要加入node1,需要现在node2上执行命令

#关闭集群服务,然后再执行以下命令加入node1的集群:
rabbitmqctl stop_app

#加入node1节点,执行此步骤之前确保主节点服务器是开启的:
rabbitmqctl join_cluster --ram rabbit@aiot-1-1
#注:--ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加--ram这个参数了,如果磁盘是ssd,建议不加—ram
#注:执行该命令,一定一定要确认主机是否对外开放了端口 4379 和 25672!!如果没有开放这两个端口的话,会一直提示 unable to connect to epmd (port 4369) timeout (timed out)
#注:RabbitMQ端口说明 参考https://www.cnblogs.com/liuxingke/articles/9889517.html

#开启rabbitmq
rabbitmqctl start_app 

在node1和node2 中分别执行

[root@aiot-1-2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@aiot-1-2 ...
[{nodes,[{disc,['rabbit@aiot-1-1']},{ram,['rabbit@aiot-1-2']}]},
 {running_nodes,['rabbit@aiot-1-1','rabbit@aiot-1-2']},
 {cluster_name,<<"rabbit@aiot-1-1">>},
 {partitions,[]},
 {alarms,[{'rabbit@aiot-1-1',[]},{'rabbit@aiot-1-2',[]}]}]

5. 验证同步

在 node1 上修改用户dmin 的密码

rabbitmqctl  change_password  admin jhlrb0715

分别访问 http://10.18.226.160:15672http://10.18.226.167:15672 尝试使用 admin 账号密码登录

*6. 节点退出集群

如果 node2 要退出集群

#1.首先关闭节点
rabbitmqctl stop_app

#2.退出集群
rabbitmqctl reset
#如果只剩下最后一个节点,则执行
rabbitmqctl force_reset
#注:该命令含义与 rabbitmqctl join_cluster --ram rabbit@aiot-1-1 相反

#3.开启节点
rabbitmqctl start_app

7. 关闭其中一个节点,观察另一个节点的集群状态

#关闭node1节点,查看node2的集群状态
[root@aiot-1-2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@aiot-1-2 ...
[{nodes,[{disc,['rabbit@aiot-1-1']},{ram,['rabbit@aiot-1-2']}]},
 {running_nodes,['rabbit@aiot-1-2']},
 {cluster_name,<<"rabbit@aiot-1-1">>},
 {partitions,[]},
 {alarms,[{'rabbit@aiot-1-2',[]}]}]

注:从节点重启后,会自动连接上集群,不过需要大约15-20秒。(我的测试结果更快)

*8. 如何将节点中磁盘点修改为内存点:

如,将node1的磁盘点改为内存点

[root@aiot-1-1 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@aiot-1-1 ...
[root@aiot-1-1 ~]# rabbitmqctl  change_cluster_node_type ram
Turning rabbit@aiot-1-1 into a ram node
Error:
{:resetting_only_disc_node, 'You cannot reset a node when it is the only disc node in a cluster. Please convert another node of the cluster to a disc node first.'}

注:节点中必须最少要有一个disc点(磁盘点),这是为了永久化存储考虑

1)想将node2改为磁盘点

[root@aiot-1-2 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@aiot-1-2 ...
[root@aiot-1-2 ~]# rabbitmqctl change_cluster_node_type disc
Turning rabbit@aiot-1-2 into a disc node
[root@aiot-1-2 ~]# rabbitmqctl start_app

2)将node1改为内存点

#查看集群状态,可发现 node1 和 node2 都是 磁盘点disc了
[root@aiot-1-1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@aiot-1-1 ...
[{nodes,[{disc,['rabbit@aiot-1-1','rabbit@aiot-1-2']}]},
 {running_nodes,['rabbit@aiot-1-1']},
 {cluster_name,<<"rabbit@aiot-1-1">>},
 {partitions,[]},
 {alarms,[{'rabbit@aiot-1-1',[]}]}]

#关闭node1
[root@aiot-1-1 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@aiot-1-1 ...

#改为内存点
[root@aiot-1-1 ~]# rabbitmqctl  change_cluster_node_type ram
Turning rabbit@aiot-1-1 into a ram node

#开启node1
[root@aiot-1-1 ~]# rabbitmqctl start_app
Starting node rabbit@aiot-1-1 ...
 completed with 3 plugins.
 
#再次查看集群状态,发现node1时内存点,node2依然是磁盘点
[root@aiot-1-1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@aiot-1-1 ...
[{nodes,[{disc,['rabbit@aiot-1-2']},{ram,['rabbit@aiot-1-1']}]},
 {running_nodes,['rabbit@aiot-1-2','rabbit@aiot-1-1']},
 {cluster_name,<<"rabbit@aiot-1-1">>},
 {partitions,[]},
 {alarms,[{'rabbit@aiot-1-2',[]},{'rabbit@aiot-1-1',[]}]}]