栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

RabbitMQ消息中间件技术精讲(五)

RabbitMQ消息中间件技术精讲(五)

第五章 RabbitMQ集群架构

文章目录

第五章 RabbitMQ集群架构

5.1-RabbitMQ集群架构模式-主备模式(Warren)5.2-RabbitMQ集群架构模式-远程模式(Shovel)5.3-RabbitMQ集群架构模式-镜像模式(Mirror)5.4-RabbitMQ集群架构模式-多活模式(Federation)5.5-RabbitMQ集群镜像队列构建实现可靠性存储

1.`RabbitMq集群环境节点`2.配置集群 5.6-RabbitMQ集群整合负载均衡基础组件HAProxy

1.介绍2.优点3.安装配置4.配置`haproxy.cfg`配置文件 5.7-RabbitMQ集群整合高可用组件KeepAlived

1.介绍2.高可用原理3.安装配置4.配置`keepalived.conf`5.执行脚本内容;6.启动`keepalived` 5.8-RabbitMQ集群配置文件详解5.9-RabbitMQ集群恢复与故障转移的5种解决方案5.10-RabbitMQ集群延迟队列插件应用

5.1-RabbitMQ集群架构模式-主备模式(Warren)

适用场景

一般在并发和数据量不高的情况下,主备模式具有非常好用且简单的优点

主备模式,主节点提供读写,从节点不支持读和写,只当做备用节点,当主节点发生故障,从节点转换为主节点;主从模式,主节点提供读写,从节点不支持写,但支持读

所谓的主备,就是warren兔子窝模式,就是一个主/备方案(主节点如果挂了,从节点提供服务,和activemq利用zookeeper做主/备一样)

HaProxy配置

listen rabbitmq_cluster  # 集群名称
bind 0.0.0.0:5672   
mode tcp   # 配置 tcp 模式
balance roundrobin  #简单的轮询
server bhz76 192.168.2.58:5672 check inter 5000 rise 2 fall 3         # 主节点
server bhz76 192.168.2.63:5672 backup check inter 5000 rise 2 fall 3  # 备用节点
# inter 每隔5秒对mq集群进行健康检测,2次正确心跳表示服务器可用,3次失败心跳表示服务器不可用
5.2-RabbitMQ集群架构模式-远程模式(Shovel)

远程模式可以实现双活的一种模式,简称Shovel模式,所谓远程模式,就是我们可以把消息进行不同数据中心的复制工作,我们可以跨地域的让两个mq集群互联,目前很少使用

集群配置

# 首先启动rabbitmq 插件,命令如下
rabbitmq-plugins enable amqp_client
rabbitmq-plugins enable rabbitmq_shovel
# 创建rabbitmq.config配置文件
touch /etc/rabbitmq/rabbitmq.config
# 添加配置,详情见图
# 源服务器,和远程目标服务器使用相同的RabbitMQ配置文件

5.3-RabbitMQ集群架构模式-镜像模式(Mirror)

镜像模式,非常经典的模式,可以保证数据100%不丢失,在实际工作中使用最多。并且镜像模式配置非常简单,一般互联网大厂都会采用这种集群模式镜像队列,目的是为了保障rabbitmq数据的高可靠性解决方案,主要是为了实现数据的同步,一般来说是2-3个节点实现数据同步,集群架构如下:
5.4-RabbitMQ集群架构模式-多活模式(Federation)

多活模式,是实现异地数复制的主流模式,因为远程模式配置比较复杂,所以一般异地集群采用多活模式。这种模式需要依赖RabbitMQ的federation插件,可以实现持续的可靠的AMQP数据通信,并且多活模式配置简单

部署采用双中心(或多中心),那么在两套(或多套)数据中心中个部署一套RabbitMQ集群,各中心的RabbitMQ服务除了需要为业务提供正常的消息服务外,中心之间还需要实现部分队列消息共享

federation 插件是一个不需要构建Cluster,而在Brokers之间传输消息的高性能插件,连接双方可以使用不同的users和virtual hosts,双方也可以使用不同版本的rabbitmq和Erlang,该插件使用的是AMQP协议,可以接受不连续的传输

