一、高可用集群
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实现高可用
提升系统高用性的解决方案:降低
MTTR- Mean Time To Repair(
平均故障时间
)
解决方案:建立冗余机制
active/passive
主
/
备
active/active
双主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active
二、Keepalived部署
2.1keepalived 简介
vrrp
协议的软件实现,原生设计目的为了高可用
ipvs
服务
官网:
http://keepalived.org/
功能:
基于
vrrp
协议完成地址流动
为
vip
地址所在的节点生成
ipvs
规则
(
在配置文件中预先定义
)
为
ipvs
集群的各
RS
做健康状态检测
基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持
nginx
、
haproxy
等服务
2.2Keepalived 架构
·用户空间核心组件:
vrrp stack
:
VIP
消息通告
checkers
:监测
real server
system call
:实现
vrrp
协议状态转换时调用脚本的功能
SMTP
:邮件组件
IPVS wrapper
:生成
IPVS
规则
Netlink Reflector
:网络接口
WatchDog
:监控进程
·控制组件:提供
keepalived.conf
的解析器,完成
Keepalived
配置
·IO
复用器:针对网络目的而优化的自己的线程抽象
·内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
2.3Keepalived环境准备
四台7.9克隆机
KA1:172.25.254.10
KA2:17225.254.20
realserver1:172.25.254.110
realserver2:172.25.254.120
在realserver1和realserver2安装
测试:
2.4KeepAlived配置说明
2.4.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.4.2全局配置
2.4.3配置虚拟路由器
2.4.4启用keepalived日志功能
[root@KA1 ~]# vim /etc/sysconfig/keepalived
[root@ka1 ~]#vim /etc/rsyslog.conf
[root@ka1 ~]#systemctl restart rsyslog.service
[root@ka1 ~]#systemctl restart keepalived.service
2.4.5实现独立子配置文件
当生产环境复杂时,
/etc/keepalived/keepalived.conf
文件中内容过多,不易管理
将不同集群的配置,比如:不同集群的
VIP
配置放在独立的子配置文件中利用
include
指令可以实现包含 子配置文件
![](https://i-blog.csdnimg.cn/direct/68c065eefef24aae896d56b20adc11d3.png)
[root@KA1 ~]# mkdir /etc/keepalived/conf.d
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
三.Keepalived 企业应用示例
3.1 实现master/slave的 Keepalived 单主架构
3.1.1 MASTER配置
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
594233887@qq.com
}
notification_email_from keepalived@KA1.lee.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.lee.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 20
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
3.2 抢占模式和非抢占模式
3.2.1 非抢占模式 nopreempt
默认为抢占模式
preempt
,即当高优先级的主机恢复在线后,会抢占低先级的主机的
master
角色,
这样会使
vip
在
KA
主机中来回漂移,造成网络抖动, 建议设置为非抢占模式 nopreempt
,即高优先级主机恢复后,并不会抢占低优先级主机的
master
角色
非抢占模块下
,
如果原主机
down
机
, VIP
迁移至的新主机
,
后续也发生
down
时
,
仍会将
VIP
迁移回原主机
#ka1主机配置
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 20
priority 100 #优先级高
nopreempt #非抢占模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
#KA2主机配置
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 20
priority 80 #优先级低
advert_int 1
nopreempt #非抢占模式
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev etns33 label ens33:1
}
}
3.2.2 抢占延迟模式 preempt_delay
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回
VIP
,而是延迟一段时间(默认
300s
)再抢回 VIP
#ka1主机配置
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 20
priority 100 #优先级高
preempt_delay 10s #抢占延迟10s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
}
#KA2主机配置
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 20
priority 80 #优先级低
advert_int 1
preempt_delay 10s #抢占延迟10S
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev ens33 label ens33:1
}
3.3 VIP单播配置
默认
keepalived
主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
2961538434@qq.com
}
notification_email_from keepalived@KA1.lee.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.lee.org
vrrp_skip_check_adv_addr
#vrrp_strict #注释此参数,与vip单播模式冲突
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_ipsets keepalived
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 20
priority 100
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.10 #本机IP
unicast_peer {
172.25.254.20 #指向对方主机IP
#如果有多个keepalived,再加其它节点的IP
}
}
##在KA2主机中
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 20
priority 80
advert_int 1
preempt_delay 60
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 #本机ip
unicast_peer {
172.25.254.10 #对端主机IP
}
}
测试:
3.4 Keepalived 通知脚本配置
当
keepalived
的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户
keepalived_script
身份执行脚本
如果此用户不存在,以
root
执行脚本可以用下面指令指定脚本执行用户的身份
3.4.1 邮件配置
#安装邮件发送工具
[root@KA2 ~]# dnf install mailx -y
QQ邮箱配置
![](https://i-blog.csdnimg.cn/direct/1180af003c774990bdec6f9228e8a7ad.png)
发送测试邮件
[root@ka1 ~]# echo hello world |mail -s test 2961538434@qq.com
![](https://i-blog.csdnimg.cn/direct/2f221ad63c544d52ad93b4bca50374ba.png)
3.4.2 实现 Keepalived 状态切换的通知脚本
创建通知脚本
#
在所有
keepalived
节点配置如下
#在所有 keepalived节点配置如下
[root@KA1 + KA2 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='2961538434@qq.com'
mail_send()
{
mail_subj="$HOSTNAME to be $1 vip move"
mail_mess="`date +%F\ %T`: vrrp move,$HOSTNAME change $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
;;
esac
[root@KA1 +KA2 ~]# chmod +x /etc/keepalived/mail.sh
[root@KA1 +K2 ~]#vim /etc/keepalived/keepalived.conf
3.4.3脚本的调用方法
在 vrrp_instance VI_1 语句块的末尾加下面行
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
测试
3.5 实现 master/master 的 Keepalived 双主架构
master/slave
的单主架构,同一时间只有一个
Keepalived
对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master
的双主架构,解决此问题。
3.6 实现IPVS的高可用性
准备web服务器并使用脚本绑定VIP至web服务器lo网卡
#准备两台后端RS主机
[root@realserver1~]# yum install httpd -y
[root@realserver1~]# echo - 172.25.254.110 > /var/www/html/index.html
[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 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@realserver2 ~]# yum install httpd -y
[root@realserver1 ~]# echo - 172.25.254.120 > /var/www/html/index.html
[root@realserver2 ~]# ip addr add 172.25.254.100/32 dev lo
[root@realserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@realserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@realserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@realserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
配置
keepalived
[root@rhel7-ka1 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 172.25.254.110 80 {
weight 1
HTTP_GET {
url{
path /
status_code 200
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
real_server 172.25.254.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
[root@ka1 ~]# systemctl stop keepalived.server
3.7 实现其它应用的高可用性 VRRP Script
keepalived
利用
VRRP Script
技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先 动态调整,从而实现其它应用的高可用性功能
参考配置文件:
/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck
3.7.1 VRRP Script 配置
分两步实现:
·
定义脚本
vrrp_script
:自定义资源监控脚本,
vrrp
实例根据脚本返回值,公共定义,可被多个实例调用,定
义在
vrrp
实例之外的独立配置块,一般放在
global_defs
设置块之后。
通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对
MASTER
节点的权重减至 低于SLAVE
节点,从而实现
VIP
切换到
SLAVE
节点
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #此脚本返回值为非0时,会触发下面OPTIONS执行
OPTIONS
}
·调用脚本
track_script
:调用
vrrp_script
定义的脚本去监控资源,定义在
VRRP
实例之内,调用事先定义的
vrrp_script
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
3.7.2利用脚本实现主从角色切换
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
[ ! -f "/mnt/lee" ]
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_script check_lee {
script "/etc/keeplived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
3.7.3 实现
HAProxy
高可用
#在两个ka1和ka2先实现haproxy的配置
[root@ka1 & ka2 ~]# vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
server web1 172.25.254.101:80 check
server web2 172.25.254.102:80 check
#在两个ka1和ka2两个节点启用内核参数
[root@ka1 & ka2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
#在ka1中编写检测脚本
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
#在ka1中配置keepalived
[root@ka1 ~]#cat /etc/keepalived/keepalived.conf
vrrp_script check_haproxy {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
测试:
root@ka1 ~]# systemctl stop haproxy.service