高可用HA
HA:
高可用性(HA)通常用来描述一个系统经过专门的设计,从而减少停工的时间,而保持其服务的高度可用性
#高可用类型
主备方式
两个相同的服务,一个对外提供服务,另一个不运行为备份,一旦主服务出现问题,备份提供服务
互为主备
两个相同的服务,同时对外提供服务,当一个节点出现问题时,另一个节点也可以对外提供服务
高可用相关技术
NAS(Network Attached Storage):网络附加存储,基于网络的共享文件系统
SAN(Storage Area Network):存储区域网络,基于网络的共享存储
HA cluster实现方案–AIS
#AIS:应用程序接口规范
--RHCS:Red Hat Cluster Suite 红帽集群套件
heartbeat:基于心跳监测实现服务高可用
pacemaker+corosync:资源管理与故障转移
HA cluster实现方案–VRRP协议
VRRP:虚拟路由冗余协议,解决静态网关单点风险
软件层—keepalived
物理层—路由器、三层交换机
#VRRP相关术语
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
VIP:Virtual IP
物理路由器:
master:主设备
backup:备用设备
priority:优先级
#VRRP相关技术
节点之间相互通告: 心跳,优先级
工作方式:抢占式,非抢占式
安全认证:
无认证,简单字符认证,MD5
Keepalived 初步
keepalived: 高可用集群,VRRP协议的软件实现
功能:
VRRP协议的软件实现
集成LVS功能,为VIP所在的节点生成IPVS规则
为后端RS做健康性状态检测
软件包名:keepalived
主配置文件:/etc/keepalived/keepalived.conf
核心组件:
vrrp stack:VIP消息通告
checkers:监测real server
system call:实现 vrrp 协议状态转换时调用脚本的功能
SMTP:邮件组件
ipvs wrapper:生成IPVS规则
Keepalived 安装
#环境准备
各节点时间必须同步:ntp, chrony
关闭防火墙及SELinux
各节点之间可通过主机名互相通信:非必须
各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
#rpm包安装
yum info keepalived
yum install -y keepalived
rpm -ql keepalived
编译安装keepalived
yum install -y gcc curl openssl-devel libnl3-devel net-snmp-devel
wget https://keepalived.org/software/keepalived-2.0.20.tar.gz
tar xvf keepalived-2.0.20.tar.gz -C /opt/
cd /opt/keepalived-2.0.20/
./configure --prefix=/opt/keepalived
make && make install
/opt/keepalived/sbin/keepalived -v
cat /usr/lib/systemd/system/keepalived.service #自动生成service文件
mkdir /etc/keepalived
cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
systemctl start keepalived
systemctl status keepalived
hostname -I
iptables -vnL #自动生成防火墙规则
vim /etc/keepalived/keepalived.conf
vrrp_strict #注释此行
killall keepalived #centos7 使用restart会有bug
systemctl start keepalived
iptables -vnL #此时防火墙规则已被清空
keepalived 配置
#/etc/keepalived/keepalived.conf
GLOBAL CONFIGURATION
Global definitions:全局配置:邮件,route_id,vrrp配置,多播地址等
VRRP CONFIGURATION
VRRP instance(s):每个vrrp虚拟路由器
LVS CONFIGURATION
Virtual server(s):LVS集群的VS和RS
#全局配置
global_defs {
notification_email {
root@localhost #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
}
notification_email_from keepalived@localhost #发邮件的地址
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id ha1.example.com #每个keepalived主机唯一标识,建议使用当前主机名
vrrp_skip_check_adv_addr #对所有通告报文都检查,会比较消耗性能
vrrp_strict #严格遵守VRRP协议,开启iptables防火墙规则,建议关闭此项配置
vrrp_garp_interval 0 #GARP 报文发送延迟,0表示不延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址,默认值:224.0.0.18
}
#虚拟路由器配置
vrrp_instance <NAME> {
state MASTER|BACKUP #当前节点在此虚拟路由器上的初始状态
interface eth0 #绑定为当前虚拟路由器的网卡
virtual_router_id VRID #虚拟路由器惟一标识,0-255,必须唯一,同一个虚拟路由器的节点必须相同
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个节点值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type PASS
auth_pass 123456 #预共享密钥,同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress { #虚拟IP
10.0.0.88/24 #指定VIP,默认为eth0网卡
10.0.0.99/24 dev eth1 #指定VIP的网卡
}
}
#独立子配置文件
vim /etc/keepalived/keepalived.conf
include /etc/keepalived/conf.d/*.conf
#开启keepalived日志功能
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
systemctl restart keepalived rsyslog
ll /var/log/keepalived.log
实现master/slave 的 Keepalived 单主架构
#master节点配置
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 66
priority 100
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.100/24
}
}
#slave节点配置
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 66
priority 90
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.100/24
}
}
systemctl restart keepalived
#抓包观察
tcpdump -i eth0 -nn host 224.0.0.18
#down掉主节点,再次观察,会发现地址飘到了backup服务器
#开启主节点,再次观察,会发现地址又被master服务器抢占
实现master/slave 的 Keepalived 双主架构
master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题
#10.0.0.8作为虚拟IP 10.0.0.100的master
#10.0.0.18作为虚拟IP 10.0.0.200的master
#10.0.0.8配置
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.100/24 }
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 77
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.200/24 }
}
#10.0.0.18配置
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 66
priority 90
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.100/24
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 77
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.200/24 }
}
抢占式与非抢占式
#非抢占模式
默认为抢占模式,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优级主机恢复后,并不会抢占低优先级主机的master角色
#注意:需要各keepalived服务器state为BACKUP
#1节点配置
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 66
priority 100
nopreempt
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.100/24
}
}
#2节点配置
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 66
priority 90 #优先级低
nopreempt #不抢占
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
10.0.0.100/24
}
}
#抢占延迟模式
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP
#注意:需要各keepalived服务器state为BACKUP
#ha1主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface eth0
virtual_router_id 66
priority 100 #优先级高
preempt_delay 60s #抢占延迟模式,默认延迟300s
virtual_ipaddress {
10.0.0.100/24
}
#抓包观察
tcpdump -i eth0 -nn host 224.0.0.18
VIP单播配置
#默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
#注意:启用单播,不能启用vrrp_strict
#在所有节点vrrp_instance语句块中对方主机的IP,建议设置为专用于对应心跳线网络的地址
#主节点配置
vrrp_instance VI_1 {
.....
nicast_src_ip 10.0.0.8 #添加源IP地址
unicast_peer{ 10.0.0.18 } #目标IP地址
virtual_ipaddress {
10.0.0.100/24
}
}
#从节点配置
vrrp_instance VI_1 {
...
unicast_src_ip 10.0.0.18 #添加源IP地址
unicast_peer { 10.0.0.8 } #添加目标IP地址
virtual_ipaddress {
10.0.0.100/24
}
}
#抓包观察
tcpdump -i eth0 -nn host 10.0.0.8 and host 10.0.0.18