一、高可用
1.高可用介绍
(1)普通理解
两台服务器启动相同的业务系统,当有一台机器宕机,另外一台服务器快速接管服务,对于用户来讲是无感知的。
(2)专业理解
高可用是分布式系统架构设计中必要的一环,主要是为了减少系统不能提供服务时间。假设系统能一直提供服务,可用性为100%,如果系统每运行100个时间单位,会有1个时间单位无法提供服务,则系统可用性为99%
2.高可用目的
减少系统宕机时间,提高SLA(服务等级协议)服务等级
3.高可用实现
利用keepalievd工具,此工具基于VRRP协议实现,此协议主要用于解决单点故障问题
1.介绍
VRRP协议叫虚拟路由器冗余协议,是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议
2.特点
(1)IP地址备份,VRRP的主要功能。可以在网络中提供多个VirtuaI Router选举的负载均衡以及在单一的网络中支持多重逻辑IP子网络。
(2)最优路径指示。从VRRP组内多个路由器的路由中,保证Master收敛到现成可用最优先的路由器。
(3)最小化不必要的服务中断。在主路由正常工作期间,不触发其他低优先级别路由器选择主路由的服务。
(4)广泛的安全性。它可在多种不同的交互环境中采用不同的安全策略,它只需极少的配置和开销就可以进行严格的验证。
(5)在可扩展网络有效的工作。
三、Keepalived
1.介绍
基于VRRP协议实现,原生设计是为了高可用LVS服务。
(1)通过VRRP协议,可以完成地址漂移技术
(2)为VIP地址所在节点生成IPVS规则(需要在配置文件中预先定义)
(3)为IPVS集群的RS节点做健康状态检测
2.Keepalived核心组件
(1)VRRP stack
用于实现VRRP协议的重要组件之一
(2)NetLink接口
设置和删除网络接口上的虚拟IP地址
(3)IPVS Wrapper
使用getsock和setsock来建立IPVS规则
(4)checkers
监测RS节点的支持方式,支持TCP、HTTP、SSL等
(5)system call
支持启动额外系统脚本的功能
(6)SMTP
为当发生角色状态转换时,发送事件通知邮件
(7)watchDog
监控进程
3.控制组件
配置文件分析器
4.内存管理
四、Keepalived核心概念
1.虚拟路由器
由一个master路由器和多个backup路由器组成
2.master路由器
虚拟路由器中承担报文转发任务的路由器
3.backup路由器
master路由器出现故障时,能够代替master路由器工作的路由器
4.VRID
虚拟路由器的标识,由同一个VRID的一组路由器构成一个虚拟机路由器
5.组播
组播是有特定的成员,是一种可控的广播,组播成员需要加入“组播组”才能收到该组播的信息
6.虚拟IP地址
虚拟路由器的IP地址,一个虚拟路由器可以拥有一个或多个IP地址
7.虚拟MAC地址
一个虚拟路由器拥有一个虚拟MAC地址
8.优先级
VRRP根据优先级来确定虚拟路由器中每台路由器的地位
9.抢占式
如果Master故障,Backup自动接管,当Master恢复了会将vIP地址抢回来
10.非抢占式
如果Master故障,Backup自动接管,当Master恢复则自动转为Backup,不会抢占VIP
五、Keepalived应用场景
1.使用原因
通常是因为业务系统需要保持7天,每天24小时不宕机
2.场景
公司内部OA(办公自动化)系统,对外发布的业务系统等等
六、Keepalived的实例配置
1.环境
状态 | eth0 | eth1 | 角色 |
节点1 | 10.0.0.5 | 172.16.1.5 | master |
节点2 | 10.0.06 | 172.16.1.6 | backup |
VIP地址 | 10.0.0.100 |
2.配置
(1)两个节点分别安装keepalived
[root@lb01 ~] yum install keepalived -y
(2)配置master
[root@lb01 ~]vi /etc/keepalived/keepalived.conf
global_defs {
router_id lb01 #当前物 理设备的标识名称
#vrrp_mcast_group4 224.0.0.18 # 组播 地址,default 224.0.0.18
}
vrrp_instance VI_1 {
state MASTER # 角色状态;
interface eth0 # 绑定当前虚拟路由使用的物理接口;
virtual_router_id 50 # 当前虚拟路由标识,VRID;
priority 200 # 当前物理节点在虚拟路由中的优先级;
advert_int 3 # vrrp通告时间间隔,默认1s;
authentication {
auth_type PASS # 密码类型简单密码:
auth_pass 1111 # 密码不 超过8位字符;
}
virtual_ipaddress {
10.0.0.100 # VIP地址
}
}
(3)重启master上的keepalived,设为开机自启
[root@lb01 ~] systemctl enable keepalived
[root@lb01 ~] systemctl start keepalived
(4)配置backup
[root@lb02 ~]vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100
}
}
(5)重启backup上的keepalived,设为开机自启
[root@lb01 ~] systemctl enable keepalived
[root@lb01 ~] systemctl start keepalived
3.地址漂移测试
(1)master上的操作
# Master存在vip地址
[root@lb01 ~] ip addr lgrep 10.0.0.100 inet 10.0.0.100/32 scope global eth0
[root@lb01 ~] systemctl stop keepalived
(2)backup上的操作
# 发现地址已经漂移至Backup端
[root@lb02 ~] ip addrlgrep 10.0.0.100 inet 10.0.0.100/32 scope global eth0
(3)此时master上的keepalived,会发现VIP被强行抢占
[root@lb01 ~] systemctl start keepalived
[root@lb01 ~] ip addr lgrep 10.0.0.100 inet 10.0.0.100/32 scope global eth0
(4)通过windows查看arp缓存表,验证地址漂移后是否自动更新MAC地址
七、Keepalived延迟抢占
1.介绍
延迟抢占指的是,当master故障后,backup接管,当master恢复后不立即抢占VIP地址,延迟一段时间,在抢占VIP
2.配置延迟抢占
(1)两台节点的state都必须配置backup
(2)在节点的vrrp_instance中添加nopreempt
#Master
vrrp_instance VI_1 {
state BACKUP
priority 200
preempt_delay 10s # 延迟10s后抢占VIP
}
# Backup
vrrp_instance VI_1 {
state BACKUP
priority 100
preempt_delay 10s
}
八、keepalived非抢占式
1.介绍
通常 master 服务故障后 backup 会变成 master,但是当 master 服务恢复后,master会抢占VIP,这样就会发生两次切换;对业务繁忙的网站来说并不是太友好;此时我们可以配置keepalived为非抢占式,(前提两台主机的硬件配置信息一致)
2.配置
(1)两台节点的 state都必须配置为BACKUP
(2)两台节点都在vrrp_instance 中添加nopreempt参数
(3)其中一个节点的优先级必须要高于另外一个节点的优先级
#Master
vrrp_instance VI_1 {
state BACKUP
priority 200
nopreempt
}
#Backup
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
九、Keepalived邮件通知
1.配置邮箱(所有节点都要配置)
[root@lb01 ~] yum install mailx -y
[root@lb01 ~] cat >> /etc/mail.rc << EoF
set from=1234567890@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=1234567890@qq.com
set smtp-auth-password=123
set smtp-auth=login
set ssl-verify=ignore
EOF
2.通知脚本(所有节点都需要配置)
[root@dns-slave ~] vim /etc/keepalived/notify.sh
#!/usr/bin/bash
#定义收件人
Email='1234567890@qq.com'
#定义主机名称
Host=$(hostname)
# 定义时间变量
Date=$(date +'%F %T')
#定义发送的消息
Message() {
subject="${Host} 切换为 $1 状态"
submsg="${Date}:${Host} 成功切换为 $1 状态"
echo "${submsg}" I mail -s "${subject}" "${Email}"
# echo "时间:${主机名称}
成功切换为 backup
状态" | mail -s "${主机}切换为 backup 状态"
"552408925@qq.com"
}
case $1 in
master)
Message master
;;
backup)
Message backup
;;
fault)
Message fault
;;
*)
echo "Usage: $0 { master | backup |fault }"
exit
esac
3.配置master
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 200
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 dev eth0
}
notify_master
"/etc/keepalived/notify.sh master" # 当前节
点成为主节点时触发的脚本
notify_backup
"/etc/keepalived/notify.sh backup" # 当前节
点转为备节点时触发的脚本
notify_fault
"/etc/keepalived/notify.sh fault" # 当前
节点转为“失败”状态时触发的脚本
}
4.修改配置(backpu)
[root@dns-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PAss
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 dev eth0
}
notify_master
"/etc/keepalived/notify.sh master" # 当前节
点成为主节点时触发的脚本
notify_backup
"/etc/keepalived/notify.sh backup" # 当前节
点转为备节点时触发的脚本
notify_fault
"/etc/keepalived/notify.sh fault" #当前
节点转为“失败”状态时触发的脚本
}
5.停止所有节点的keepalived,先启动backup节点,然后启动master节点
# Backup
[root@lb02 ~] systemctl start keepalived
# 等待邮件发送成功在启动Master
# Master
[root@lb0l ~] systemctl start keepalived
十、keepalived双主模式
1.介绍
两个或以上VIP分别运行在不同的keepalived服务器,实现服务器并访问web应用,提高服务器资源利用率。
2.配置
(1)配置proxy1
[root@proxy01 ~] vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb01 # 当前物理设备的标识名称
}
(2)主服务器配置
vrrp_instance VI_1 {
state MASTER # 角色状态;
interface eth0 # 绑定当前虚拟路由使用的物理接口;
virtual_router_id 50 # 当前虚拟路由标识,VRID;
priority 200 #当前物理节点在虚拟路由中的优先级;
advert_int 3 # vrrp通告时间间隔,默认1s;
#nopreempt
authentication {
auth_type PASS # 密码类型,简单密码;
auth_pass 1111 # 密码不超过8位字符;
}
virtual_ipaddress {
10.0.0.100 # VIP地址
}
notify_master
"/etc/keepalived/notify.sh master" # 当前节点成为主节点时触发的脚本
notify_backup
"/etc/keepalived/notify.sh backup" # 当前节点转为备节点时触发的脚本
notify_fault
"/etc/keepalived/notify.sh fault" # 当前节点转为“失败”状态时触发的脚本
}
(3)备用服务器配置
vrrp_instance VI_2 {
state BACKUP # 角色状态;
interface eth0 # 绑定当前虚拟路由使用的物理接口;
virtual_router_id 55 # 当前虚拟路由标识,VRID;
priority 100 # 当前物理节点在虚拟路由中的优先级;
advert_int 3 # vrrp通告时间间隔,默认1s;
#nopreempt
authentication {
auth_type PAsS # 密码类型,简单密码;
auth_pass 1111 # 密码不超过8位字符:
}
virtual_ipaddress {
10.0.0.101 # VIP地址
}
}
(4)配置proxy2
[root@proxy02 ~]vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb02 # 当前物理设备的标识名称
}