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服务器
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)