keepalived观其名可知保持存活在网络里面就是保持在线。也就是所谓的高可用或热备用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生.
Keepalived是用VRRP协议来实现高可用性(HA)的。关于VRRP协议参考
http://blog.csdn.net/gua___gua/article/details/49803695
官方下载地址: http://www.keepalived.org/download.html
2、Keepalived原理
keepalived也是模块化设计,不同模块复杂不同的功能。下面是keepalived的组件
core check vrrp libipfwc libipvs-2.4 libipvs-2.6
core:keepalived的核心复杂主进程的启动和维护全局配置文件的加载解析等
check:负责healthchecker(健康检查)包括了各种健康检查方式以及对应的配置的解析包括LVS的配置解析
vrrp:VRRPD子进程是来实现VRRP协议的
libipfwc:iptables(ipchains)库配置LVS会用到
libipvs*:配置LVS会用到
注意:keepalived和LVS完全是两码事只不过他们各负其责相互配合而已
keepalived启动后会有三个进程
父进程:负责内存管理子进程管理等等
VRRP子进程
health checker子进程
上图可知两个子进程都被系统WatchDog看管,各自负责自己的事。health checker子进程负责检查各自服务器的健康程度,例如HTTPLVS等等。如果 health checker子进程 检查到MASTER上服务不可用了就会通知本机上的兄弟 VRRP子进程,让他删除通告并且去掉虚拟IP转换为BACKUP状态。
3、Keepalived配置文件详解
keepalived有两类配置区域(姑且就叫区域,分别是全局配置区和VRRPD配置区)注意不是两种种配置文件是一个配置文件里面三种不同类别的配置区域。
3.1全局配置(Global Configuration)
全局配置又包括两个子配置,全局定义(global definition)、静态路由配置(static ipaddress/routes)。
<1>、全局定义(global definition)
示例:
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
}
global_defs:全局配置标识。表明这个区域{}是全局配置。
notification_email:表示keepalived在发生诸如切换操作时需要发送email通知以及email发送给哪些邮件地址邮件地址可以多个每行一个。
notification_email_from:表示发送通知邮件时邮件源地址是谁。
smtp_server:表示发送email时使用的smtp服务器地址这里可以用本地的sendmail来实现
smtp_connect_timeout:连接smtp连接超时时间
router_id:机器标识
<2>、静态地址和路由配置
示例:
notification_email
{
admin@example.com
admin@ywlm.net
}
这里实际上和系统里面命令配置IP地址和路由一样。
例如 192.168.1.1/24 brd + dev eth0 scope global 相当于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global 就是给eth0配置IP地址,路由同理。一般这个区域不需要配置
这里实际上就是给服务器配置真实的IP地址和路由的在复杂的环境下可能需要配置,一般不会用这个来配置。我们可以直接用vi /etc/sysconfig/network-script/ifcfg-eth1来配置切记这里可不是VIP哦不要搞混淆了切记切记
3.2VRRPD配置
VRRPD配置包括三个类,VRRP同步组(synchroization group)、VRRP实例(VRRP Instance)、VRRP脚本
<1>、VRRP同步组(synchroization group)
示例:
vrrp_sync_group VG_1 {
group {
http
mysql
}
notify_master /path/to/to_master.sh
notify_backup /path_to/to_backup.sh
notify_fault "/path/fault.sh VG_1"
notify /path/to/notify.sh
smtp_alert
}
group:里面的http和mysql是实例名和下面的实例名一致。
notify_maste:指出切换到master状态时要执行的脚本。
notify_backup:指出当切换到backup状态时要执行的脚本
notify_fault:状态改变为fault后执行的脚本。
notify_stop:VRRP停止后执行的脚本。
notify:任意状态改变后执行的脚本。
smtp_alter:表示切换时给global defs中定义的邮件地址发送右键通知<2>、VRRP实例(instance)
示例:
vrrp_instance http {
state MASTER
interface eth0
dont_track_primary
track_interface {
eth0
eth1
}
mcast_src_ip <IPADDR>
garp_master_delay 10
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
autp_pass 1234
}
virtual_ipaddress {
#<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
preemtp_delay 300
debug
}
state:指定 instance(Initial)的初始状态就是说在配置好后这台 服务器的初始状态就是这里指定的但这里指定的不算还是得要通过竞选通过优先级来确定里如果这里设置为master但如若他的优先级不及另外一台 那么这台在发送通告时会发送自己的优先级另外一台发现优先级不如自己的高那么他会就回抢占为master。
interface;实例绑定的网卡因为在配置虚拟IP的时候必须是在已有的网卡上添加的
dont_track_primary:忽略VRRP的interface错误
track_interface: 跟踪接口设置额外的监控里面任意一块网卡出现问题都会进入故障(FAULT)状态例如用nginx做均衡器的时候内网必须正常工作如果内网出问题了这个均衡器也就无法运作了所以必须对内外网同时做健康检查
mcast_src_ip:发送多播数据包时的源IP地址。这里注意了,这里实际上就是在那个地址上发送VRRP通告这个非常重要,一定要选择稳定的网卡端口来发送。这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP也就是interface指定的IP地址
garp_master_delay:在切换到master状态后延迟进行免费的ARP(gratuitous ARP)请求
virtual_router_id:这里设置VRID这里非常重要相同的VRID为一个组他将决定多播的MAC地址
priority:设置本节点的优先级优先级高的为master
advert_int: 检查间隔默认为1秒
virtual_ipaddress:这里设置的就是VIP也就是虚拟IP地址。他随着state的变化而增加或删除,当state为master的时候就添加,当state为backup的时候删除。这里主要是有优先级来决定的,和state设置的值没有多大关系。这里可以设置多个IP地址
virtual_routes:原理和virtual_ipaddress一样只不过这里是增加和删除路由
lvs sync daemon interface lvs syncd绑定的网卡
authentication:这里设置认证
auth_type:认证方式可以是PASS或AH两种认证方式
autp_pass:认证密码
nopreempt:设置不抢占,这里只能设置在state为backup的节点上而且这个节点的优先级必须别另外的高
preemtp_delay:抢占延迟
debug:debug级别
notify_master 和sync_group:这里设置的含义一样可以单独设置.例如不同的实例通知不同的管理人员,http实例发给网站管理员,mysql的就发邮件给DBA
<3>、VRRP脚本
示例:
vrrp_script check_running {
script "/usr/local/bin/check_running"
interval 10
weight 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 weight 20
}
}
vrrp_script:现在vrrp_script定义脚本名字和脚本执行的间隔和脚本执行的优先级
vrrp_instance:然后在vrrp_instance里面引用。有点类似脚本里面的函数引用一样先定义后引用函数名。
注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别。
整理自网络