5.5-RabbitMQ集群镜像队列构建实现可靠性存储

目标

高可扩展性 (搭建镜像队列,可以进行水平扩展)

数据安全冗余 (在镜像队列基础上,设置镜像策略,使得每个节点的数据一致性)

高可用 (在镜像队列基础上,使用Haproxy进行负载均衡,再使用Keepalived负载均衡,保证单点故障时集群依然有效)

1.RabbitMq集群环境节点
服务器iphostname节点说明端口管控台地址
192.168.1.1Bhz1master5672ip:15672
192.168.1.2Bhz2slave5672ip:15672
192.168.1.3Bhz3slave5672ip:15672
192.168.1.4Bhz4haproxy+keepalived8100ip:8100/rabbitmq-stats
192.168.1.5Bhz5haproxy+keepalived8100ip:8100/rabbitmq-stats
2.配置集群

方法一:需要三台虚拟机,使用rpm安装方式,构建集群(笔者没测试)

方法二:使用一台机器安装3个节点的集群,使用docker-compose进行构建集群(亲测)

方法三:使用K8S进行,在三台服务器上构建集群

k8s可以自动化调度、运维docker容器

k8s已经成为微服务基础架构的“事实标准”

容器编排

pod: k8s最小业务单元,内含一个或多个容器

StatefulSet:定义一组有状态pod,k8s将自动维护,比如RabbitMQ容器停止了,k8s将自动重启

Deployment:定义一组无状态pod,k8s将自动维护

Service:一组pod的抽象访问方式,相当于负载均衡器

5.6-RabbitMQ集群整合负载均衡基础组件HAProxy 1.介绍

HaProxy是一款提供高可用、负载均衡以及基于TCP第四层和Http第七层应用的代理软件,支持虚拟机,免费(已经有商业版和社区版了)。支持数万的并发连接,并且很简单安全的整合到当前架构中,同时保护web服务器不会暴露到网络上 2.优点

单进程、事件驱动模型,显著降低了上下文切换的开销和内存占用单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,可以节约大量的CPU时钟周期和内存带宽借助Linux操作系统,实心零拷贝(zero-copy)可实现即时内存分配采用树形存储(二叉树) 3.安装配置

# 1. 下载依赖包
yum install gcc vim wget
wget https://www.haproxy.org/download/1.6/src/haproxy-1.6.16.tar.gz
# 2. 解压到指定目录
tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local
# 3. 进入目录、进行编译、安装
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
# 4. 创建配置文件,并进行配置,详情如下,配置时注意1.4和1.5两台服务器都是要配置
touch /etc/haproxy/haproxy.cfg
# 5. 启动haproxy,指定配置文件启动
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
# 查看haproxy 进程状态
ps -ef |gref haproxy
# 6. 访问haproxy管控台    http:192.168.1.4:8100/rabbitmq-stats
4.配置haproxy.cfg配置文件
# 更改配置文件haproxy.cfg,可参考:https://www.cnblogs.com/zyd112/p/8888945.html
# 全局配置
global
   log 127.0.0.1 local3 info
   maxconn 100000
   chroot /usr/local/haproxy(安装地址)
   # user haproxy
   uid 99
   gid 99
   # group haproxy
   daemon          # 设置为后台进程
   quiet 
   nbproc 4        # 进程数量(可以设置多个进程提高性能) 
   ulimit-n 65535  # ulimit的数量限制
   pidfile /var/run/haproxy.pid 
# 默认配置
defaults
	# mode 有tcp 和 http 两种模式
    mode                    tcp 
    log                     global
    option                  tcplog
    option                  dontlognull
    option                  redispatch
    retries                 3
    maxconn                 500
    timeout connect         10s
    # 客户端空闲超过1分钟,则HA发起重连
    timeout client          1m
    # 服务端超时1分钟,则HA发起重连
    timeout server          1m
    timeout check           10s
