一、Keepalived介绍
1、什么是keepalived
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
keepalived采用VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以软件的形式实现服务器热备功能。
通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。
如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。
二、Keepalived安装
目前最新的版本是1.2.23,通过源码安装。
# wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
# tar -zxvf keepalived-1.2.23.tar.gz
# cd keepalived-1.2.23
# ./configure --prefix=/usr/ --sysconfdir=/etc/
# make
# make install
三、Keepalived配置
keepalived安装完成之后,会生成一个默认的keeplived.conf文件,keepalived启动时会读取该文件,解析对应的参数。主要包括以下几个配置区域,分别是global_defs、vrrp_script、vrrp_instance、vrrp_sync_group和virtual_server。
1、global_defs
全局配置,主要是配置故障发生时的通知对象以及机器标识
global_defs {
notification_email { # 发生故障时,发送报警的邮件地址
acassen@firewall.loc # 可以设置多个,每个一行
failover@firewall.loc # 使用邮件报警,要求开启本机的sendmail服务
sysadmin@firewall.loc # yum -y install mailx sendmail
}
notification_email_from Alexandre.Cassen@firewall.loc # 邮件的发送地址
smtp_server 192.168.200.1 # SMTP服务器
smtp_connect_timeout 30 # SMTP服务器连接的超时时间
router_id LVS_DEVEL # 表示运行keepalived服务器标识,发邮件时显示在邮件主题中的信息
}
2、vrrp_script
keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。当需要根据业务进程的运行状态决定是否需要进行主备切换时,可以通过编写脚本对业务进程进行检测监控。
#查看haproxy服务是否存活的简单检查脚本
# cat check_haproxy.sh
#!/bin/bash
count = `ps aux | grep -v grep | grep haproxy | wc -l`
if [ $count > 0 ]; then
exit 0
else
exit 1
fi
#keepalived中vrrp_script区域
vrrp_script check_haproxy
{
script "/tmp/check_haproxy.sh" # 设置执行的脚本,可以是脚本,也可以是命令
interval 3 # script执行周期,每个interval执行一次健康检查
weight -20 # 健康检查返回0 & weight大于0,优先级增加相应权值;健康检查非0 & weight小于0,优先级减小相应值;
# 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
}
vrrp_instance test
{
...
track_script
{
check_haproxy
}
...
}
3、vrrp_instance
vrrp实例是由多个vip组成的逻辑集合,每个网卡至少绑定一个vrrp实例,可以有多个vrrp实例
vrrp_instance VI_1 { # VRRP 配置标识 VI_1是实例名称
state MASTER # 指定Keepalvied角色 MASTER表示此主机为主服务器 BACKUP则是表示为备用服务器
# 当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。
# 实际应用中,可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt(非抢占)解决异常恢复后再次抢占的问题。
interface eth0 # 节点固有IP(非VIP)的网卡,用来发VRRP包。
virtual_router_id 51 # 虚拟路由标识(0-255),同一个VRRP实例使用唯一的标识,DB中的规范是使用节点IP的最后一位。如10.10.16.51的51
priority 100 # 节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。如果某个节点初始state是master,但是优先级低,该节点会变成backup
nopeermt # 非抢占
advert_int 1 # 发送通告的时间间隔,
# 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time
authentication { # 设定节点间通信验证类型和密码,验证类型主要有PASS和AH(IPSEC)两种,网上说AH使用有问题,不知道是什么问题
auth_type PASS # 同一 vrrp 实例MASTER 与 BACKUP 使用相同的密码才能正常通信。
auth_pass 1111
}
track_script # 该实例需要执行的健康执行脚本,每个一行
{
check_haproxy
}
notify_master /etc/keepalived/master_script # 状态切换为master/backup/fault时执行对应的脚本
notify_backup /etc/keepalived/backup_script
notify_fault /etc/keepalived/fault_script
notify /etc/keepalived/script #状态变化时执行的脚本
virtual_ipaddress { # 设置虚拟IP地址 (VIP),又叫做漂移IP地址
192.168.200.16 # 可以有多个,每个一行
192.168.200.17
192.168.200.18
}
#其他配置
# mcast_src_ip 10.10.16.51 # 发送VRRP报文的源IP地址,不设置的话默认是绑定的网卡IP
# garp_master_delay 10 # 好像是切换到master的时候进行arp刷新的延迟时间(gratuitous arp)
# dont_track_primary # 忽略vrrp的网卡错误,不会进入fault状态
# preempt delay 5 # 抢占延迟时间
}
4、vrrp_sync_group
定义vrrp_intance组,使得这个组内成员动作一致。当两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。
5、virtual_server
当使用LVS + Keepalived时配置这个区域,用keepalived的配置文件来代替ipvsadm来配置LVS。
virtual_server 10.10.10.3 1358 { # 设置虚拟服务器,需要指定虚拟IP地址和服务器端口,我觉得这里的IP应该跟实例里面的VIP是一样的,但是Keepalived的default配置文件中并不一样
delay_loop 3 # service polling的delay时间,即服务轮询的时间间隔
lb_algo rr # LVS的调度算法
lb_kind NAT # LVS的集群模式
nat_mask 255.255.255.0 # 使用NAT时的子网掩码
persistence_timeout 50 # 会话保持时间,一个请求需要在该时间内被分配给一个realserver
protocol TCP # 转发协议的类型,这个不确定
real_server 192.168.200.4 1358 { # LVS中的realserver,有几个realserver就配置几个
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
四、LVS
keepalived中内置了负载均衡的功能,关于lvs的介绍,推荐以下几篇文章:
LVS八种调度算法:http://www.linuxvirtualserver.org/zh/lvs4.html
LVS三种负载均衡的方式(VS/NAT、VS/TUN、VS/DR):http://www.linuxvirtualserver.org/zh/lvs3.html
其中对于VS/DR和VS/TUN两种方式中,需要进行某些配置(绑定VIP到lo、配置arp等),具体参考:
http://zh.linuxvirtualserver.org/node/2585