消息通知:RabbitMQ 3.7.24 (master-slave)
IP | 端口 | 账号 | 密码 |
---|---|---|---|
10.18.226.160(主) | 15672 | admin | jhlrb0715 |
10.18.226.167(从) | 15672 | admin | jhlrb0715 |
访问地址:
参考 : https://www.cnblogs.com/yingxiaocao/p/13282058.html https://www.cnblogs.com/yang-hao/p/11737646.html
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC unixODBC-devel httpd python-simplejson
因为 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().
#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服务用户管理命令:
注意:端口 15672 需要对外开放。 当不知道端口15672是否开放时,尝试 1)cur http://localhost:15672 ,如果有内容,证明可视化界面是开启了的 2)将 80 端口的请求转发给 15672(因为一般80端口都是开放的),在外部访问 http://10.18.226.160 ,看是否出现可视化界面。出现说明15672在外部无法访问。
参考 https://blog.csdn.net/weixin_34290631/article/details/91704046
在两台节点服务器上分别配置hosts文件,加入所有的节点主机名称
vim /etc/hosts
192.168.10.5 aiot-1-1
192.168.10.9 aiot-1-2
注意:配置的主机名不要含有特殊符号,如.-之类的,如主机名不能为node1.xxx.com
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
#分别查看一下集群状态
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',[]}]}]
主机在加入集群之前必须停掉本机的集群服务; 如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',[]}]}]
在 node1 上修改用户dmin 的密码
rabbitmqctl change_password admin jhlrb0715
分别访问 http://10.18.226.160:15672 和 http://10.18.226.167:15672 尝试使用 admin 账号密码登录
如果 node2 要退出集群
#1.首先关闭节点
rabbitmqctl stop_app
#2.退出集群
rabbitmqctl reset
#如果只剩下最后一个节点,则执行
rabbitmqctl force_reset
#注:该命令含义与 rabbitmqctl join_cluster --ram rabbit@aiot-1-1 相反
#3.开启节点
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-2']},
{cluster_name,<<"rabbit@aiot-1-1">>},
{partitions,[]},
{alarms,[{'rabbit@aiot-1-2',[]}]}]
注:从节点重启后,会自动连接上集群,不过需要大约15-20秒。(我的测试结果更快)
如,将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',[]}]}]