# Haproxy控制台管理
listen admin_stats
   stats    enable
   bind     192.168.1.4:8100
   mode     http
   option   httplog
   log      global
   maxconn  10
   stats    refresh 5s  # 统计页面自动刷新时间
   stats    uri /rabbitmq-stats  # 访问的uri:ip:8100/rabbitmq-stats
   stats    realm haproxy
   #stats    auth admin:rabbitmq  # 认证用户名和密码
   #stats    hide-version  # 隐藏HAProxy的版本号
   #stats    admin if TRUE  # 管理界面,如果认证成功了,可通过webui管理节点

# 监听rabbit集群
frontend rabbitmq_cluster
   bind 0.0.0.0:5672
   mode tcp  # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK  
   option redispatch  # 当serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
   option abortonclose  # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
   balance roundrobin  # 负载均衡算法 (简单轮询机制)
   server Bhz1 192.168.1.1:5672 check inter 5000 rise 2 fall 3 
   server Bhz2 192.168.1.2:5672 check inter 5000 rise 2 fall 3 
   server Bhz3 192.168.1.3:5672 check inter 5000 rise 2 fall 3 
   maxconn 100000  # 最大链接数
   timeout connect 60s  # 连接超时 
   timeout client  30000  # 客户端超时
   timeout server  30000  #服务器超时   

扩展:Nginx和HAProxy对比,各有什么优点与不足?

扩展:Haproxy用法详解配置

5.7-RabbitMQ集群整合高可用组件KeepAlived 1.介绍

keepalived是通过VRRP协议实现高可用功能。VRRP = virtual router redundancypProtocol虚拟路由器冗余协议,目的是解决静态路由单点故障问题,保证在个别节点宕机时,整个网络可以不间断运行主要作用有两个,一方面具有管理LVS负载均衡的功能,同时对LVS集群节点进行健康检查功能;另一方面可实现系统网络服务的高可用failover 2.高可用原理

主节点会不断向从节点发送(播发方式)心跳,用来告诉从节点自己还活着当主节点发生故障时,无法发送心跳检测,从节点无法得知主节点是否正常,于是调用自身接管程序,接管主节点的ip资源和服务当主节点恢复时,从节点又会恢复到原来的备用角色(这点跟redis集群架构的主观下线和客观下线不同,即使主节点恢复,也会作为从节点) 3.安装配置

# 1. 下载软件包
yum install -y openssl openssl-devel
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
# 2. 解压、编译、安装
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local
cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
make && make install
# 创建文件夹,将keepalived配置文件进行复制
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keeplived/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 /usr/local/sbin/keepalived /usr/sbin/
# 如果存在则进行删除  rm /sbin/keepalived
ln -s /usr/local/keepalived/sbin/keepalived  /sbin/
# 设置开机自启动
chkconfig keepalived on
# 3. 配置keepalived配置文件
vim /etc/keepalived/keepalived.conf
4.配置keepalived.conf
# 主节点
global_defs
{
router_id Bhz4   # 节点名字
}


vrrp_script chk_haproxy {  
        script "/etc/keepalived/haproxy_check.sh"   # 执行脚本位置  
        interval 2   # 检测时间间隔
        weight  -20    # 如果条件成立则权重减少20
}
  
vrrp_instance VI_1 {
state MASTER	 # 主节点为MASTER,备份节点为BACKUP
interface eth0    #这个要和本机网卡名字一样
virtual_router_id 4    #虚拟路由ip号,这个数值 master和slave必须统一,我们一般选择主节点的ip地址后两位
mcast_src_ip   192.168.11.79  # 本机ip地址
priority 100     # 优先级配置(0-254)这个数值决定哪台服务器是master 
advert_int 1     # 组播信息发送间隔,测试中的两个keepalived节点必须保持一致,1s
nopreempt
authentication { # 认证匹配
        auth_type PASS
        auth_pass 123456  # 指定密码
        }
virtual_ipaddress {
        192.168.1.11   #  虚拟ip,可以指定多个
        }
track_script {  
        chk_haproxy  
} 
}

#从节点
global_defs
{
router_id Bhz5   # 节点名字
}

vrrp_script chk_haproxy {  
        script "/etc/keepalived/haproxy_check.sh"   # 执行脚本位置  
        interval 2   # 检测时间间隔
        weight  -20    # 如果条件成立则权重减少20
}
  
