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结构

keepalived实践总结_第1张图片

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                          //定义发送邮件的地址
{
[email protected]
}
notification_email_from [email protected]  //定义使用什么邮件账号来发送
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                      //设置使用指定的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绑定的接口
#/ brd  dev  scope  label 


四: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