前言
生产环境中连接单节点服务是比较危险的情况,一旦服务宕机则会出现前端用户访问失败的情况,而且只连单机服务容易造成单机负载过高导致服务响应过慢,使用Rabbitmq集群则能够避免这种情况,同时通过haProxy实现负载均衡,再使用keepalived服务实现虚拟IP漂移,任一节点服务宕机均不会影响服务的正常运行,对于业务要求度比较高的场合适合此种模式,尤其是7x24的服务。
一、配置信息
- 本次服务安装涉及的中间件信息、服务器信息如下表所示:
IP | 主机名 | 操作系统 | 用途 |
---|---|---|---|
80.31.102.15 | cd15 | Centos 7.6 | MQ集群节点 |
80.31.102.18 | cd18 | Centos 7.6 | MQ集群节点 |
80.31.102.22 | cd22 | Centos 7.6 | MQ集群节点 |
80.85.6.4 | dy04 | Centos 7.6 | haproxy+keepalived |
80.85.6.6 | dy06 | Centos 7.6 | haproxy+keepalived |
- 集群规划图如下所示:
- 本次安装的rabbitmq3.8.1、haproxy-1.9.5、keepalived-2.1.5均提供下载地址,也可自行选择其他版本,或者直接使用yum -y install命令进行安装 ,楼主选择源码安装的原因主要是方便管理,建议各位在实际生产中尽量使用源码安装,方便后期运维管理
#Rabbitmq
链接地址: https://pan.baidu.com/s/1CUxFJX8oMsRd9tPeIqLUmg
提取码: 9tbr
#haproxy+keepalived
链接地址:https://pan.baidu.com/s/1XSd9IlouPjp9V0e31tHPQw
提取码: spk8
二、安装
Rabbitmq集群
安装配置Rabbitmq集群,需要先安装单节点rabbitmq服务,单机版服务安装可参照此项地址《Rabbitmq 单节点安装》
分别在上述三台服务器(80.31.102.15、80.31.102.18、80.31.102.22)上安装Rabbitmq单机服务。
1.MQ集群
- 更改主机信息
#1、修改主机名,三台主机都需要修改
hostnamectl set-hostname cd15
#2、修改/etc/hosts,新增如下内容
80.31.103.15 cd15
80.31.103.15 cd18
80.31.103.15 cd22
#3、三台主机的hosts文件都需要修改,重启完成后进行ping码测试,查看主机名是否相通
ping cd18
ping cd22
- 同步.erlang.cookie
#1、查看.erlang.cookie,源码安装的.erlang.cookie文件在用户的$HOME下,我这边编译安装erlang的用户是bph_zhdd
ls -a /home/bph_zhdd/.erlang.cookie
#2、使用scp将主节点.erlang.cookie同步到其他两个节点
scp -P 63322 /home/bph_zhdd/.erlang.cookie bph_zhdd@:/home/bph_zhdd
#3、也可人工修改.erlang.cookie,先更改.erlang.cookie权限,再人工修改
chmod 600 .erlang.cookie
- MQ集群搭建
#1、逐个启动节点,在三个服务器上分别执行
rabbitmq-server -detached
#2、将节点2(80.31.102.18以内存节点的方式加入节点1)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@cd15
rabbitmqctl start_app
#3、查看集群节点状态
rabbitmqctl cluster_status
#3、将节点2(80.31.102.22以磁盘节点的方式加入节点1)
rabbitmqctl stop_app
rabbitmqctl reset
#默认为磁盘节点
rabbitmqctl join_cluster rabbit@cd15
rabbitmqctl start_app
#3、查看集群节点状态
rabbitmqctl cluster_status
2.集群访问
- 使用google浏览器任一输入其中一台服务器ip:15672即可访问rabbitmq集群服务,集群访问如下图所示:
3. 配置镜像模式
上图搭建的Rabbitmq集群为普通模式(默认的集群模式),实际生产中需要把普通集群配置镜像模式以实现高可用。本文提供在前端Web页面配置镜像模式的方法,如下图所示:
Haproxy负载均衡
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
1.HA安装
#1、安装依赖环境
yum -y install gcc
#2、解压安装文件
tar -xvf haproxy-1.9.5.tar.gz
#3、编译,TARGRT为linux编译版本
uname -r #查看linux版本
make TARGRT=linux310 PREFIX=/Founder/haproxy
#安装
make install
2.配置文件
#1、创建配置文件目录
mkdir -p /Founder/haproxy/conf
#2、将配置文件从解压目录复制安装包conf目录下
cp /Founder/haproxy-1.9.5/examples/auth.cfg /Founder/haproxy/conf
#3、设置环境变量
echo "export PATH=$PATH:/Founder/haproxy/sbin" >> /home/bph_zhdd/.bash_profile
source /home/bph_zhdd/.bash_profile
#配置文件示例
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local0 info
pidfile /Founder/haproxy/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 # 最大连接数,默认4000
daemon # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为daemon
#---------------------------------------------------------------------
# defaults settings
#---------------------------------------------------------------------
# 注意:因为要使用tcp的负载,屏蔽掉与http相关的默认配置
defaults
mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global
# option httplog # 采用http日志格式
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
# option http-server-close # 每次请求完毕后主动关闭http通道
# option forwardfor except 127.0.0.0/8 # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 3 # 3次连接失败就认为服务不可用,也可以通过后面设置
# timeout http-request 10s
timeout queue 1m
timeout connect 10s # 连接超时时间
timeout client 1m # 客户端连接超时时间
timeout server 1m # 服务器端连接超时时间
# timeout http-keep-alive 10s
timeout check 10s
maxconn 3000 # 最大连接数
#--------------------------------------------------------
### haproxy 监控页面地址是:http://IP:9188/hastatus
listen admin_stats
bind *:9188 #监听的地址和端口,默认端口1080
mode http #模式
option tcplog
stats refresh 5s #页面自动刷新间隔,每隔5s刷新
stats uri /hastatus #访问路径,在域名后面添加/stats可以查看haproxy监控状态,默认为/haproxy?stats
stats realm welcome login\ Haproxy #提示信息,空格之前加\
stats auth admin:123456 #登陆用户名和密码
stats hide-version #隐藏软件版本号
stats admin if TRUE #当通过认证才可管理
#-------------------------------------------------
frontend rabbitmq
mode tcp
bind *:5679
timeout client 168h
default_backend rabbitmq_nodes
log global
option tcplog
backend rabbitmq_nodes
mode tcp
balance roundrobin
server rabbit1 80.31.102.15:5672 check inter 2000 rise 2 fall 3 weight 1 #节点一
server rabbit2 80.31.102.18:5672 check inter 2000 rise 2 fall 3 weight 1 #节点二
server rabbit3 80.31.102.22:5672 check inter 2000 rise 2 fall 3 weight 1 #节点三
#rabbitmq 集群配置
listen rabbitmq_admin
bind 0.0.0.0:15679
mode http
balance roundrobin
server rabbit1 80.31.102.15:15672 check inter 2000 rise 2 fall 3 weight 1 #节点一
server rabbit2 80.31.102.18:15672 check inter 2000 rise 2 fall 3 weight 1 #节点二
server rabbit3 80.31.102.22:15672 check inter 2000 rise 2 fall 3 weight 1 #节点三
#启动
haproxy -f /Founder/haproxy/conf/haproxy.cfg
#查看端口及进程
lsof -i:9188
3.访问
- 使用google浏览器输入IP:15679即可访问rabbitmq集群服务,如下图所示:
- IP:9188/hastatus,输入配置的用户名和密码即可访问haproxy监控界面,如下图所示:
3.HAproxy负载均衡配置已完成,再在80.85.6.6服务器上使用同样的操作安装haproxy软件,再配置haproxy.cfg配置文件。
Keepalived高可用
1.安装
#解压
tar -xvf keepalived-2.1.5.tar.gz
#编译
cd keepalived-2.1.5
./configure --prefix=/Founder/keepalived
#安装
make && make install
2.初始化及使用
#keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/
cp /Founder/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
# 将keepalived主程序加入到环境变量(安装目录下)
cp /Founder/keepalived/sbin/keepalived /usr/sbin/keepalived
# 将配置文件放到默认路径下,keepalived最好使用root用户来启动管理
mkdir /etc/keepalived
cp /Founder/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
#加为系统服务
chkconfig –add keepalived
#开机自启动
chkconfig keepalived on
3.keepalived.conf配置文件说明
keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三块:全局定义块、VRRP实例定义块和虚拟服务器定义块。全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是楼主的主备节点配置文件模板:
global_defs {
router_id LVS_DEVEL_A #虚拟路由名称,不同主机名需设置不同主机名
}
#HAProxy健康检查配置
vrrp_script chk_haproxy {
script "/etc/keepalived/keepalived.conf/scripts/haproxy_check.sh" #使用haproxy_check.sh检查haproxy服务
interval 2 #脚本运行周期
weight 2 #每次检查的加权权重值
}
#虚拟路由配置
vrrp_instance haproxy {
state MASTER #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
interface eth0 #本机网卡名称,使用ifconfig命令查看
virtual_router_id 51 #虚拟路由编号,主备机保持一致
priority 100 #本机初始权重,备机请填写小于主机的值(例如100)
advert_int 1 #争抢虚地址的周期,秒
virtual_ipaddress {
80.85.6.222 #虚地址IP,主备机保持一致
}
track_script {
chk_haproxy #对应的健康检查配置
}
}
virtual_server 80.85.6.222 15679 {
delay_loop 3
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 80.85.6.4 15679 {
weight 1
}
}
#BCAKUP节点配置文件
global_defs {
router_id LVS_DEVEL_B #虚拟路由名称,不同主机名需设置不同主机名
}
#HAProxy健康检查配置
vrrp_script chk_haproxy {
script "/etc/keepalived/keepalived.conf/scripts/haproxy_check.sh" #使用haproxy_check.sh检查haproxy服务
interval 2 #脚本运行周期
weight 2 #每次检查的加权权重值
}
#虚拟路由配置
vrrp_instance haproxy {
state BACKUP #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
interface eth0 #本机网卡名称,使用ifconfig命令查看
virtual_router_id 51 #虚拟路由编号,主备机保持一致
priority 50 #本机初始权重,备机请填写小于主机的值(例如50)
advert_int 1 #争抢虚地址的周期,秒
virtual_ipaddress {
80.85.6.222 #虚地址IP,主备机保持一致
}
track_script {
chk_haproxy #对应的健康检查配置
}
}
virtual_server 80.85.6.222 15679 {
delay_loop 3
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 80.85.6.6 15679 {
weight 1
}
}
4.keepalived服务再搭配一个haproxy_check.sh脚本来检测haproxy服务正常,一旦服务异常则及时进行虚拟IP切换,避免出现脑裂的情况导致服务无法访问
#haproxy_check.sh脚本来检测haproxy服务是否正常运行,haproxy服务没有启动则尝试重新启动,如果启动失败则关闭keepalived服务。
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then
haproxy -f /Founder/haproxy-1.9.5/conf/haproxy.cfg
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then
service keepalived stop
fi
5.keepalived服务启动
#keepalived启动
service keepalived start
#查看keepalived进程,keepalived一共存在3个进程
ps -ef | grep keepalived
#查看keepalived日志
tail -f -n 50 /var/log/messages
4.MQ集群访问(虚拟IP)
-
keepalived服务和haproxy服务启动存在一定的顺序,需要先启动主备节点的haproxy服务,再启动MASTER节点的keepalived服务,最后启动BACKUP节点的keepalived服务。重启haproxy服务之后需要重启keepalived服务,不然keepalived服务是无法感知到haproxy服务的恢复的。
-
查看虚拟IP是否正常。
-
使用浏览器访问80.85.6.222:9188/hastatus即可访问haproxy监控界面,使用80.85.6.222:15679即可访问rabbitmq集群管理界面。
5.容灾性测试
-
关闭MATER服务器的haproxy服务,查看虚拟IP是否漂移到BACKUP服务器,服务是否正常访问,恢复服务。
-
关闭MATER服务器的keepalived服务,查看虚拟IP是否漂移到BACKUP服务器,服务是否正常访问,恢复服务。
-
关闭Rabbitmq集群节点中的任意一个节点服务,查看服务是否可以正常访问,恢复节点服务。