vrrp_instance VI_1 {
state BACKUP	 # 主节点为MASTER,备份节点为BACKUP
interface eth0    #这个要和本机网卡名字一样
virtual_router_id 4    #虚拟路由ip号,这个数值 master和slave必须统一,我们一般选择主节点的ip地址后两位
mcast_src_ip   192.168.11.80  # 本机ip地址
priority 90     # 优先级配置(0-254)这个数值决定哪台服务器是master 
advert_int 1     # 组播信息发送间隔,测试中的两个keepalived节点必须保持一致,1s
nopreempt
authentication { # 认证匹配
        auth_type PASS
        auth_pass 123456  # 指定密码
        }
virtual_ipaddress {
        192.168.1.11   #  虚拟ip,可以指定多个
        }
track_script {  
        chk_haproxy  
} 
}
5.执行脚本内容;
#!/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

6.启动keepalived
# 启动,如果4,5两个节点没有启动haproxy,则运行
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
# 查看 haproxy 进程状态
ps -ef | grep haproxy
# 启动两台服务器的 keepalived
service keepalived start | stop | status | restart 
# 查看状态
ps -ef | grep haproxy
ps -ef | grep keepalived
5.8-RabbitMQ集群配置文件详解

集群节点模式:Disk为磁盘模式存储;Ram为内存模式存储

tcp_listerners 设置rabbitmq监听端口,默认5672

disk_free_limit 磁盘低水位线, 若磁盘容量低于指定值,则停止接收数据,默认值{mem_relative,1.0}

vm_memory_high_watermark 设置内存低水位线,若低于该水位线,则开启流量控制,默认值是0.4,即内存总量的40%

详细官网配置:https://www.rabbitmq.com/configure.html

5.9-RabbitMQ集群恢复与故障转移的5种解决方案

准备条件:A节点和B节点组成镜像队列模式场景1:A从节点先停,B主节点后停方案1:只要先启动B主节点,在启动A从节点就可以;或者先启动A从节点,在30秒内启动B主节点,也可以恢复成镜像队列场景2:A和B同时停机方案2:可能是由于机房停电造成的,只需要在30秒内连续启动A和B就可以场景3:A从节点先停,B主节点后停,并且A无法恢复方案3:先启动B主节点,在B服务器上,调用命令rabbitmqctl forget_cluster_node A 从集群中解除A,在将新的从节点比如C加入集群中就可以场景4:A从节点先听,B主节点后停,且B无法恢复方案4:在3.4.2版本之后,启动A节点,执行rabbitmqctl forget_cluster_node --offline B,表明利用从节点剔除主节点,迫使A节点变为主节点,在将新的从节点比如C加入以A为主节点的集群中方案5:A先停,B后停,且AB都无法恢复,但是能得到A和B的磁盘文件方案5:只能通过恢复数据的方式来尝试恢复,默认的数据库文件地址为$RABBIT_HOME/var/lib 5.10-RabbitMQ集群延迟队列插件应用

使用场景:消息的延迟投递、定时任务等。包括一些消息重试策略的配合使用,以及用于业务流量削锋限流、降级的异步延迟消息机制

# 1. 下载插件
# 所有插件地址
https://www.rabbitmq.com/community-plugins.html
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.9.0/rabbitmq_delayed_message_exchange-3.9.0.ez
# 2. 将下载的文件放到指定目录
docker cp ./rabbitmq_delayed_message_exchange-3.9.0.ez rabbitmq1:/plugins
# 3. 启动插件
# 进入容器
docker exec -it rabbitmq1 /bin/bash
# 启动插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
# 查看插件列表
rabbitmq-plugins list
# 4. 访问地址进行测试
ip:port  在添加交换机的时候,可以看到多了一种方式(x-delayed-message)
    在主节点创建延迟交换机,创建完后会发现在两个子节点也有相同的交换机和队列,说明同步策略是成功的

    创建普通队列,并将队列和交换机进行绑定,在管控台操作就可以
![在这里插入图片描述](https://img-blog.csdnimg.cn/c2971052f3a44ab1bed9224daae337e7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQWxwaGEtY2hlbg==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
    规定之间之后,队列接收到相应的信息
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/758477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号