keepalived实践总结

一:keepalived简介

   keepalived是一款高可用的开源软件,配置起来相比于Heartbeat来说要简单的多了,可以进行后端web server的健康检测功能。其实现原理是基于VRRP协议,多台服务器只向外提供一个共同的VIP和MAC地址,当服务器发生故障,各服务器之间会根据VRRP协议广播自己的优先级进行master竞选。


二:VRRP原理

   VRRP协议是为消除在静态缺省路由环境下的缺省路由器单点故障引起的网络失效而设计的主备模式的协议,使得在发生故障而进行设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。VRRP协议需要具有IP地址备份,优先路由选择,减少不必要的路由器间通信等功能。VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。


二:keepalived结构

wKioL1MhIbGBDdXpAAIQbSphHCU717.jpg

Control Plane: 负责配置文件的解析
Memory Management:负责内存管理 有两种模式一个是正常模式一个是就调试模式(可以追踪内存泄漏)
Schedule-I/O Multiplexer:负责I/O调度和服用
WatchDog:负责对子进程监控,每一个子进程都通过unix domain socket和watchdog进程连接,父进程会发送hello报文给子进程来对子进程进行监控
Core components:定义了一些全局的库文件,包括html解析,定时器,link-list,vector,格式化字符串,网络组件,pid handling , tcp layer4 ,daemon managerment,buffer dump
Checkers:负责realserver的健康检查,负责移除和添加realserver到lvs
SMTP:负责进行邮件通知
IPVS wrapper:负责在用户空间生成lvs规则并送往内核空间应用
IPVS:lvs代码

keepalived启动后主要有三个进程:

父进程:内存管理,子进程管理等等
子进程:VRRP子进程 负责VRRP报文的发送和竞选
子进程:healthchecker子进程


三:keepalived配置文件详解

//全局定义
global_defs
{
notification_email                          //定义发送邮件的地址
{
admin@example.com
}
notification_email_from admin@example.com  //定义使用什么邮件账号来发送
smtp_server 127.0.0.1                      //定义发送邮件的邮件服务器地址
stmp_connect_timeout 30                    //连接邮件服务器地址的超时时间
router_id node1                            //定义一个全局的路由标识 用于标识一台路由设备/PC
}
static_ipaddress                            //用于配置静态地址 等同于用ip ifconfig等命令设置静态地址 一般不需要配置
{
192.168.1.1/24 brd + dev eth0 scope global 
192.168.1.2/24 brd + dev eth1 scope global
}
static_routes                               //用于配置静态路由,等同于用route命令来配置路由条目,一般不需要配置
{
src $SRC_IP to $DST_IP dev $SRC_DEVICE
src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
}
vrrp_sync_group VG_1 {                      //配置一个同步组,用于设置几个实例,只有当几个实例都失效了菜才转移vip
group {                                     //将http mysql两个实例设置成一个组
http
mysql
}
notify_master /path/to/to_master            //切换到master状态执行的脚步
notify_backup /path_to/to_backup            //切换到backup状态执行的脚步
notify_fault "/path/fault.sh VG_1"          //切换到fault状态执行的脚步
notify /path/to/notify                     
smtp_alert                                  //状态切换的时候发送邮件信息
}
vrrp_instance http {                        //定义一个实例
state MASTER                                //定义实例的状态 MASTER 和 BACKUP 两种状态,意义不大 最终还是根据优先级确定state
interface eth0                              //实例绑定的接口 绑定虚拟IP的接口
dont_track_primary                          //忽略vrrp的interface错误
track_interface {                           //跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)                                                       状态切换的时候发送邮件信息态.
eth0
eth1
}
mcast_src_ip <IPADDR>                     //设置使用指定的ip发送多播数据包 默认使用绑定网卡的地址
garp_master_delay 10                        //切换到master后延迟进行arp请求 用于通知网关vip的mac地址更改
virtual_router_id 51                        //VRID 相同的VRID为一个组
priority 100                                //设置节点的优先级
advert_int 1                                //检测间隔
authentication {                            //多播报文是加密传送的,这里用于设置加密的类型和密码
auth_type PASS
autp_pass 1234
}
virtual_ipaddress {                         //设置VIP 可以指定VIP绑定的接口
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
virtual_routes {                            //设置虚拟路由
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2
192.168.112.0/24 via 192.168.100.254
}
nopreempt                                   //不抢占,当master挂了的时候,重新恢复后是否抢占再次变成master
preemtp_delay 300                           //抢占延迟
debug                                       //调试
}
vrrp_script check_running {                 //定义一个检测脚步
   script "/usr/local/bin/check_running"    //脚步的路径
   interval 10                              //定义脚步检测的间隔
   weight 10                                //脚步的结果导致的优先级的+10和-10
}
vrrp_instance http {
   state BACKUP
   smtp_alert
   interface eth0
   virtual_router_id 101
   priority 90
   advert_int 3
   authentication {
   auth_type PASS
   auth_pass whatever
   }
   virtual_ipaddress {
   1.1.1.1
   }
   track_script {                          //设置检测脚步
   check_running
   }
}
virtual_server_group <STRING> {           //定义一个lvs server组
# VIP port
<IPADDR> <PORT>
<IPADDR> <PORT>
fwmark <INT>
}
virtual_server 192.168.1.2 80 {         //定义一个lvs server实例
delay_loop 3                            //服务轮询的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh        //设置使用的算法
lb_kind NAT|DR|TUN                      //设置使用的lvs模型
persistence_timeout 120                 //设置会话保持
persistence_granularity <NETMASK>     //会话保持的粒度 定义那些realserver 做会话保持
protocol TCP                            //健康检查的使用的协议
ha_suspend                              //
virtualhost <string>                  //
sorry_server <IPADDR> <PORT>            //备用机 当所有后端realserver节点不可以用的时候 就临时把所有的请求都发送到这里(一般设置成lvs服务器自身,定义一个临时的错误界面)
real_server <IPADDR> <PORT>             //定义一个realserver
{
weight 1                                //定义权重
inhibit_on_failure                      //设置当节点不可用的时候把其权重设置为0 而不是从规则中删除
notify_up <STRING> | <QUOTED-STRING>    //检查服务器正常后执行的脚步
notify_down <STRING> | <QUOTED-STRING>  //检查服务器失败后的要执行的脚步
#HTTP_GET方式                             //定义HTTP_GET健康检查方式
HTTP_GET | SSL_GET
{                                  
url {                                   //定义检查的url
path /                                  //设置url路径
digest <STRING>                         //ssl 检查后的摘要信息                  
status_code 200                         //HTTP检查的状态返回码
}
connect_port 80                         //定义连接的端口
bindto <IPADD>                            //以这个绑定的地址发送请求对服务器进行监控检查
connect_timeout   3                     //连接超时时间
nb_get_retry 3                          //重连次数
delay_before_retry 2                    //重连间隔时间
}
#下面是常用的健康检查方式,健康检查方式一共有HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK这些
#TCP方式
TCP_CHECK {
connect_port 80
bindto 192.168.1.1
connect_timeout 4
} # TCP_CHECK


四:keepalived的安装


测试环境Centos6.4 安装kernel-devel是为了支持lvs,但是好像不装,并且不使用--with-kernel-dir也是可以的
yum install kernel-devel -y
wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
tar zxvf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-431.5.1.el6.x86_64/
make && make install
mkdir /etc/keepalived
cp keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived
cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
sed -i '15a\PATH=$PATH:/usr/local/keepalived/sbin/' /etc/init.d/keepalived