keepalive高可用

-------------------------------------------------------------------------------------------------------------------------------------------

一、集群Cluster

1、集群类型:

LB lvs/nginx(http/upstream, stream/upstream)

HA 高可用性

SPoF: Single Point of Failure

HPC

2、系统可用性的公式:A=MTBF/(MTBF+MTTR)

(0,1), 95%

几个9(指标): 99%, ..., 99.999%,99.9999%;

系统故障:

硬件故障:设计缺陷、wear out(损耗)、自然灾害……

软件故障:设计缺陷

3、提升系统高用性的解决方案之降低MTTR:

手段:冗余redundant

active/passive 主备

active/active 双主

active --> HEARTBEAT --> passive

active <--> HEARTBEAT <--> active

4、高可用的是“服务”:

HA nginx service:

vip/nginx process[/shared storage]

资源:组成一个高可用服务的“组件”

(1) passive node的数量

(2) 资源切换

5、shared storage:

NAS:文件共享服务器;

SAN:存储区域网络,块级别的共享

6、Network partition:网络分区

quorum:法定人数

with quorum: > total/2

without quorum: <= total/2

隔离设备: fence

node:STONITH = Shooting The Other Node In The Head,断电重启

资源:断开存储的连接

7、TWO nodes Cluster

辅助设备:ping node, quorum disk

8、Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作

Failback:故障移回,即某资源的主节点故障后重新修改上线后,将之前已转移至其它节点的资源重新切回的过程

9、HA Cluster实现方案:

ais:应用接口规范 完备复杂的HA集群

RHCS:Red Hat Cluster Suite红帽集群套件

heartbeat

corosync

vrrp协议实现:虚拟路由冗余协议

keepalived

二、KeepAlived

1、keepalived:

vrrp协议:Virtual Router Redundancy Protocol,一种容错协议

2、术语:

虚拟路由器:Virtual Router

虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器

物理路由器:

master:主设备,承担报文转发任务

backup:备用设备,主路由器故障时,能代替主路由器工作的备用路由器

priority:优先级

VIP:Virtual IP,虚拟路由器的IP地址,一个虚拟路由器可以拥有一个或多个IP地址

VMAC:Virutal MAC (00-00-5e-00-01-VRID),不能用来通信,只是一种标识而已

3、通告:心跳,优先级等;周期性

4、工作方式:抢占式,非抢占式

抢占式:发现优先级比自己低的设备在主设备,都会发起新一轮的选举,让自己做主设备

非抢占式:当格局已定,无论优先级如何,都不会发起选举

5、安全工作:

认证:

无认证

简单字符认证:预共享密钥

MD5

6、工作模式:

主/备:单虚拟路径器

主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)

7、keepalived:

vrrp协议的软件实现,原生设计目的为了高可用ipvs服务

8、功能:

(1)vrrp协议完成地址流动

(2)为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

(3)为ipvs集群的各RS做健康状态检测

(4)基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,以此支持作调度器的nginx、haproxy等服务

9、组件:

核心组件:

vrrp stack

ipvs wrapper

checkers

控制组件:配置文件分析器

IO复用器

内存管理组件

10、keepalived组成

checkers:健康性检查

VRRP Stack:vrrp协议的实现,判定主节点和从节点,并检测主节点可以和从节点发heartbeats

watch dog:内核中的组件

三、KeepAlived实现

1、HA Cluster 配置准备:

(1) 各节点时间必须同步

ntp, chrony

(2) 确保iptables及selinux不会成为阻碍

(3) 各节点之间可通过主机名互相通信(对KA并非必须)

建议使用/etc/hosts文件实现,如果DNS出现问题会使稳定性大打折扣

(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(对KA并非必须)

2、keepalived安装配置:

CentOS 6.4+ Base源

yum -y install keepalived

3、程序环境:

主配置文件:/etc/keepalived/keepalived.conf

主程序文件:/usr/sbin/keepalived

Unit File:/usr/lib/systemd/system/keepalived.service

Unit File的环境配置文件:/etc/sysconfig/keepalived

四、KeepAlived配置

1、配置文件组件部分:

2、TOP HIERACHY

GLOBAL CONFIGURATION

Global definitions

Static routes/addresses

VRRPD CONFIGURATION

VRRP synchronization group(s):vrrp同步组

VRRP instance(s):即一个vrrp虚拟路由器

LVS CONFIGURATION

Virtual server group(s)

Virtual server(s):ipvs集群的vs和rs

3、配置语法:

(1)配置虚拟路由器:每一个虚拟路由器对应一个vrrp_instance(vrrp实例)

vrrp_instance {

....

}

(2)专用参数:

state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP

interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口

virtual_router_id VRID:当前虚拟路由器惟一标识,范围是0-255

priority 100:当前物理节点在此虚拟路由器中的优先级;范围1-254

advert_int 1:vrrp通告的时间间隔,默认1s

authentication { #认证机制

auth_type AH|PASS

auth_pass 仅前8位有效

}

virtual_ipaddress { #虚拟IP

/ brd dev scope label

192.168.200.17/24 dev eth1

192.168.200.18/24 dev eth2 label eth2:1

}

track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态 实现地址转移

eth0

eth1

}

(3)nopreempt:定义工作模式为非抢占模式

