初学RabbitMQ (三) 集群高可用

初学RabbitMQ (三) 集群高可用,第1张

初学RabbitMQ (三) 集群高可用 RabbitMQ集群

rabbitmq有3种模式,但集群模式是2种。

​ 详细如下: 单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。之前一直在用

普通模式:默认模式,以两个节点(A、B)为例来进行说明

当消息进入A节点的Queue后,consumer从B节点消费时,RabbitMQ会在A和B之间创建临 时通道进行消息传输,把A中的消息实体取出并经过通过交给B发送给consumer

当A故障后,B就无法取到A节点中未消费的消息实体

如果做了消息持久化,那么得等A节点恢复,然后才可被消费如果没有持久化的话,就会产生消息丢失的现象

镜像模式:

非常经典的 mirror 镜像模式,保证 100% 数据不丢失。高可靠性解决方案,主要就是实现数据的同步,一般来讲是 2 - 3 个节点实现数据同步 对于 100% 数据可靠性解决方案,一般是采用 3 个节点。在实际工作中也是用得最多的,并且实现非常的简单,一般互联网大厂都会构建这种镜像集群模式 集群搭建

准备两台Liunx服务器,并安装好RabbitMQ。

集群步骤如下:

​ 1、修改 /etc/hosts 映射文件

[root@a ~]# vim /etc/hosts

一号服务器

127.0.0.1 A localhost localhost.localdomain localhost4 localhost4.localdomain4
::1       A      localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.152.129 A
192.168.204.130 B

​ 二号服务器

127.0.0.1 B localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 B localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.204.141 A
192.168.204.142 B

考虑到一些CentOS改Host文件后主机名不变,可以执行以下命令改变主机名。

[root@a ~]# hostnamectl set-hostname 主机名 
[root@a ~]# reboot  ##重启liunx

​ 2、相互通信,cookie必须保持一致,同步 rabbitmq的cookie 文件:跨服务器拷贝 .erlang.cookie (隐藏文件,使用 ls -all 显示)

.erlang.cookie 文件在/var/lib/rabbitmq/下

为了保持rabbitmq的cookie文件一致性,我们可以跨服务器拷贝.erlang.cookie文件

root@A opt]# scp /var/lib/rabbitmq/.erlang.cookie  192.168.204.142:/var/lib/rabbitmq

​ 3、两台服务器都关闭防火墙,开启Rabbitmq服务

[root@A ~]# systemctl stop firewalld 

[root@A ~]# systemctl start rabbitmq-server

​ 4、加入集群节点

[root@B ~]# rabbitmqctl stop_app   ##关闭本机RabbitMQ节点

[root@B ~]# rabbitmqctl join_cluster rabbit@A  ##将本机节点集群加入A节点

[root@B ~]# rabbitmqctl start_app ##启动本机节点

5、查看管理端

搭建集群结构之后,之前创建的交换机、队列、用户都属于单一结构,在新的集群环境中是 不能用的

所以在新的集群中重新手动添加用户即可(任意节点添加,所有节点共享)

[root@A ~]# rabbitmqctl add_user 用户名 密码
[root@A ~]# rabbitmqctl set_user_tags 用户名 administrator 
[root@A ~]# rabbitmqctl set_permissions -p "/" 用户名 ".*" ".*" ".*"

注意:当节点脱离集群还原成单一结构后,交换机,队列和用户等数据 都会重新回来

这就是集群成功后的页面,但是默认集群是普通模式,系统可用性不高。因此我们要设置为镜像模式

设置镜像模式

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致

语法:set_policy {name} {pattern} {definition}

name:策略名,可自定义

pattern:队列的匹配模式(正则表达式)

“^” 可以使用正则表达式,比如"^queue_" 表示对队列名称以“queue_”开头的所有 队列进行镜像,而"^"表示匹配所有的队列

definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode

ha-mode:(High Available,高可用)模式,指明镜像队列的模式,有效值为 all/exactly/nodes,当前策略模式为 all,即复制到所有节点,包含新增节点

