起因:在实际项目开发过程中,需要使用RabbitMQ来实现消息队列的功能,但仅仅实现功能之后并不能对自己满足,既然学一次,就要更深的了解她,吃一吃架构方面的相关内容,提升自己。
1. 镜像集群宕机恢复方式
RabbitMQ在镜像集群中,机器其实是平行关系,所有的节点都是互相复制的
场景描述:
A是Master
B是Slave
A正常运行,B宕机了,只需要启动B即可,B就会自动加入集群
A和B都宕机了,只要A在B之前启动就可以了
A和B都宕机了,A启动不起来了,即便是B启动了,有可以B直接启动不了啦
B和C都加入了A为Master的集群,这个时候都需要将B和C从A的集群中forget,B和C启动不起来了
# 服务都不可用的情况下,这个命令是无法执行
rabbitmqctl forget_cluster_node rabbit@RMQ146
RabbitMQv3.2版本以后提供了一个离线清除集群节点的命令参数,也就是节点无法启动状态下
# rabbitmq会在当前这个无法启动的节点上Mock一个虚拟节点来提供服务,实现cluster的forget
rabbitmqctl forget_cluster_node --offline rabbit@RMQ146
2. 使用HAProxy实现镜像集群负载均衡
HAProxy是一款提供高可用的负载均衡器(之前大家都是使用的Nginx居多,upstream反向代理实现负载均衡非常容易),HAProxy可以基于TCP四层(Lvs也是TCP四层的),HTTP七层(Nginx是HTTP七层)的负载均衡应用代理软件,免费高速可靠的一种LBS解决方案
HAProxy的并发连接完全可以支持以万为单位的
2.1. HAProxy性能最大化的原因
-
单进程,降低了上下文的切换开销和内存占用
-
单缓冲机制能以不复制任何数据的方式下完成读写操作,这会大大节约CPU时钟和内存带宽
-
HAProxy可以实现零复制的零启动
-
树形存储,使用弹性二叉树
-
内存分配器在固定大小的内存池中实现即时内存分配,减少创建会话的时长
2.2. HAProxy和Nginx的最大区别
Nginx
优点:
1、工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名、目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行。
2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能。
3、Nginx安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来。
4、可以承担高负载压力且稳定,硬件不差的情况下一般能支撑几万次的并发量。
5、Nginx可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点。
6、不仅仅是优秀的负载均衡器/反向代理软件,同时也是强大的Web应用服务器。可作为静态网页和图片服务器,在高流量环境中稳定性也很好。
7、可作为中层反向代理使用。
缺点:
1、适应范围较小,仅能支持http、https、Email协议。
2、对后端服务器的健康检查,只支持通过端口检测,不支持url来检测
3、负载均衡策略比较少:轮询、权重、IP_hash、url_hash
HAProxy
优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段)
2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。
5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种
-
roundrobin:轮询
-
leastconn:连接数最少的服务器优先接收连接
-
static-rr:每个服务器根据权重轮流使用
-
source:对请求源IP地址进行哈希
-
uri:表示根据请求的URI左端(问号之前)进行哈希
-
url_param:在HTTP GET请求的查询串中查找<param>中指定的URL参数,基本上可以锁定使用特制的URL到特定的负载均衡器节点的要求
-
hdr(name):在每个HTTP请求中查找HTTP头<name>,HTTP头<name>将被看作在每个HTTP请求,并针对特定的节点;如果缺少头或者头没有任何值,则用roundrobin代替
-
rdp-cookie(name):为每个进来的TCP请求查询并哈希RDP cookie<name>;该机制用于退化的持久模式,可以使同一个用户或者同一个会话ID总是发送给同一台服务器。如果没有cookie,则使用roundrobin算法代替
缺点:
1、不支持POP/SMTP协议
2、不支持SPDY协议
3、不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。
4、重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。
5、多进程模式支持不够好
3.3. 安装HAProxy
HAProxy+Keepalived(负载均衡节点的高可用)
# 安装依赖
yum -y install gcc gcc-c++
# 下载安装包
wget https://www.haproxy.org/download/1.6/src/haproxy-1.6.15.tar.gz
# 解压
tar -zxvf haproxy-1.6.15.tar.gz -C /usr/local/
# 进入安装目录
cd /usr/local/haproxy-1.6.15/
# 安装 linux31可以使用 uname -r 查看
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
# 核心配置文件的创建
touch /etc/haproxy/haproxy.cfg
3.4. haproxy.cfg配置文件编写
global
log 127.0.0.1 local0 info # 日志存储到127.0.0.1,以local0输入info级别
maxconn 4096 # 最大连接数,要考虑到ulimit -n的大小限制
chroot /usr/local/haproxy # haproxy的安装目录
user haproxy
group haproxy
daemon
nbproc 2 # 进程数
pidfile /var/run/haproxy.pid # pid文件位置
defaults
log global
mode tcp # 使用tcp4层代理模式
option tcplog
option dontlognull
retries 3
# 在使用基于cookie定向时,一旦后端某一server宕机时,会将会话重新定向至某一上游服务器,必须使用的选项
option redispatch
maxconn 4096
timeout connect 5s
timeout client 60s #客户端空闲超时时间
timeout server 15s #服务端超时时间
listen rabbitmq_cluster
bind 0.0.0.0:5672
mode tcp
balance roundrobin #采用轮询机制,还可以是其他的负载均衡方式
#rabbitmq集群节点配置,inter每隔3秒对MQ集群做健康检查,
server RMQ164 192.168.0.164:5672 check inter 3000 rise 2 fall 2
server RMQ165 192.168.0.165:5672 check inter 3000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
bind 192.168.0.168:8999 #这里得配置内网IP,然后用外网IP访问即可
mode http
option httplog
stats enable
#设置haproxy监控地址为http://39.101.209.123:8999/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 3s
将上面的配置文件内容放入 /etc/haproxy/haproxy.cfg中
启动HAProxy
# 进入安装目录
cd /usr/local/haproxy/sbin
./haproxy -f /etc/haproxy/haproxy.cfg
3. 使用Federation跨机房多活集群模式

# 首先准备两个非集群节点
rabbitmq-plugins list
# rabbitmq_federation
# rabbitmq_federation_management
# 两台联通的机器都要启动这两个插件
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
启用成功后可以到控制台进行验证

通过federation的配置来进行数据通道搭建
这个时候你需要自己定义一个上游节点upstream(166节点),一个下游节点downstream(167节点),federation是单向发送的,相当于消息发送到upstream的一个exchange上,然后转发到downstream的queue上
1、在下游节点创建一个exchage和一个queue和binding的routingkey,用来进行数据接收
2、在下游节点建立federation upstream规则和上游节点进行数据同步

3、进入下游节点的federation status没有任何数据,需要建立策略来保证通道连通
4、进入下游节点的Policy菜单,Pattern是个正则表达式,这里表示以down开头的exchange和queue都匹配

5、这个时候看exchange和queue,规则就应用上了

6、这个时候去federation status看,发现上游连接已经连接上了

7、这个时候我们先去看上游的overview

8、再看上游的exchange和queue就已经根据下游配置的upstream和policy规则将exchange和queue创建好了

灰色的这个重定向exchange不能发送消息,如果要发送则在down-exchange上进行发送
9、我们在上游的down-exchange发送一条消息,进行测试

可以在下游查看这条消息

10、因为上游及节点只是一个中转,如果上游及诶单也要消息down-exchange里的消息怎么办?
只需要在本地建立一个binding关系就好

不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论