(4)preempt_delay 300:抢占式模式,节点上线后触发新选举操作的延迟时长,默认模式

(5)定义通知脚本:

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 #主机名,在另一结点为node2

vrrp_mcast_group4 224.0.100.100

----》定义组播域的组播地址,默认是224.0.0.18(224~239)

}

vrrp_instance VI_1 {

state MASTER ----》定义自己为master,其余结点上都为BACKUP

interface eth0

virtual_router_id 6 ----》多个节点必须相同,0~255之间

priority 100 ----》定义优先级

advert_int 1 ----》通告间隔1s

authentication {

auth_type PASS  ----》只有PASS和AH选项,简易用PASS

auth_pass 571f97b2 ----》无论密码多长,只支持前8个字符

}

virtual_ipaddress { ----》定义虚拟ip

172.18.100.66/16 dev eth0 label eth0:0

172.168.100.67/16 dev eth1

}

track_interface {

eth0

}

}

示例:

主服务器的配置,即state MASTER的配置

从服务器的配置,glob

结束时候主服务器重启keepalived服务,从服务器tcpdump -i eth0 -nn host 224.0.56.18,对广播域抓包,有结果:

六、KeepAlived双主配置

1、脚本的调用方法:

在vrrp_instance VI_1 语句块最后面加下面行

notify_master "/etc/keepalived/notify.sh master"

notify_backup "/etc/keepalived/notify.sh backup"

notify_fault "/etc/keepalived/notify.sh fault"

2、示例通知脚本

#!/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

示例:测试脚本,用master测试,邮箱内有邮件

之后vim /etc/keepalived/keepalived.conf,修改完成后重启keepalived

在另一节点主机vim /etc/keepalived/keepalived.conf添加同样内容,scp脚本至此主机,完成后重启keepalived

七、KeepAlived支持IPVS

1、虚拟服务器:

配置参数:

virtual_server IP port | virtual_server fwmark int ----》vip 端口或者防火墙标记

{

...

real_server {

...

}

...

}

delay_loop :检查后端服务器的时间间隔

 lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法

 lb_kind NAT|DR|TUN:LVS集群的类型

 persistence_timeout :持久连接时长

 protocol TCP:服务协议,仅支持TCP

 sorry_server :所有RS故障时,备用服务器地址

 real_server

{

weight RS权重

notify_up | RS上线通知脚本

notify_down | RS下线通知脚本

HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { ... }:定义当前主机的健康状态检测方法

}

八、KeepAlived配置检测

1、 HTTP_GET|SSL_GET:应用层检测

HTTP_GET|SSL_GET {

url {

path :定义要监控的URL

status_code :判断上述检测机制为健康状态的响应码

digest :判断为健康状态的响应的内容的校验码

}

connect_timeout :连接请求的超时时长

nb_get_retry :重试次数

delay_before_retry :重试之前的延迟时长

connect_ip :向当前RS哪个IP地址发起健康状态检测请求

connect_port :向当前RS的哪个PORT发起健康状态检测请求

bindto :发出健康状态检测请求时使用的源地址

bind_port :发出健康状态检测请求时使用的源端口

}

2、传输层检测 TCP_CHECK

TCP_CHECK {

connect_ip :向当前RS的哪个IP地址发起健康状态检测请求

connect_port :向当前RS的哪个PORT发起健康状态检测请求

bindto :发出健康状态检测请求时使用的源地址

bind_port :发出健康状态检测请求时使用的源端口

connect_timeout :连接请求的超时时长

九、keepalived调用脚本进行资源监控

1、keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

2、vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外

3、track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script

4、分两步:(1) 先定义一个脚本;(2) 调用此脚本

vrrp_script {

script ""

interval INT

weight -INT

}

track_script {

SCRIPT_NAME_1

SCRIPT_NAME_2

}

十、LVS NAT模型VIP和DIP需要同步,需要同步组,一般高可用实现此模型较为复杂,建议用nginx或haproxy实现

vrrp_sync_group VG_1 {

group {

VI_1 # name of vrrp_instance (below)

VI_2 # One for each moveable IP.

}

}

vrrp_instance VI_1 {

eth0

vip

}

vrrp_instance VI_2 {

eth1

dip

}

说明vip写到实例VI_1库,dip写到实例VI_2里,两个实例在之前被vrrp_sync_group 定义到一个同步组VG_1中,所以调度的时候这两个地址一起漂移

十一、keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;

分两步:(1) 先定义一个脚本;(2) 在vrrp实例中调用此脚本;

vrrp_script {s

script ""

              interval INT

              weight -INT

rise 2

fall 3

}

track_script {

SCRIPT_NAME_1

SCRIPT_NAME_2

...

}

注意:

            vrrp_script chk_down {

                script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"

                interval 1

                weight -10

            }

                [[ -f /etc/keepalived/down ]]要特别地作为bash的参数的运行! 

示例:结合外部脚本来影响虚拟路由器的内部判断结果中各节点或各实例的相关权重

vim /etc/keepalived/keepalived.conf

在LVS1、LVS2中都写入这两段

结果当master的LVS1服务器在/etc/keepalived/新建down文件后,LVS1将降权,ip地址漂移到LVS2上

示例:高可用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 "/usr/bin/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"

}