0x00 前言
传统的集群方案( 如 lvs ) 在 director 处容易出现单点故障,为了解决此问题,可在 Director 处设立 冗余。当一个出现故障时,另一个可取而代之。
活动节点不但要自己提供服务,而且还将自己的活动信息以固定频率周期性的同步给备用节点, 备用节点在一个或指定的周期内没能收到心跳信息时会取而代之。
-
衡量系统可用的指标:
A=MTFB/(MTBF+MTTR)
95%, 99%, …, 99.999%,99.9999%; -
HA Cluster实现方案:
-
vrrp协议的实现 :
keepalived -
ais:完备HA集群 :
RHCS(cman)
heartbeat
corosync
-
vrrp协议的实现 :
0x01 VRRP 协议
VRRP 简介
-
VRRP : Virtual Router Redundancy Protocol (虚拟路由冗余协议), 是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议.
-
VRRP广泛应用在边缘网络中
-
VRRP设计目标:
支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及及时在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。
VRRP 工作原理
- 路由器开启VRRP功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为主用路由器,优先级低的成为备用路由器。主用路由器定期发送VRRP通告报文,通知备份组内的其他路由器自己工作正常;备用路由器则启动定时器等待通告报文的到来。
-
VRRP在不同的主用抢占方式下,主用角色的替换方式不同
- 在抢占方式下,当主用路由器收到VRRP通告报文后,会将自己的优先级与通告报文中的优先级进行比较。如果大于通告报文中的优先级,则成为主用路由器;否则将保持备用状态。
- 在非抢占方式下,只要主用路由器没有出现故障,备份组中的路由器始终保持主用或备用状态,备份组中的路由器即使随后被配置了更高的优先级也不会成为主用路由器。
- 如果备用路由器的定时器超时后仍未收到主用路由器发送来的VRRP通告报文,则认为主用路由器已经无法正常工作,此时备用路由器会认为自己是主用路由器,并对外发送VRRP通告报文。备份组内的路由器根据优先级选举出主用路由器,承担报文的转发功能。
VRRP负载分担方式的特点
- 每个备份组都包括一个主用路由器和若干个备用路由器。
- 各备份组的主用路由器可以不相同
- 同一台路由器可以加入多个备份组,在不同备份组中有不同的优先级,使得该路由器可以在一个备份组中作为主用路由器,在其他的备份组中作为备用路由器。
VRRP 中的一些术语
- VR: Virtual Router 虚拟路由器
- VRID 虚拟路由器标识:0-255)
-
物理路由器:
master:主设备
backup:备用设备
priority:优先级 - VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID) (一般是固定的)
VRRP 的控制报文机制—— VRRP通告:(advertisement)。
它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内。
VRRP在安全方面:可以采用简单字符认证,或MD5 认证( 8 位); 也可以使用无认证方式。
0x02 keepalived 功用:
keepalived : vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:
- vrrp 协议的软件实现,完成地址流动
- 根据 读取配置文件 为 unix主机内核 生成 ipvs 规则, 提供了 高可用ipvs服务
- 为ipvs集群的各RS做健康状态检测;
- 基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务;
0x03 keepalived 配置
HA Cluster 的配置前提:
-
各节点时间必须同步
ntp, chony -
确保iptables, selinux 不成为阻碍。
iptables -F && setenforce 0 -
各节点之间可通过主机名互相通信 (对KA并非必须);
建议使用 /etc/hosts 文件实现解析; (不要用DNS 解析) - 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)
配置文件组件部分:
-
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses -
VRRPD CONFIGURATION
VRRP synchronization group(s):vrrp同步组;
VRRP instance(s):每个vrrp instance相当于一个vrrp路由器; -
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):ipvs集群的vs和rs;
配置文件解析:
! Configuration File for keepalived ### GLOBAL CONFIGURATION ### global_defs { ## 定义通知接收邮箱 ## notification_email { root@localhost } #- - - - - -# notification_email_from keepalived@localhost # 通知发送邮箱 smtp_server 127.0.0.1 # 邮箱server smtp_connect_timeout 30 router_id node1 # 定义 router_id vrrp_mcast_group4 224.0.100.19 # 组播域 } ### VRRPD CONFIGURATION ### ### vrrp_script ### vrrp_script script_name { script " killall -0 nginx && exit || exit 1" interval 1 # 间隔时间 weight -5 } vrrp_script script_name2 { ... } ### vrrp_instance ### vrrp_instance KA_1 { state MASTER # 主备状态 MASTER | BACKUP interface ens32 # 定义 网卡接口 virtual_router_id 51 # 虚拟路由 id priority 100 # 优先级 advert_int 1 authentication { auth_type PASS auth_pass qweqwe # 指定 密码 } ## 定义 virtual_ipaddress ## virtual_ipaddress { 172.18.9.111/16 } track_script { # 调用下面的脚本 # script_name } ## 调用通知脚本 ## 脚本见附录 notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance KA_2 { ... } ### LVS CONFIGURATION ### virtual_server 192.168.200.100 443 { delay_loop 6 # 服务轮询的时间间隔 lb_algo rr # 定义调度方法: rr|wrr|lc|wlc|lblc|sh|dh lb_kind NAT # 集群的类型 NAT | DR | TUN nat_mask 255.255.255.0 # 只限于 NAT 类型使用 persistence_timeout 50 # 持久连接时长 protocol TCP # 服务协议,仅支持TCP # sorry_server <IPADDR> <PORT> # 备用服务器地址 ## real_server <IPADDR> <PORT> real_server 192.168.201.100 443 { weight 1 # 定义 weight SSL_GET { # 应用层检测 HTTP_GET|SSL_GET url { path / # 定义要监控的 URL_PATH # status_code <INT> # 判断上述检测机制为健康状态的响应码; digest ff20ad2481f97b1754ef3e12ecd3a9cc # 判断上述检测机制为健康状态的响应的内容的校验码 } url { ... } connect_timeout 3 # 连接请求的超时时长 nb_get_retry 3 # 重试次数 delay_before_retry 3 # 重试之前的延迟时长 #connect_ip <IP ADDRESS> # 向当前RS的哪个IP地址发起健康状态检测请求 #connect_port <PORT> # 向当前RS的哪个PORT发起健康状态检测请求 #bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址; #bind_port <PORT> # 发出健康状态检测请求时使用的源端口; } #TCP_CHECK { #connect_ip <IP ADDRESS> # 向当前RS的哪个IP地址发起健康状态检测请求 #connect_port <PORT> # 向当前RS的哪个PORT发起健康状态检测请求 #bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址; #bind_port <PORT> # 发出健康状态检测请求时使用的源端口; #connect_timeout <INTEGER> # 连接请求的超时时长; # } } }
附:邮件通知脚本
#!/bin/bash # contact='root@localhost' notify() { mailsubject="$(hostname) to be $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
原创文章,作者:Yanglibin,如若转载,请注明出处:http://www.178linux.com/75916