all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定

ha-params:ha-mode模式需要用到的参数

ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manua

[root@A ~]# rabbitmqctl set_policy xall "^" '{"ha-mode":"all"}'

这样镜像模式就设置成功了,在任意节点发送消息后,集群节点消息同步。

除了以上方式设置镜像模式以外,还可以在管理页面设置

HAProxy负载均衡

虽然我们在程序中访问A服务器,可以实现消息的同步,虽然在同步,但都是A服务器在接收消 息,A太累。

是否可以想Nginx一样,做负载均衡,A和B轮流接收消息,再镜像同步。

安装和配置

HAProxy下载:http://www.haproxy.org/download/1.8/src/haproxy-1.8.12.tar.gz

解压

[root@localhost opt]# tar -zxvf haproxy-1.8.12.tar.gz

make时需要使用 TARGET 指定内核及版本

[root@localhost opt]# uname -r

​ 根据内核版本选择编译参数

进入目录,编译和安装

[root@localhost opt]# cd haproxy-1.8.12
[root@localhost haproxy-1.8.12]# make TARGET=linux2628
[root@localhost haproxy-1.8.12]# make install PREFIX=/usr/local/haproxy

安装成功后,查看版本

[root@localhost haproxy-1.8.12]# /usr/local/haproxy/sbin/haproxy -v

配置启动文件,复制haproxy文件到/usr/sbin下 ,复制haproxy脚本,到/etc/init.d下

[root@localhost haproxy-1.8.12]# cp /usr/local/haproxy/sbin/haproxy /usr/sbin/

[root@localhost haproxy-1.8.12]# cp ./examples/haproxy.init /etc/init.d/haproxy

[root@localhost haproxy-1.8.12]# chmod 755 /etc/init.d/haproxy

创建系统账号

[root@localhost haproxy-1.8.12]# useradd -r haproxy

haproxy.cfg 配置文件需要自行创建

[root@localhost haproxy-1.8.12]# mkdir /etc/haproxy
[root@localhost haproxy-1.8.12]# vim /etc/haproxy/haproxy.cfg

添加配置信息到haproxy.cfg

#全局配置
global
#设置日志
log 127.0.0.1 local0 info
#当前工作目录
chroot /usr/local/haproxy
#用户与用户组
user haproxy
group haproxy
#运行进程ID
uid 99
gid 99
#守护进程启动
daemon
#最大连接数
maxconn 4096
#默认配置
defaults
#应用全局的日志配置
log global
#默认的模式mode {tcp|http|health},TCP是4层,HTTP是7层,health只返回OK
mode tcp
#日志类别tcplog
option tcplog
#不记录健康检查日志信息
option dontlognull
#3次失败则认为服务不可用
retries 3
#每个进程可用的最大连接数
maxconn 2000
#连接超时
timeout connect 5s
#客户端超时30秒,ha就会发起重新连接
timeout client 30s
#服务端超时15秒,ha就会发起重新连接
timeout server 15s
#绑定配置
listen rabbitmq_cluster
bind 192.168.204.143:5672
#配置TCP模式
mode tcp
#简单的轮询
balance roundrobin
#RabbitMQ集群节点配置,每隔5秒对mq集群做检查,2次正确证明服务可用,3次失败证
明服务不可用
server A 192.168.204.141:5672 check inter 5000 rise 2 fall 3
server B 192.168.204.142:5672 check inter 5000 rise 2 fall 3
#haproxy监控页面地址
listen monitor
bind 192.168.204.143:8100
mode http
option httplog
stats enable
# 监控页面地址 http://192.168.204.143:8100/monitor
stats uri /monitor
stats refresh 5s

启动HAProxy

[root@localhost haproxy]# service haproxy start

访问监控中心:http://192.168.204.143:8100/monitor

记得关闭防火墙: systemctl stop firewalld

项目发消息,只需要将服务器地址修改为143即可,其余不变

所有的请求都会交给HAProxy,其负载均衡给每个rabbitmq服务器

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5715689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存