* 目标 消息通知: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:15672 和 http://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',[]}]}] ```