一、高可用集群
1.1 集群类型
- LB:Load Balance 负载均衡
- LVS/HAProxy/nginx(http/upstream, stream/upstream)
- HA:High Availability 高可用集群 数据库、Redis
- SPoF: Single Point of Failure,解决单点故障
- HPC:High Performance Computing 高性能集群
1.2 系统可用性
SLA:Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能 等方面所达成的双方共同认可的协议或契约)
A = MTBF / (MTBF+MTTR)
如:
99.95%:(60*24*30)*(1-0.9995)=21.6分钟 #一般按一个月停机时间统计
指标 :99.9%, 99.99%, 99.999%,99.9999%
1.3 系统故障
硬件故障:设计缺陷、wear out(损耗)、非人为不可抗拒因素
软件故障:设计缺陷 bug
1.4 实现高可用
提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)
解决方案:建立冗余机制
active/passive 主/备
active/active 双主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> activ
1.5.VRRP:Virtual Router Redundancy Protocol
虚拟路由冗余协议,解决静态网关单点风险
物理层:路由器、三层交换机
软件层:keepalive
1.5.1 VRRP 相关术语
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
物理路由器:
master:主设备
backup:备用设备
priority:优先级
1.5.2 VRRP 相关技术
通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式
安全认证: 无认证 简单字符认证:预共享密钥 MD5
工作模式:
主/备:单虚拟路由器
主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
二、Keepalived的部署
2.1、keepalived的简介
功能:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
2.2、keepalived的架构
官方文档: https://keepalived.org/doc/
http://keepalived.org/documentation.html
用户空间核心组件:
- vrrp stack:VIP消息通告
- checkers:监测real server
- system call:实现 vrrp 协议状态转换时调用脚本的功能
- SMTP:邮件组件
- IPVS wrapper:生成IPVS规则
- Netlink Reflector:网络接口
- WatchDog:监控进程
控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
IO复用器:针对网络目的而优化的自己的线程抽象
内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
2.3、环境准备
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信:非必须
- 建议使用/etc/hosts文件实现:非必须
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
需要两个realserver和两个Keepalived服务器
realserver配置如下:
realserver1:
设置ip,如果你有可以不改动
vmset.sh ens33 172.25.254.110 realserver1.timingzpy.org下载apache
yum install httpd -y
写入文件
echo 172.25.254.110 > /var/www/html/index.html启动httpd
systemctl enable --now httpd
realserver2:
设置ip,如果你有可以不改动
vmset.sh ens33 172.25.254.120 realserver1.timingzpy.org下载apache
yum install httpd -y
写入文件
echo 172.25.254.120 > /var/www/html/index.html启动httpd
systemctl enable --now httpd
2.4 Keepalived 相关文件
可通过这条命令查看
[root@ka1 ~]# rpm -ql keepalived
- 软件包名:keepalived
- 主程序文件:/usr/sbin/keepalived
- 主配置文件:/etc/keepalived/keepalived.conf
- 配置文件示例:/usr/share/doc/keepalived/
- Unit File:/lib/systemd/system/keepalived.service
- Unit File的环境配置文件:/etc/sysconfig/keepalived
2.5、keepalived的实验环境
2.5.1 配置文件组成部分
配置文件:/etc/keepalived/keepalived.conf
配置文件组成
GLOBAL CONFIGURATION
Global definitions: 定义邮件配置,route_id,vrrp配置,多播地址等
VRRP CONFIGURATION VRRP
instance(s): 定义每个vrrp虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s): LVS集群的VS和RS
2.5.2、Keepalived配置
KA1:
配置IP
vmset.sh ens33 172.25.254.10 ka1.timingzpy.org安装keepalived
yum install keepalived -y
更改vim编写的tap缩进
vim ~/.vimrc
set ts=4 ai sw=4更改配置文件,我的网卡名是ens33
vim /etc/keepalived/keepalived.conf
#全局配置
global_defs {
notification_email {
2931653102@qq.com
}
notification_email_from keepalived@timingzpy.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.timingzpy.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}#虚拟路由器配置
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}systemctl enable --now keepalived.service
为避免麻烦可以直接ka1的文件发送给ka2
scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf测试
tcpdump -i ens33 -nn host 224.0.0.18
KA2:
配置IP
vmset.sh ens33 172.25.254.20 ka2.timingzpy.org安装keepalived
yum install keepalived -y
更改vim编写的tap缩进
vim ~/.vimrc
set ts=4 ai sw=4更改配置文件,我的网卡名是ens33
vim /etc/keepalived/keepalived.conf
#全局配置
global_defs {
notification_email {
2931653102@qq.com
}
notification_email_from keepalived@timingzpy.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.timingzpy.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
#
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}#虚拟路由器配置
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}systemctl enable --now keepalived.service
测试
tcpdump -i ens33 -nn host 224.0.0.18
2.5.3、 使vip能够通信
如果要使vip可以通信
1、在全局中添加vrrp_iptables
2、在全局中将vrrp_strict注释掉
方法1、 方法2、
2.5.4、独立Keepalived日志功能
1、编辑日志级别
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS"-D -s 6"
2、 指定采集方法
vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
systemctl resatrt rsyslog.service
systemctl restart keepalived.service
如果重启不了,说明文件没有成功生成,我们可以自己去touch一个Keepalived.log文件
3、查看日志是否生成
ll /var/log/keepalived.log
2.5.5、 实现独立子配置文件
1、vim /etc/keepalived.keepalived
将虚拟路由器的配置注释掉
后添加
include "/etc/keepalived/conf.d/*.conf"
如果现在重启,就会报找不到这个文件
我们需要创建这个文件
medir /etc/keepalived/conf.d/
并将注释掉的虚拟路由器的配置粘贴过来
vim /etc/keepalived/conf.d/172.25.254.100.conf
后再重启
systemctl restart keepalived.service
查看IP
ifconfig
三、keepalived应用示例
3.1、抢占模式和非抢占模式
3.1.1、非抢占模式 nopreempt
3.1.2、抢占延迟模式 preempt_delay
3.2、VIP单播配置
默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
!!!注意:启用 vrrp_strict 时,不能启用单播
KA1,KA2都要禁用掉
后重启
抓包查看单播效果
ka1:
tcpdump -i ens33 -nn src host 172.25.254.10 and dst 172.25.254.20
ka2:
tcpdump -i ens33 -nn src host 172.25.254.20 and dst 172.25.254.10
Vip在哪个KA服务器上,哪个KA服务器才能发送单播
3.3、Keepalived 通知脚本配置
3.3.1、邮件通知配置
所有 keepalived节点都要配置:
yum install mailx -y
vim /etc/mail.rc
set from=2931653102@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=2931653102@qq.com
set smtp-auth-password=cpcvhjhuqujrdhff
set smtp-auth=login
set ssl-verify=ignore发送测试邮件
echo test message |mail -s test XXXX@qq.com(自己的邮箱地址)
3.3.2、实现 Keepalived 状态切换的通知脚本
在所有 keepalived节点配置如下
vim /etc//keepalived/mail.sh
#!/bin/bash
mail_dst="XXXX@qq.com"
send_message()
{
mail_sub="$HOSTNAME to be $1 vip move"
mail_msg="`date +%F\ %T`:vrrp move $HOSTNAME chage $1"
echo %mail_msg | msil -s "$mail_sub" $mail_dst
}
case $1 in
master)
send_message master
;;
backup)
send_message backup
;;
fault)
send_message fault
;;
*)
;;
esac给执行权限
chmod +x /etc/keepalived/mail.sh
vim /etc/keepalived/keepalived.conf
添加
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
测试:
可以关掉现vip所在的服务器,来测试systemctl stop keepalived.service
关掉后,它会给你的邮箱发送一条消息
3.4、实现 master/master 的 Keepalived 双主架构
ka1:
vim /etc/keepalived/keepalived.conf
添加
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 200
priority 800
#preempt_delay 5s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev ens33 label ens33:2
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
}
ka2:
vim /etc/keepalived/keepalived.conf
添加
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 200
priority 100
#preempt_delay 5s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev ens33 label ens33:2
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
}
3.5、实现IPVS的高可用性
3.5.1、虚拟服务器的定义格式
virtual_server IP port #定义虚拟主机IP地址及其端口
virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群 virtual_server group string #使用虚拟服务器组
3.5.2、虚拟服务器设置
3.5.2.1、 虚拟服务器配置
virtual_server IP port { #VIP和PORT
delay_loop #检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义调度方法
lb_kind NAT|DR|TUN #集群的类型,注意要大写
persistence_timeout #持久连接时长
protocol TCP|UDP|SCTP #指定服务协议,一般为TCP
sorry_server #所有RS故障时,备用服务器地址
real_server { #RS的IP和PORT
weight #RS权重
notify_up #RS上线通知脚本
notify_down #RS下线通知脚本 HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } #定义当前主机健康状 态检测方法
}
}
#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错
3.5.2.2、 应用层检测:HTTP_GET|SSL_GE
HTTP_GET|SSL_GET {
url {
path #定义要监控的URL
status_code #判断上述检测机制为健康状态的响应码,一般为 200
}
connect_timeout #客户端请求的超时时长, 相当于haproxy的timeout server nb_get_retry #重试次数
delay_before_retry #重试之前的延迟时长
connect_ip #向当前RS哪个IP地址发起健康状态检测请求
connect_port #向当前RS的哪个PORT发起健康状态检测请求
bindto #向当前RS发出健康状态检测请求时使用的源地址
bind_port #向当前RS发出健康状态检测请求时使用的源端口
}
3.5.2.3、传输层检测:TCP_CHECK
TCP_CHECK {
connect_ip #向当前RS的哪个IP地址发起健康状态检测请求
connect_port #向当前RS的哪个PORT发起健康状态检测请求
bindto #发出健康状态检测请求时使用的源地址
bind_port #发出健康状态检测请求时使用的源端口
connect_timeout #客户端请求的超时时长
#等于haproxy的timeout server
}
3.5.3、实例
3.5.3.1、实现单主的 LVS-DR 模式
准备web服务器并使用脚本绑定VIP至web服务器lo网卡
rs1/2:(都做一下操作)
[root@realserver1 ~]# ip addr add 172.25.254.100/32 dev lo
[root@realserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@realserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@realserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@realserver1 ~]# systemctl restart httpd
配置keepalived
ka1/2:
vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.254.110 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.254.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
测试
ka1/2:
下载ipvsadm来查看当前的负载均衡配置
yum install ipvsadm -y
3.6、实现其它应用的高可用性 VRRP Script
keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先 动态调整,从而实现其它应用的高可用性功能 参考配置文件:/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck
3.6.1、VRRP Script 配置
1、定义脚本
- vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定 义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
- 通常此脚本用于监控指定应用的状态。
- 一旦发现应用的状态异常,则触发对MASTER节点的权重减至 低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点 。
vrrp_script name { #定义一个检测脚本,在global_defs 之外配置
script #shell命令或脚本路径 interval #间隔时间,单位为秒,默认1秒
timeout #超时时间
weight #默认为0,如果设置此值为负数,
#当上面脚本返回值为非0时
#会将此值与本节点权重相加可以降低本节点权重,即表示fall.
#如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重
#即表示 rise.通常使用负值
fall #执行脚本连续几次都失败,则转换为失败,建议设为2以上
rise #执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] #执行监测脚本的用户或组
init_fail #设置默认标记为失败状态,监测成功之后再转换为成功状态
}
2、调用脚本
- track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的 vrrp_script
vrrp_instance VI_1 {
…………
track_script{
name
}
}
3.6.2、利用脚本实现主从角色切换
[root@ka1 ~]# vim /etc/keepalived/test.sh
[root@ka1 ~]# sh /etc/keepalived/test.sh
[root@ka1 ~]# echo $?
0
[root@ka1 ~]# touch /mnt/zpy
[root@ka1 ~]# sh /etc/keepalived/test.sh
[root@ka1 ~]# echo $?
1
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
[root@ka1 ~]# cat /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/zpy ]
vrrp_script check_zpy {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 80
#preempt_delay 5s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
track_script{
check_zpy
}
}
测试:
它会检测有没有这个文件,没有这个文件,就没问题,vip就会一直在ka1上
一旦检测到这个文件,vip就切换到ka2上。
3.6.3、实现HAProxy高可用
注:如果做了前文中的LVS-DR模式的话,需要将那些配置删除掉,如虚拟服务器的配置,realserver的内核参数 arp_ignore & arp_announce全部设为0,删除临时的环回路由(ip a d 172.25.254.100/32 dev lo)。或者用之前双主的另一个网卡来做。
ka1/2:
yum install haproxy -y
vim /etc/sysctl.conf
在两个ka1和ka2两个节点启用内核参数
net.ipv4.ip_nonlocal_bind = 1
sysctl -p
vim /ect/haproxy/haproxy.cfg添加
listen webcluster
bind 172.25.254.100:80
mode http
balance roundrobin
server web1 172.25.254.110:80 check inter 3 fall 2 rise 5
server web2 172.25.254.120:80 check inter 3 fall 2 rise 5
通过这个查看一下端口
netstat -antlupe | grep haproxy
这时就可以重启Keepalived和haproxy,测试一下,是否连上了
这样就连接上了
编写检测脚本
vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
chmod +x /etc/keepalived/test.sh
ka1/2:
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}虚拟路由器中添加
track_script {
check_haproxy
}
这样就算配置好了
测试:
[root@ka1 ~]# systemctl stop haproxy.service
[root@ka1 ~]# systemctl start haproxy.service
ka1的haproxy服务down后,就会使用ka2执行。