企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
```` ### https://segmentfault.com/a/1190000010702020 ### http://www.cnblogs.com/kevingrace/p/7693042.html ### https://segmentfault.com/a/1190000010702020 ### https://cloud.tencent.com/developer/article/1041042 ### ```` 添加软件源 ``` vi /etc/yum.repos.d/rabbitmq.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1 [rabbitmq-server] name=rabbitmq-server baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1 ``` ### 安装软件 ``` yum install rabbitmq-server ``` ### 更改主机名 永久生效 hostnamectl set-hostname mq1 hostnamectl set-hostname mq2 ### 添加 hosts ``` 192.168.1.197 mq1 192.168.1.196 mq2 ``` ### 更改数据目录和日志目录 报错需要创建log日志 ### chown -R rabbitmq:rabbitmq /app/rabbitmq/mnesia/ ``` vi /etc/rabbitmq/rabbitmq-env.conf RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia RABBITMQ_LOG_BASE=/data/rabbitmq/log ``` ### 启动服务 两台主机都启动下 rabbitmq-server ``` systemctl start rabbitmq-server ``` ### 设置 Erlang Cookie ``` scp /var/lib/rabbitmq/.erlang.cookie mq2:/var/lib/rabbitmq/ ``` 保证 权限和所属用户/组修改回来 与原来一致 ### 注意事项 cookie在所有节点上必须完全一样,同步时一定要注意。 erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。 ### 组成集群 所有节点重新启动下 rabbitmq-server ``` systemctl restart rabbitmq-server ``` ### 防火墙端口需要放行 4369 ### systemctl stop firewalld ### 查看错误信息 journalctl -f -u rabbitmq-server mq2 加入集群 ``` mq2 $ rabbitmqctl stop_app # 停止rabbitmq服务 mq2 $ rabbitmqctl join_cluster rabbit@mq1 # mq2和mq1构成集群, mq2必须能通过mq1的主机名ping通 mq2 $ rabbitmqctl start_app # 开启rabbitmq服务 ``` ### 设置内存节点 其中 –ram 指的是作为内存节点,要是想做为磁盘节点的话,就不用加 –ram 这个参数了 ``` mq2 # rabbitmqctl join_cluster --ram rabbit@mq1 ``` 只要在节点列表里包含了本身,它就成为一个磁盘节点。 在RabbitMQ集群里,必须至少有一个磁盘节点存在。 ### 更改节点属性 ``` node2 $ rabbitmqctl stop_app # 停止rabbitmq服务 node2 $ rabbitmqctl change_cluster_node_type ram # 更改节点为内存节点 Turning rabbit@node2 into a ram node node2 $ rabbitmqctl change_cluster_node_type disc # 更改节点为磁盘节点 Turning rabbit@node2 into a disc node node2 $ rabbitmqctl start_app # 开启rabbitmq服务 ``` ### 查看集群状态 ``` rabbitmqctl cluster_status ``` ### 集群用户操作 ``` rabbitmqctl add_user admin admin rabbitmqctl set_user_tags admin administrator rabbitmqctl set_permissions -p "/" admin '.*' '.*' '.*' ``` ### 开启监控插件 ``` rabbitmq-plugins enable rabbitmq_management ``` ### 登录后台 http://192.168.1.197:15672/#/ 上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列 ### 镜像队列概念 镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作。 镜像队列是基于普通的集群模式的,所以你还是得先配置普通集群,然后才能设置镜像队列。 镜像队列设置后,会分一个主节点和多个从节点,如果主节点宕机,从节点会有一个选为主节点,原先的主节点起来后会变为从节点。 queue和message虽然会存在所有镜像队列中,但客户端读取时不论物理面连接的主节点还是从节点,都是从主节点读取数据,然后主节点再将queue和message的状态同步给从节点,因此多个客户端连接不同的镜像队列不会产生同一message被多次接受的情况。 ### 设置镜像队列策略 在普通集群的中任意节点启用策略,策略会自动同步到集群节点 命令格式 ``` set_policy [-p vhostpath] {name} {pattern} {definition} [priority] ``` 在任意一个节点上执行 ``` [root@node1 ~]# rabbitmqctl set_policy -p / ha-allqueue "^message" '{"ha-mode":"all"}' Setting policy "ha-allqueue" for pattern "^message" to "{\"ha-mode\":\"all\"}" with priority "0" ``` 注意:"^message" 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,配置时使用的应用于所有队列,所以表达式为"^" ### 集群重启 集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启: 先在一个节点上执行 ``` $ rabbitmqctl force_boot $ service rabbitmq-server start ``` 在其他节点上执行 ``` $ service rabbitmq-server start ``` 查看cluster状态是否正常(要在所有节点上查询)。 ``` $ rabbitmqctl cluster_status ``` ### 常用命令备注 ``` 添加用户 sudo rabbitmqctl add_user admin pwd 设置用户角色 sudo rabbitmqctl set_user_tags admin administrator tag(administrator,monitoring,policymaker,management) 设置用户权限(接受来自所有Host的所有操作) sudo rabbitmqctl set_permissions -p "/" admin '.*' '.*' '.*' 查看用户权限 sudo rabbitmqctl list_user_permissions admin 删除用户 sudo rabbitmqctl delete_user <username> 修改用户密码 sudo rabbitmqctl change_password <username> <newpassword> 清除用户密码(该用户将不能使用密码登陆,但是可以通过SASL登陆如果配置了SASL认证) sudo rabbitmqctl clear_password <username> 设置用户tags(相当于角色,包含administrator,monitoring,policymaker,management) sudo rabbitmqctl set_user_tags <username> <tag> 列出所有用户 sudo rabbitmqctl list_users 创建一个vhosts sudo rabbitmqctl add_vhost <vhostpath> 删除一个vhosts sudo rabbitmqctl delete_vhost <vhostpath> 列出vhosts sudo rabbitmqctl list_vhosts [<vhostinfoitem> ...] 针对一个vhosts给用户赋予相关权限; sudo rabbitmqctl set_permissions [-p <vhostpath>] <user> <conf> <write> <read> 清除一个用户对vhosts的权限; sudo rabbitmqctl clear_permissions [-p <vhostpath>] <username> 列出哪些用户可以访问该vhosts; sudo rabbitmqctl list_permissions [-p <vhostpath>] 列出用户访问权限; sudo rabbitmqctl list_user_permissions <username> ``` 输出当前目录下各个子目录和文件所使用的空间 ```` du -m --max-depth=1 ````