9.1. RabbitMQ集群架构模式
-
主备模式
用来实现RabbitMQ的高可用集群,一般是在并发和数据不是特别多的时候使用,当主节点挂掉以后会从备份节点中选择一个节点出来作为主节点对外提供服务。
-
远程模式
主要用来实现双活,简称为Shovel模式,所谓的Shovel模式就是让我们可以把消息复制到不同的数据中心,让两个跨地域的集群互联。
-
镜像队列模式
镜像队列也被称为Mirror队列,主要是用来保证mq消息的可靠性的,他通过消息复制的方式能够保证我们的消息100%不丢失,同时该集群模式也是企业中使用最多的模式。
-
多活模式
多活模式主要是用来实现异地数据复制,Shovel模式其实也可以实现,但是他的配置及其繁琐同时还要受到版本的限制,所以如果做异地多活我们更加推荐使用多活模式,使用多活模式我们需要借助federation插件来实现集群与集群之间或者节点与节点之前的消息复制,该模式被广泛应用于饿了么、美团、滴滴等企业。
-
集群模式总结
主备模式下主节点提供读写,从节点不提供读写服务,只是负责提供备份服务,备份节点的主要功能是在主节点宕机时,完成自动切换 从–>主,同时因为主备模式下始终只有一个对外提供服务那么对于高并发的情况下该模式并不合适.
远程模式可以让我们实现异地多活的mq,但是现在已经有了更好的异地多活解决方案,所以在实际的项目中已经不推荐使用了
镜像队列模式可以让我们的消息100%不丢失,同时可以结合HAProxy来实现高并发的业务场景所以在项目中使用得最多
9.2. 镜像队列集群搭建
-
集群节点规划
ip地址 用途 主机名 192.168.13.101 mq 主节点 server1 192.168.13.102 mq 从节点 server2 192.168.13.103 mq 从节点 server3 192.168.13.104 HAProxy KeepAlive server4 192.168.13.105 HAProxy KeepAlive server5
特别注意: 每个同学的ip可能都是不一样的,各个学员根据自己的ip进行规划,同时特别注意主机名称,因为我们后面的命令中会使用到所以需要提前设置好。
需要配置主机名的映射:
vi /etc/hosts
2. 复制主节点的.erlang.cookie文件到其他所有的从节点
主节点:
```shell
#停止mq的运行 | systemctl stop rabbitmq-server
/etc/init.d/rabbitmq-server stop
#机器之间通信借助于erlang进行消息传输,所以要求集群中所有节点必须有相同的erlang.cookie
#将主节点的文件同步到到192.168.13.102和192.168.13.103中
scp /var/lib/rabbitmq/.erlang.cookie 192.168.13.102:/var/lib/rabbitmq
scp /var/lib/rabbitmq/.erlang.cookie 192.168.13.103:/var/lib/rabbitmq
然后去了102与103上修改权限:分别执行如下
chmod 400 /var/lib/rabbitmq/.erlang.cookie
```
-
将从节点添加到主节点的集群中
# 如果每个节点还没有启动的 先启动 : systemctl start rabbitmq-server server2:rabbitmqctl stop_app #server2节点添加到server1所在集群,--ram 指定消息以内存的方式存储,如果不指定默认为磁盘存储 server2:rabbitmqctl join_cluster --ram rabbit@server1 server2:rabbitmqctl start_app server3配置同上
-
查看集群的状态
rabbitmqctl cluster_status
5. 访问集群中的任何一个节点的控制台查看集群情况
-
设置镜像队列策略
# 将所有队列设置为镜像队列,即队列会被复制到各个节点: 主节点执行 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
-
在管控台创建一个队列然后发送一条消息查看其他节点是否接收到
-
修改集群信息
#在任何一个节点上执行该命令修改集群的名字 rabbitmqctl set_cluster_name rabbitmq_cd_itcast #在非server2的节点上执行可以移除server2节点 rabbitmqctl forget_cluster_node rabbit@server2 # 修改了信息以后可以查看修改是否成功 rabbitmqctl cluster_status
-
总结
到此为止我们的镜像队列的集群就搭建完成了,主要注意.erlang.cookie文件的同步和集群命令的书写
9.3. HAProxy 实现镜像队列的负载均衡
-
HAProxy 简介
HAProxy是一款提供高可用性、负载均衡以及基于TCP和HTTP应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。
HAProxy适用于那些负载较大的web站点,这些站点通常又需要会话保持或七层处理。
HAProxy可以支持数以万计的并发连接,并且HAProxy的运行模式使得它可以很简单安全的整合进架构中,同时可以保护web服务器不被暴露到网络上。
-
HAProxy 的规划(搭建2台是为后面做HAProxy高可用做准备)
ip 用途 主机名 192.168.13.104 HAProxy server4 192.168.13.105 HAProxy server5 -
HAProxy 的安装
#下载依赖包 - 如果已安装可以跳过 yum install gcc vim wget # 下载haproxy wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz #解压 tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local #进入目录、进行编译、安装 cd /usr/local/haproxy-1.6.5 make TARGET=linux31 PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy #用来存放配置文件 mkdir /etc/haproxy #赋权 groupadd -r -g 149 haproxy useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy #创建haproxy配置文件 touch /etc/haproxy/haproxy.cfg
-
HAProxy 的配置
104机器ha配置
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
# ha的安装地址
chroot /usr/local/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
#使用4层代理模式,”mode http”为7层代理模式
mode tcp
#if you set mode to tcp,then you nust change tcplog into httplog
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
##客户端空闲超时时间为 30秒 则HA 发起重连机制
clitimeout 30s
##服务器端链接超时时间为 15秒 则HA 发起重连机制
srvtimeout 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 192.168.13.104:5672
#配置TCP模式
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
#简单的轮询
balance roundrobin
#rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
server server1 192.168.13.101:5672 check inter 5000 rise 2 fall 2
server server2 192.168.13.102:5672 check inter 5000 rise 2 fall 2
server server3 192.168.13.103:5672 check inter 5000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
bind 192.168.13.104:8100 # 注意此处的ip地址,我们配置了2台机器
mode http
option httplog
stats enable
#设置haproxy监控地址为http://192.168.13.104:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
105机器ha配置
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
# ha的安装地址
chroot /usr/local/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
#使用4层代理模式,”mode http”为7层代理模式
mode tcp
#if you set mode to tcp,then you nust change tcplog into httplog
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
##客户端空闲超时时间为 30秒 则HA 发起重连机制
clitimeout 30s
##服务器端链接超时时间为 15秒 则HA 发起重连机制
srvtimeout 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 192.168.13.105:5672
#配置TCP模式
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
#简单的轮询
balance roundrobin
#rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
server server1 192.168.13.101:5672 check inter 5000 rise 2 fall 2
server server2 192.168.13.102:5672 check inter 5000 rise 2 fall 2
server server3 192.168.13.103:5672 check inter 5000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
bind 192.168.13.105:8100 # 注意此处的ip地址,我们配置了2台机器
mode http
option httplog
stats enable
#设置haproxy监控地址为http://192.168.13.105:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
-
启动HAproxy
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg #查看haproxy进程状态 ps -ef | grep haproxy
-
访问HAproxy( 如果不能访问看下防火墙是否关闭)
关闭集群中的某一个节点:
再次查看HAProxy的管理控制台:
-
编写程序测试负载均衡
-
生产者一端申明交换机和队列,并完成绑定
<rabbit:queue id="itemQueue" name="item_queue" auto-declare="true"/> <rabbit:topic-exchange id="itemTopicExchange" name="item_topic_exchange" auto-declare="true"> <rabbit:bindings> <rabbit:binding pattern="item.#" queue="itemQueue"/> </rabbit:bindings> </rabbit:topic-exchange>
-
application.yml配置文件(重要)
#Rabbitmq的配置 spring: rabbitmq: host: 192.168.13.104 #这个是HA服务器地址 port: 5672 virtual-host: / username: guest password: guest
-
在生产者一端编写测试方法发送消息
@Test public void testHA(){ for (int i=0; i<2; i++) //效果不明显可以加大发送的数据,发送的时候一定要盯着HA { rabbitTemplate.convertAndSend("item_topic_exchange", "item.insert", "商品新增,路由Key为item.insert" +i); } }
-
测试结果(连续发送了2条消息一条被server1接收一条被server2接收,)
-
9.4. KeepAlived 搭建高可用的HAProxy集群
-
KeepAlived 简介
Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx、Haproxy等反向代理的负载均衡服务器配合实现web服务端的高可用。Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA).VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。
-
KeepAlived 的安装
#安装所需软件包 yum install -y openssl openssl-devel #下载安装包 wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz #解压、编译、安装 tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/ cd /usr/local/keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived make && make install # 将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作 #首先创建文件夹,将keepalived配置文件进行复制: mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ #然后复制keepalived脚本文件: cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ # 设置的过程中如果出现已经存在则删除原有的文件,重新创建 ln -s -f /usr/local/sbin/keepalived /usr/sbin/ ln -s -f /usr/local/keepalived/sbin/keepalived /sbin/ #可以设置开机启动:chkconfig keepalived on,到此我们安装完毕! chkconfig keepalived on
-
KeepAlived 的配置
vim /etc/keepalived/keepalived.conf ###############具体配置 ! Configuration File for keepalived global_defs { router_id server4 ##标识节点的字符串,通常为本机hostname } vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" ##执行脚本位置 interval 2 ##检测时间间隔 weight -20 ##如果条件成立则权重减20 } vrrp_instance VI_1 { state MASTER ## 主节点为MASTER,备份节点为BACKUP-该配置非常重要 interface ens33 ## 绑定虚拟IP的网络接口(网卡可以使用ifconfig查看) virtual_router_id 110 ## 虚拟路由ID号(主备节点一定要相同)-该配置非常重要 mcast_src_ip 192.168.13.104 ## 本机ip地址 priority 100 ##优先级配置(0-254的值),一般主节点的权重大于备份节点 nopreempt advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s authentication { ## 认证匹配 auth_type PASS auth_pass 123456 } track_script { chk_haproxy } virtual_ipaddress { 192.168.13.110 ## 虚拟ip,可以指定多个,以后连接mq就使用该虚拟ip进行连接 } }
-
编写执行脚本(一定要赋权否则不能执行)
#添加文件位置为/etc/keepalived/haproxy_check.sh #!/bin/bash COUNT=`ps -C haproxy --no-header |wc -l` if [ $COUNT -eq 0 ];then /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg sleep 2 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
-
执行脚本赋权
chmod +x /etc/keepalived/haproxy_check.sh
-
启动keepalived
#启动两台机器的keepalived service keepalived start | stop | status | restart #查看状态 ps -ef | grep haproxy ps -ef | grep keepalived
-
查看keepalived启动状态
-
查看keepalived启动状态
server5是备份节点,没有虚拟IP的。
-
停止server4节点的keepalived查看我们的虚拟ip是否漂移到了server5
server4停止,ip地址就没有了;
查看server5可以发现ip地址分配到该服务器:
-
编写程序连接虚拟ip查看我们的mq是否成功
-
修改application.yml文件
#Rabbitmq的配置 spring: rabbitmq: host: 192.168.13.110 port: 5672 virtual-host: / username: guest password: guest
-
启动测试
-
-