rabbitmq集群实现

#1.centos8环境环境:
	10.0.0.150   mq-server1
	10.0.0.160   mq-server2
	10.0.0.170   mq-server3

#Rabbitmq 集群分为二种方式:
普通模式:创建好 RabbitMQ 集群之后的默认模式。
镜像模式:把需要的队列做成镜像队列。

普通集群模式:queue 创建之后,如果没有其它 policy,消息实体只存在于其中一个节点,A、B 两个 Rabbitmq 节点仅有相同的元数据,即队列结构,但队列的数据仅保存有一份,即创建该队列的 rabbitmq 节点(A 节点),当消息进入 A 节点的 Queue 中后,consumer 从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer,所以 consumer 可以连接每一个节点,从中取消息,该模式存在一个问题就是当 A 节点故障后,B节点无法取到 A 节点中还未消费的消息实体。

镜像集群模式:
把需要的队列做成镜像队列,存在于多个节点,属于 RabbitMQ 的 HA 方案(镜像模式是在普通模式的基础上,增加一些镜像策略)该模式解决了普通模式中的数据丢失问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取,该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置 policy,然后客户端创建队列的时候,rabbitmq 集群根据“队列名称”自动设置是普通集群模式或镜像队列。

#集群中有两种节点类型:
内存节点:只将数据保存到内存
磁盘节点:保存数据到内存和磁盘。内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们,否则所有数据消息在服务器全部停机之后都会丢失。

#推荐设计架构:在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式,其它节点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作为数据备份使用。

#2.在三台主机均执行安装rabbitmq
#添加RabbitMQ的yum脚本
[root@centos8 ~]#curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
#添加erlang的yum脚本
[root@centos8 ~]#curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
#yum安装erlang和rabbitmq
[root@centos8 ~]#yum install erlang rabbitmq-server -y

#3.各mq服务器配置本地主机名解析
[root@centos8 ~]#hostnamectl set-hostname mq-server1
[root@centos8 ~]#exit
[root@centos8 ~]#hostnamectl set-hostname mq-server2
[root@centos8 ~]#exit
[root@centos8 ~]#hostnamectl set-hostname mq-server3
[root@centos8 ~]#exit
[root@mq-server1 ~]#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.150 mq-server1
10.0.0.160 mq-server2
10.0.0.170 mq-server3
[root@mq-server2 ~]#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.150 mq-server1
10.0.0.160 mq-server2
10.0.0.170 mq-server3
[root@mq-server3 ~]#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.150 mq-server1
10.0.0.160 mq-server2
10.0.0.170 mq-server3

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

#在mq-server1同步.erlang.cookie至其他两台服务器:
[root@mq-server1 ~]#scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.160:/var/lib/rabbitmq/.erlang.cookie
[root@mq-server1 ~]#scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.170:/var/lib/rabbitmq/.erlang.cookie

#启动rabbitmq服务
[root@mq-server1 ~]#systemctl enable --now rabbitmq-server.service
[root@mq-server2 ~]#systemctl enable --now rabbitmq-server.service
[root@mq-server3 ~]#systemctl enable --now rabbitmq-server.service

#查看集群状态,各自为一个集群,默认都是磁盘节点。下一步将两外两个节点以内存节点加入到一个集群。
[root@mq-server1 ~]#rabbitmqctl cluster_status
[root@mq-server2 ~]#rabbitmqctl cluster_status
[root@mq-server3 ~]#rabbitmqctl cluster_status

#在mq-server2执行,停止app服务,清空元数据,加入mq-server1集群,启动app服务
[root@mq-server2 ~]#rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq-server2 ...
[root@mq-server2 ~]#rabbitmqctl reset
Resetting node rabbit@mq-server2 ...
[root@mq-server2 ~]#rabbitmqctl join_cluster rabbit@mq-server1 --ram
Clustering node rabbit@mq-server2 with rabbit@mq-server1
[root@mq-server2 ~]#rabbitmqctl start_app
Starting node rabbit@mq-server2 ...

#在mq-server3执行,停止app服务,清空元数据,加入mq-server1集群,启动app服务

#再次查看mq-server集群状态
[root@mq-server1 ~]#rabbitmqctl cluster_status
Cluster status of node rabbit@mq-server1 ...
Basics
Cluster name: rabbit@mq-server1
Disk Nodes
rabbit@mq-server1
RAM Nodes
rabbit@mq-server2
rabbit@mq-server3
Running Nodes
rabbit@mq-server1
rabbit@mq-server2
rabbit@mq-server3
Versions
rabbit@mq-server1: RabbitMQ 3.10.7 on Erlang 25.0.4
rabbit@mq-server2: RabbitMQ 3.10.7 on Erlang 25.0.4
rabbit@mq-server3: RabbitMQ 3.10.7 on Erlang 25.0.4
Maintenance status
Node: rabbit@mq-server1, status: not under maintenance
Node: rabbit@mq-server2, status: not under maintenance
Node: rabbit@mq-server3, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@mq-server1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@mq-server1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@mq-server2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@mq-server2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@mq-server3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@mq-server3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: classic_mirrored_queue_version, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: stream_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled

#5.将集群设置为镜像模式,在任意一台节点执行一次即可。
[root@mq-server1 ~]#rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

#6.各服务器启动web插件,会监听15672端口
[root@mq-server1 ~]#rabbitmq-plugins  enable rabbitmq_management
[root@mq-server2 ~]#rabbitmq-plugins  enable rabbitmq_management
[root@mq-server3 ~]#rabbitmq-plugins  enable rabbitmq_management

#7.web界面登录http://10.0.0.150:15672,其他服务器也开启了web,可以登录。

#8.rabbitmq从3.3.0开始禁止使用guest/guest用户来通过除localhost外的访问,直接访问报错:User can only log in via localhost
#修改配置文件允许登录,找到loopback_user,删除被禁止的guest账户
[root@mq-server1 ~]#vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.10.7/plugins/rabbit-3.10.7/ebin/rabbit.app
{loopback_users, [<<"">>]},

#9.为集群设置用户(在任意一台主机配置即可)
[root@mq-server1 ~]#rabbitmqctl  list_users
Listing users ...
user    tags
guest   [administrator]
[root@mq-server1 ~]#rabbitmqctl add_user admin 123456
Adding user "admin" ...
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@mq-server1 ~]#rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
[root@mq-server1 ~]#rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...

#10.这样就可以通过admin/123456账户登录没有修改配置文件的地址来访问rabbitmq界面了。

posted @   小糊涂90  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示