HA Cluster
-
集群类型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP
-
系统可用性的公式:A=MTBF/(MTBF+MTTR)
-
系统故障:
- 硬件故障:设计缺陷、wear out、自然灾害
- 软件故障:设计缺陷
-
提升系统高用性的解决方案之降低MTTR:
-
解决方案:冗余(redundant)
active/passive(主备),active/active(双主)
-
解决方案:冗余(redundant)
-
在资源级别定义优先级,定义对资源的倾向性
-
Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作;
-
Failback:故障移回,即某资源的主节点故障后重新修改上线后,将转移至其它节点的资源重新切回的过程;
-
-
HA Cluster实现方案:
-
vrrp协议的实现
- keepalived
-
ais:完备HA集群
- RHCS(cman)
- heartbeat
- corosync
-
vrrp协议的实现
keepalived
-
vrrp协议:Virtual Redundant Routing Protocol
-
术语:
- 虚拟路由器:Virtual Router:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关。
- 虚拟路由器标识:VRID(0-255):有相同VRID的一组物理路由器构成一个虚拟路由器。用来标识路由器
-
物理路由器:
master:主设备 #虚拟路由器中承担报文转发任务的路由器。
backup:备用设备 #master路由器出现故障时,能够代替master路由器工作的路由器。
priority:优先级 #指的是物理节点的优先级,vrrp根据优先级来确定虚拟路由器中每台路由器的地位。 -
VIP:Virtual IP #虚拟路由器的IP地址。一个虚拟路由器可以拥有一个或多个IP地址。
-
VMAC:Virutal MAC 一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为(00-00-5e-00-01-VRID)。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。
-
非抢占式:只有对方故障了,才可以抢; #如果Backup路由器工作在非抢占方式下,则只要master路由器没有出现故障,backup路由器即使随后被配置了更高的优先级也不会成为master路由器。
-
抢占式:只要对方的优先级比自己的低,就抢; #如果backup路由器工作在抢占方式下,当它收到vrrp报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的master路由器的优先级高,就会主动抢占成为master路由器;否则,将保持backup状态。
-
选举:比较优先级
-
通告:心跳,优先级等;周期性;
采用组播方式发送心跳,并且对信息进行认证 -
认证:
-
无认证
简单字符认证
MD5
-
无认证
-
工作模式:
-
主/备:单虚拟路由器;
主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
-
主/备:单虚拟路由器;
-
-
keepalived:
-
vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:
- 基于vrrp协议完成地址流动;
- 为ipvs集群节点生成ipvs规则(在配置文件中预先定义);
- 为ipvs集群的各RS做健康状态检测;基于检测结果完成节点管理;
- 基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务;
-
组件:
-
核心组件:
vrrp stack
ipvs wrapper
checkers -
控制组件:
配置文件分析器
IO复用器
内存管理组件
-
核心组件:
-
-
HA Cluster的配置前提:
-
各节点时间必须同步;
ntp, chrony - 确保iptables及selinux不会成为阻碍;
- 各节点之间可通过主机名互相通信(对keepalived并非必须);建议使用/etc/hosts文件实现;
-
确保各节点的用于集群服务的接口支持MULTICAST通信;
D类:224-239; - 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)
-
各节点时间必须同步;
-
keepalived安装配置:
-
程序环境:
- 主配置文件:/etc/keepalived/keepalived.conf
- 主程序文件:/usr/sbin/keepalived
- Unit File:keepalived.service
- Unit File的环境配置文件:/etc/sysconfig/keepalived
-
配置文件组件部分:
-
GLOBAL CONFIGURATION
- Global definitions
- Static routes/addresses
-
VRRPD CONFIGURATION
-
VRRP synchronization group(s):vrrp同步组;把两个虚拟路由器定义成一个同步组就能确保这两个必须把vip放在同一个节点上;
nat服务集群时要求使用此功能; - VRRP instance(s):每个vrrp instance即一个vrrp路由器;
- VRRP脚本
-
VRRP synchronization group(s):vrrp同步组;把两个虚拟路由器定义成一个同步组就能确保这两个必须把vip放在同一个节点上;
-
LVS CONFIGURATION
- Virtual server group(s)
- Virtual server(s):ipvs集群的vs和rs;
-
GLOBAL CONFIGURATION
-
配置语法:
-
配置虚拟路由器:
vrrp_instance <STRING> { .... }
- state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
- interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口;
- virtual_router_id VRID:当前虚拟路由器的惟一标识,范围是0-255;
- priority 100:当前主机在此虚拟路径器中的优先级;范围1-254;
-
advert_int 1:vrrp通告的时间间隔;主备间通告时间检查的时间间隔,单位为s,默认1s
-
设置认证
authentication { auth_type AH|PASS auth_pass <PASSWORD> }
-
设置VIP即虚拟IP地址
virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 }
-
配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
track_interface { eth0 eth1 ... }
- nopreempt:定义工作模式为非抢占模式;
-
preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;
-
定义通知脚本:
- notify_master |:当前节点成为主节点时触发的脚本;
- notify_backup |:当前节点转为备节点时触发的脚本;
-
notify_fault |:当前节点转为“失败”状态时触发的脚本;
-
notify |:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;
-
-
单主配置示例:
! 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 node1 vrrp_mcast_group4 224.0.100.19 } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 14 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.91/16 dev eno16777736 } }
-
双主模型示例:
! 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 node1 vrrp_mcast_group4 224.0.100.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.91/16 dev eno16777736 } } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 15 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 578f07b2 } virtual_ipaddress { 10.1.0.92/16 dev eno16777736 } }
-
示例通知脚本:
#!/bin/bash # contact='root@localhost' notify() { local mailsubject="$(hostname) to be $1, vip floating" local 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
-
脚本的调用方法:
notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
-
脚本的调用方法:
-
-
虚拟服务器配置:
virtual_server IP port | virtual_server fwmark int { ... real_server { ... } ... }
-
常用参数:
delay_loop <INT>:服务轮询的时间间隔; lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法; lb_kind NAT|DR|TUN:集群的类型; persistence_timeout <INT>:持久连接时长; protocol TCP:服务协议,仅支持TCP; sorry_server <IPADDR> <PORT>:备用服务器地址; real_server <IPADDR> <PORT> { weight <INT> notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定义当前主机的健康状态检测方法; }
-
HTTP_GET|SSL_GET:应用层检测
HTTP_GET|SSL_GET { url { path <URL_PATH>:定义要监控的URL; status_code <INT>:判断上述检测机制为健康状态的响应码; digest <STRING>:判断上述检测机制为健康状态的响应的内容的校验码; #示例:~]# curl -s http://172.16.250.173 | md5sum } 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>:发出健康状态检测请求时使用的源端口; connect_timeout <INTEGER>:连接请求的超时时长; }
TCP_CHECK { connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址; bind_port <PORT>:发出健康状态检测请求时使用的源端口; connect_timeout <INTEGER>:连接请求的超时时长; }
-
常用参数:
-
高可用的ipvs集群示例:
! 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 node1 vrrp_mcast_group4 224.0.100.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.93/16 dev eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 10.1.0.93 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.0.69 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.0.71 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
-
TCP_CHECK使用示例:
TCP_CHECK { nb_get_retry 3 delay_before_retry 2 connect_timeout 3 }
-
TCP_CHECK使用示例:
-
keepalived如果要是高可用其他应用,需调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;
-
脚本的作用:
- 当地址转移到这个节点的时候,将nginx启动;
- 当不能启动时,还可以将IP地址转移出去,降低优先级,促使其他节点配置此IP地址。
-
分两步:(1) 先定义一个脚本;(2) 调用此脚本;
vrrp_script <SCRIPT_NAME> { script "" interval INT #此脚本每个多长时间执行一次 weight -INT #万一失败了,当前节点的权重减一个数,减过的权重小于备用节点; } track_script { SCRIPT_NAME_1 SCRIPT_NAME_2 ... }
-
示例:高可用nginx服务
! 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 node1 vrrp_mcast_group4 224.0.100.19 } vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -5 } vrrp_script chk_nginx { script "killall -0 nginx && exit 0 || exit 1" interval 1 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.93/16 dev eno16777736 } track_script { chk_down chk_nginx } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
-
原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/78617