|
@@ -0,0 +1,310 @@
|
|
|
|
+* 目标
|
|
|
|
+
|
|
|
|
+ 消息通知: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',[]}]}]
|
|
|
|
+
|
|
|
|
+```
|