一、HA Cluster基础
系统可用性A=MTBF/(MTBF+MTTR)
MTBF:平均无故障时间
MTTR:平均修复时间
降低MTTR的方式:冗余(redundent)
衡量标准:几个9 90%、99%、99.9%…
提升系统可用性的办法之一:降低MTTR
通过冗余(redundant)的方式能够避免单点故障(SPoF),从而降低MTTR。
冗余方式:
一主一备
一主多备
多主多备:此时,各主节点提供的服务不应该是同一个服务
主节点:active
备用节点:passive
主节点通过多播的方式以一定的频率发送HeartBeat信息,告知其他备用节点自己仍在提供服务。一旦其他备用节点在一定时长之内没有收到主节点的HeartBeat信息,会认为其发生故障,这时备用节点会基于优先级来抢占提供服务的IP地址,并把服务启动向外提供。
当由多个节点构成一个高可用集群时,若出现某主节点与其他节点互相之间不能通信,但主节点还在正常提供服务,此时,其他节点会与主节点争抢资源,这种情况被称之为Networl Partition(也被称之为脑裂brain split)。出现此情况时,节点数量大于半数的节点将接手服务。
构建集群时,一般使用奇数个节点。当出现网络分区情况时能够选举出新的主节点。
二、HA CLuster的实现方案
vrrp协议的实现:keepalived
ais:完备的HA集群
heartbeat
corosync
三、VRRP协议简介
VRRP全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器。拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
在VRRP协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播IP地址 224.0.0.18 来定时发送通告消息。每个Router都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的IP地址较大者为master,接管虚拟IP
VRRP协议术语
虚拟路由器:由一个 Master 路由器和多个 Backup 路由器组成。主机将虚拟
路由器当作默认网关。
VRID:虚拟路由器的标识。有相同 VRID 的一组路由器构成一个虚拟路由器。
Master 路由器:虚拟路由器中承担报文转发任务的路由器。
Backup 路由器:Master 路由器出现故障时,能够代替 Master 路由器工作的路由器。
虚拟 IP 地址:虚拟路由器的 IP 地址。一个虚拟路由器可以拥有一个或多个IP地址。
IP 地址拥有者:接口 IP 地址与虚拟 IP 地址相同的路由器被称为 IP 地址拥有者。
虚拟 MAC 地址:一个虚拟路由器拥有一个虚拟 MAC 地址。虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应 ARP 请求使用的是虚拟 MAC 地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实 MAC 地址。
优先级:VRRP 根据优先级来确定虚拟路由器中每台路由器的地位。
非抢占方式: 如果 Backup 路由器工作在非抢占方式下,则只要 Master 路由器没有出现故障,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器。
抢占方式:如果 Backup 路由器工作在抢占方式下,当它收到 VRRP 报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的 Master 路由器的优先级高,就会主动抢占成为 Master 路由器;否则,将保持 Backup 状态。
四、keepalived体系结构及简单配置
4.1、keepalived是什么及其功能
keepalived是VRRP协议的软件实现,原生设计的目的为了高可用ipvs服务。其功能如下:
1)、基于VRRP协议完成地址流动;
2)、为VIP地址所在的节点生成ipvs规则(定义在配置文件中);
3)、为各RS做健康状态检测;
4)、基于脚本调用接口通过执行脚本完成脚本中定义的功能;
4.2、keepalived体系结构
keepalived是高度模块化的软件,其由核心模块、内存管理、I/O复用、配置文件分析器四个模块构成。
keepalived采用了多进程的设计模式,每个进程负责不同的功能。
父进程:内存管理,子进程管理等
子进程:VRRP子进程
子进程:healthchecker子进程
Keeplived的体系结构分两层:内核空间(Kernel Spase)和用户空间(User Spase)。
1)、内核空间层包括两个模块:
IPVS:IPVS模块是Keepalived引入的一个第三方模块,通过IPVS可以实现基于IP的负载均衡集群。IPVS默认包含在LVS集群软件中。在Keepalived中,IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时打开负载均衡功能,也可以通过配置编译参数关闭。
NETLINK:主要用于实现一些高级路由框架和一些相关的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。
2)、用户空间层分为4个部分:
Scheduler – I/O Multiplexer : I/O复用分发调度器,负责安排Keepalived所有内部的任务请求。
Memory Management:内存管理机制,这个框架提供了访问内存的一些通用方法。
Control Plane:Keepalived的控制面板,实现对配置文件进行编译和解析,Keepalived的配置文件解析比较特殊,不是一次解析所有模块的配置,而是在用到某个模块时才解析相应的配置。
Core components:Keepalived的核心组件,包含了一系列功能模块,主要有WatchDog、Checkers、VRRP Stack、IPVS wrapper和Netlink Reflector。
3)、Core components的5个主要功能模块:
WatchDog:负责监控Checkers和VRRP进程。
Checkers:负责对服务器运行状态检测和故障隔离
VRRP Stack:负责HA集群中失败切换(Failover)。
IPVS wrapper:负责将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现IPVS模块的负载均衡功能。
Netlink Reflector:负责高可用集群中Failover时虚拟IP(VIP)的设置和切换。Netlink Reflector的所有请求最后都发送到内核空间层的NETLINK模块来完成。
4.3、keepalived程序环境
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
配置文件组成部分:
全局配置(GLOBAL CONFIGURATION):
Global definations
static routes
VRRPD CONFIGURATION
VRRP synchronization group(s)
VRRP instance(s)
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)
4.4、keepalived配置文件详解之全局配置&vrrp instance配置
1)全局配置
global_defs {
notification_email { #当keepalieved发生切换等操作时,需要通知的收件人
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc#通知邮件的发件人
smtp_server 192.168.200.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接超时时长
router_id LVS_DEVEL #当前路由器的标识符
vrrp_mcast_group4 224.0.0.18 #发送多播的多播地址。当局域网中存在多个keepalived集群时,建议将其地址修改为各自独立。
}
要能发送多播信息,网卡必须支持MULTICAST。使用ip link show可以查看是否支持
如果查看到不支持,可以通过ip link set dev ifname multicast on来启用支持
~]# ip link set dev eth0 multicast on
2)虚拟路由器配置
vrrp_instance instance_name { #一个vrrp_instance定义一个虚拟路由器,instance_name不能重复。
state MASTER |BACKUP #定义当前节点在此虚拟路由器的初始状态。只能有一个MASTER。注:初识状态是通过优先级的比对来最终决定的
interface interface_name #当前虚拟路由器使用的物理接口,即Vip配置在哪个网卡的别名上
virtual_router_id VRID #虚拟路由器的唯一标识符,不能重复,范围0-255
priority 100 #当前节点在此虚拟路由器中的优先级,范围1-254。优先级高的为MASTER
advert_int 1 #主加点向备用节点通告自己heartbeat信息的时间间隔,默认1秒。
authentication { #认证方式和密码,主从必须一样。
auth_type AH|PASS #推荐使用简单字符认证,不能超过8个字符
auth_pass 1111 #认证密码,最好使用随机数。openssl rand -hex 4
}
virtual_ipaddress { #设定虚拟路由器IP地址,可以指定配置在哪个物理接口上,也可以指定标签。其随着state的变化而增加或删除,state为MASTER时增加,BACKUP时删除。state由priority决定。
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #当虚拟路由器配置在某物理接口上时,此配置用于定义当该物理接口发生故障时,则转为FAULT状态,重新触发选举。
eth0
eth1
…
}
nopreempt #定义为非抢占模式,默认为抢占模式
preempt_delay #抢占模式下节点上线后触发新选举操作的延时时长
#在实例中,可以自定义通知方式,而不使用全局通知方式,配置如下
notify_master <STRING>|<QUOTED-STRING> #当前节点为主节点时触发的脚本
notify_backup <STRING>|<QUOTED-STRING> #当前节点为备节点时触发的脚本
notify_fault <STRING>|<QUOTED-STRING>#当前节点转为失败状态时触发的脚本
notify <STRING>|<QUOTED-STRING>#通用格式的通知触发机制,能完成上述三种状态切换的通知,不能与上述通知配置同时使用。
}
keepalived服务启动日志信息:保存于/var/log/messages
4.5、keepalived配置示例之vrrp instance实现:
配置前提:
(1) 各节点时间必须同步; 使用ntp或 chrony服务进行同步。
(2) 确保iptables及selinux不会成为阻碍;
(3) 各节点之间可通过主机名互相通信(非必须);
(4) 各节点之间的root用户 可以基于密钥认证的ssh互相通信;
实验环境:
node1 CentOS6.8 192.168.154.127
node2 CentOS6.8 192.168.154.128
虚拟路由器1:名称 testone ip:192.168.154.220
虚拟路由器2:名称 testtwo ip:192.168.154.230
node1为虚拟路由器1 testone的主节点,虚拟路由器2 testtwo的备节点
node2为虚拟路由器2 testtwo的主节点,虚拟路由器1 testone的备节点
1)单主配置。以配置testone为例
a)在node1上配置,其为主节点
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id 121
vrrp_mcast_group4 224.0.54.154
}
vrrp_instance testone {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 797fea91
}
virtual_ipaddress {
192.168.154.220/24 dev eth1
}
}
b)在node2上配置,其为备用节点。
备用节点配置文件在主节点配置文件的基础上修改state为BACKUP和priority低于主节点即可
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id 121
vrrp_mcast_group4 224.0.54.154
}
vrrp_instance testone {
state BACKUP #在备节点上state改为BACKUP
interface eth0
virtual_router_id 51
priority 95 #备节点上的priority低于主节点的priority
advert_int 1
authentication {
auth_type PASS
auth_pass 797fea91
}
virtual_ipaddress {
192.168.154.220/24 dev eth1
}
}
之后,分别在主节点和备节点启动keepalived服务。
c)在主节点上查看配置
查看网卡信息
d)查看备节点配置及网卡信息
2)主主配置。
配置2个虚拟路由器,一个节点为虚拟路由器1的主节点,虚拟路由器2的备节点;另一个节点为虚拟路由器2的主节点,虚拟路由器1的备节点。
a)在node1上新增虚拟路由器2 testtwo的配置,其为testtwo的备节点
vrrp_instance testtwo {
state BACKUP
interface eth0
virtual_router_id 52 #注:虚拟路由器之间的ID不能重复
priority 97
advert_int 1
authentication {
auth_type PASS
auth_pass fe9f18a0 #注:虚拟路由器之间的认证密码不能重复
}
virtual_ipaddress {
192.168.154.230/24 dev eth1 #注:虚拟路由器之间的虚拟IP互相独立
}
}
b)在node2上新增以下配置,其为testtwo的主节点
vrrp_instance testtwo {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass fe9f18a0
}
virtual_ipaddress {
192.168.154.230/24 dev eth1
}
}
c)先启动node1上的keepalived,查看主节点日志及网卡信息
发现,此时,由于node2上没有启动keepalived,所以node1既是testone的主节点,也是testtwo的主节点
d)启动node2上的keepalived,查看备节点日志及网卡信息。发现对于testtwo实例,其收到一个低优先级的组播信息,因此发起新的选举,成为testtwo的主节点。
e)此时,在查看node1上日志。发现对于testtwo实例,其受到一个更高优先级的组播,因此其转换为BACKUP模式,并且移除testtwo的虚拟IP
配置邮件通知。当主备节点之间发生切换时,系统管理员能查看到相应的信息,对系统的健康状态做出判断。
1)在node1上,编辑/etc/keepalived/notify.sh
#!/bin/bash
#
contact=’root@localhost’
notify() {
mailsubject=”$(hostname) to be testone $1, vip floating.”
mailbody=”$(date +’%F %T’): vrrp transition, $(hostname) changed to be $1″
echo “$mailbody” | mail -s “$mailsubject” $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo “Usage: $(basename $0) {master|backup|fault}”
exit 1
;;
esac
2)修改/etc/keepalived/notify.sh权限,增加可执行权限
3)vim /etc/keepalived/keepalived.conf。在testone实例中增加以下内容
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
如下图:
4)将脚本文件拷贝至其他备节点中,此处仅有node2节点。
5)同样也需要编辑/etc/keepalived/keepalived.conf。在testone实例中增加以下内容
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
6)测试。分别停掉node1、node2上的keepalived服务做测试。皆可看到
4.6、keepalived配置文件详解之virtual server配置
virtual_server VIP VPORT { #设置虚拟服务器,指定虚拟IP及服务端口,用空格分开
delay_loop 6 #设置服务轮询的时间间隔,单位秒
b_algo rr|wrr|lc|wlc|lblc|sh|dh #集群调度算法
lb_kind NAT|DR|TUN #集群类型
persistence_timeout 50 #持久连接时长。
protocol TCP #集群服务通过哪个协议提供
sorry_server 192.168.200.200 1358 #定义当整个集群不能正常提供服务时,由谁来对客户请求进行响应,而不是直接返回拒绝链接等错误信息。
real_server 192.168.201.100 443 { #集群服务器的Real Server IP及其端口
weight 1 #定义权重,数值越大,权重越高。性能较高的服务器建议设置较高的权重,能合理利用资源
notify_up <STRING>|<QUOTED-STRING> #定义RS状态改变脚本
notify_down <STRING>|<QUOTED-STRING> #定义RS状态改变脚本
#健康状态检测机制,支持应用层检测HTTP_GET、SSL_GET;传输层检测TCP_CHECK,使用一种即可。注:在做健康状态检测时,有三种方式:1、icmp ping;2、扫描tcp|udp服务端口;3、通过应用层协议直接请求关键资源,以判断服务是否可用。通常而言,使用应用层检测能精准定位服务是否可用。
HTTP_GET|SSL_GET {
url {
path <STRING> #定义要监控的URL
digest <STRING> #判断上述检测机制为健康状态的响应的内容的校验码
status_code <INT> #判断上述检测机制为健康状态的响应码。两种判断方式选择其一即可。也可一起使用。
}
connect_timeout <INTEGER> #连接超时时长
nb_get_retry <INT> #重试的次数;
delay_before_retry <INT> #重试之前延迟时长;
connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求;
connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求;
bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址;
bind_port <PORT> #源端口
}
TCP_CHECK {
connect_timeout <INTEGER> #连接超时时长
nb_get_retry <INT> #重试的次数;
delay_before_retry <INT> #重试之前延迟时长;
connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求;
connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求;
bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址;
bind_port <PORT> #源端口
}
}
}
4.7、keepalived配置示例之keepalive + LVS DR的实现
环境: http server通过lvs DR实现负载均衡,director service通过keepalived保证高可用。如下图所示
为了以示区别,http server1上的index页面内容为“this is RS1 website”; http server2上的index页面内容为“this is RS2 website”
配置步骤:
1)配置http server
a)在http server1上配置
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 192.168.154.168 netmask 255.255.255.255 up
route add -host 192.168.154.168 dev lo:0
之后:安装http程序,配置站点内容为“this is RS1 website”,并启动httpd服务,具体配置略。
b)在http server2上的配置类似http server1,不再赘述。
2)配置keepalived。
a)keepalived的主节点配置如下。编辑/etc/keepalived/keepalived.conf。配置内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id 121
vrrp_mcast_group4 224.0.54.154
}
vrrp_instance testone {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 797fea91
}
virtual_ipaddress {
192.168.154.168/24 dev eth1
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}
virtual_server 192.168.154.168 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.154.129 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.154.130 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
b)将主节点上/etc/keepalived/keepalived.conf配置文件拷贝至BACKUP上。
修改vrrp instance配置上的state 为BACKUP及priority低于MASTER的priority 100即可。
3)启动主节点及备节点上的keepalived服务。
4)模拟http server服务故障
在主节点上使用watch ipvsadm -Ln实时监控RS的健康状况。
停止http server1上的http服务:service httpd stop
5)当两个http server都出现故障时,即集群不能正常提供服务时。此时在请求http服务,会提示错误信息。但此错误信息并不能给予用户判断请求错误的原因提供帮助。通过配置sorry server可以让用户或系统管理员了解服务故障的部分原因。sorry server配置步骤如下:
a)在keepalived的MASTER和BACKUP节点上,配置http服务。在master上提供的页面内容为”http cluster with some wrong,this is sorry server 1″,backup上提供的页面内容为”http cluster with some wrong,this is sorry server 2″。
http服务配置完成之后,启动服务。
b)编辑主节点的/etc/keepalived/keepalived.conf配置文件。在virtual_server中增加以下内容:
sorry_server 127.0.0.1 80
在备节点上操作相同。
之后,在主、备节点上使用service keepalived reload重载配置。
c)在http server的http服务都停止时,再去访问。测试结果如下
测试命令:for i in {1..10};do curl http://192.168.154.168;done
此时,停止192.168.154.127上的keepalived服务,再次测试,结果为
6)从测试结果判断,keepalived + lvs DR工作正常。将停掉的keepalived服务恢复启动,确保http server及keepalived节点上的http服务为启动即可,至此,keepalived + lvs DR配置完成。
附:快速部署LVS DR的示例脚本。
#!/bin/bash
#
vip=”192.168.154.168″
vport=”80″
netmask=”255.255.255.255″
iface=”lo:0″
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $iface $vip netmask $netmask broadcast $vip up
route add -host $vip dev $iface
;;
stop)
ifconfig $iface down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
esac
原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/57040