高可用集群(HA)之Keeplived原理+配置过程
原理-->
通过vrrp协议,定义虚拟路由,在多个服务节点上进行转移.
通过节点优先级,将初始虚拟路由到优先级高的节点上,checker工作进程检测到主节点出问题时,则降低此节点优先级,从而实现了虚拟路由的重新选择.
通过notify定义通知脚本,在重新选择时,发送通知邮件.
故,根据vrrp的运行机制,那么keepalived的默认工作机制就是一主多从.
vrrp状态转移机制图:
![](http://images0.cnblogs.com/blog/507024/201402/040302111434771.jpg)
若需要双主,则需要在节点前,添加两组vip和vmac,然后将客户端分成两份,一份指向vip1,一份指向vip2,vip1对应节点A,vip2对应节点B,并通过dns的A记录,来将客户的请求,均分到两个节点上,并通过节点反向代理给上游服务器
![](http://images0.cnblogs.com/blog/507024/201402/040302130022171.jpg)
功能-->
最初就是为了给IPVS提供高可用,并且可以自动调用ipvsadm添加规则,当然规则信息是又keepalived的配置文件定义的,后来也可以为其他轻量级的调度器(nginx等)提供高可用,不过在非ipvs服务中,需要调用vrrp_script来判定
核心组件-->master进程+vrrp+checkers
![](http://images0.cnblogs.com/blog/507024/201402/040302142689982.jpg)
master进程基于watchdog来查看子进程的状态,子进程不停的通过内部套接字给主进程发送心跳信息,如果master没收到,则kill掉对应的子进程,并重启
子进程有两个:
vrrp:虚拟冗余路由协议,作用就是将多个网关虚拟成一个虚拟网关(vip和vmac都是虚拟的),从而解决默认网关失效
checkers:检查各项服务的可用性,,怎么检测,则需要自己定义脚本
配置文件-->/etc/keepalived/keepalived.conf(每个节点都需要)
! Configuration File for keepalived
#****************************************全局配置段************************************
global_defs {
#定义接收邮箱
notification_email {
root@localhost
}
#定义发送邮箱(可随意,即便不存在也可以)
notification_email_from admin@localhost
#****************************************全局配置段************************************
global_defs {
#定义接收邮箱
notification_email {
root@localhost
}
#定义发送邮箱(可随意,即便不存在也可以)
notification_email_from admin@localhost
#定义邮件服务器
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#********************************虚拟路由配置段:定义虚拟路由相关信*************************************
#为keepalived定义服务检测脚本,定义关键字就是vrrp_script
vrrp_script chk_keepalived_down {
#如果存在down文件,则返回1(表示keepalived服务失效),否则返回0(表示服务没有失效)
script "[ -e /etc/keepalived/down ] && exit 1 || exit 0"
#检测间隔1秒
interval 1
#如果失效,权重减2
weight -2
}
#为nginx提供高可用
vrrp_script chk_nginx {
#检测nginx是否存在,如果存在返回0,如果不存在返回1
script "killall -0 nginx"
#检测间隔时间
interval 1
#如果失败,权重减2
weight 2
#失败检测次数
fall 2
#成功检测次数
rise 1
}
#定义vrrp实例VI_1(即一个虚拟路由器)
vrrp_instance VI_1 {
#若权重高,则定义此实例为主(主从区别),从为BACKUP
state MASTER
#定义接口(便于从哪个网卡进行宣告,从而进行优先级选举)
interface eth0
#定义vrrp虚拟路由唯一标识,即确定vmac
virtual_router_id 51
#初始权重(主从区别),从需要比此数据小
priority 100
vrrp_script chk_nginx {
#检测nginx是否存在,如果存在返回0,如果不存在返回1
script "killall -0 nginx"
#检测间隔时间
interval 1
#如果失败,权重减2
weight 2
#失败检测次数
fall 2
#成功检测次数
rise 1
}
#定义vrrp实例VI_1(即一个虚拟路由器)
vrrp_instance VI_1 {
#若权重高,则定义此实例为主(主从区别),从为BACKUP
state MASTER
#定义接口(便于从哪个网卡进行宣告,从而进行优先级选举)
interface eth0
#定义vrrp虚拟路由唯一标识,即确定vmac
virtual_router_id 51
#初始权重(主从区别),从需要比此数据小
priority 100
#通告
advert_int 1
#认证机制,防止未知设备,成为节点
authentication {
#认证类型:密码
auth_type PASS
#认证密钥随机字符串
auth_pass 1111
}
#定义vip
virtual_ipaddress {
10.10.10.2
}
#追踪脚本
track_script {
advert_int 1
#认证机制,防止未知设备,成为节点
authentication {
#认证类型:密码
auth_type PASS
#认证密钥随机字符串
auth_pass 1111
}
#定义vip
virtual_ipaddress {
10.10.10.2
}
#追踪脚本
track_script {
chk_keepalived_down
chk_nginx
}
}
#为ipvs提供高可用,需要与vip相同(也可以根据防火墙标识来定义,virtual_server fwmark int)
virtual_server 10.10.10.2 80 {
delay_loop 6
#负载均衡算法,若使用wrr,则real server中的权重不能相同
lb_algo rr
#负载均衡模式
lb_kind DR
chk_nginx
}
}
#为ipvs提供高可用,需要与vip相同(也可以根据防火墙标识来定义,virtual_server fwmark int)
virtual_server 10.10.10.2 80 {
delay_loop 6
#负载均衡算法,若使用wrr,则real server中的权重不能相同
lb_algo rr
#负载均衡模式
lb_kind DR
#vip掩码
net_mask 255.255.255.0
#持久连接
persistence_timeout 50
#负载均衡协议
protocol TCP
#类似于fail_back
sorry_server 192.168.200.200 80
#定义第一个真实服务器
real_server 192.168.200.2 80 {
#权重
weight 1
#real server的状态信息检测,定义http判定,并使用HTTP_GET方法检测(也可以使用SSL_GET/TCP_CHECK检测,其中TCP_CHECK检测,仅仅只需要定义connect_timeout就可以了)
HTTP_GET {
url {
path /
#持久连接
persistence_timeout 50
#负载均衡协议
protocol TCP
#类似于fail_back
sorry_server 192.168.200.200 80
#定义第一个真实服务器
real_server 192.168.200.2 80 {
#权重
weight 1
#real server的状态信息检测,定义http判定,并使用HTTP_GET方法检测(也可以使用SSL_GET/TCP_CHECK检测,其中TCP_CHECK检测,仅仅只需要定义connect_timeout就可以了)
HTTP_GET {
url {
path /
status_code 200
}
#超时时间
connect_timeout 3
connect_timeout 3
#重试次数
nb_get_retry 3
nb_get_retry 3
#重试等待间隔时间
delay_before_retry 3
}
}
#定义第二个真实服务器
real_server 192.168.200.3 80 {
weight 1
HTTP_GET {
url {
path /
delay_before_retry 3
}
}
#定义第二个真实服务器
real_server 192.168.200.3 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
1、如何在状态转换时进行通知?(需要自己写脚本来进行通知)
在/etc/keepalived/keepalived.conf中vrrp_instance上下问中定义通知脚本:
notify_master|backup|fault指切换到master|backup|fault时执行的脚本,使用绝对路径
notify_master "/path/to/master.sh master"
notify_backup "/path/to/backup.sh backup"
notify_backup "/path/to/backup.sh backup"
notify_fault "/path/to/fault.sh fault"
master脚本示例如下-->转换成master时发邮件通知:
#!/bin/bash
#
vip=192.168.1.250
contact='root@localhost'
thisip=`ifconfig eth0 | awk -F : '/inet addr/{print $2}' | awk '{print $1}'`
notify(){
#定义邮件内容
mailbody="vrrp transaction:vrrp changed the keepalived service to $1."
subject="$thisip is to be $1."
echo $mailbody | mail -s "$subject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage:`basename $0` {master|backup|fault}'
exit 1
;;
esac
#
vip=192.168.1.250
contact='root@localhost'
thisip=`ifconfig eth0 | awk -F : '/inet addr/{print $2}' | awk '{print $1}'`
notify(){
#定义邮件内容
mailbody="vrrp transaction:vrrp changed the keepalived service to $1."
subject="$thisip is to be $1."
echo $mailbody | mail -s "$subject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage:`basename $0` {master|backup|fault}'
exit 1
;;
esac
在/etc/keepalived/keepalived.conf中添加virtual_server上下文:
virutal server
realserver
health check
配置格式如下-->
virtual_server vip port {
lb_kind
#定义负载均衡算法(rr,wrr,sh,dh,lblc,lc)负载均衡集群之LVS算法和模型
lb_algo
real_server rip port {
weight
notify_up "up.sh"
notify_down "down.sh"
}
}
配置示例-->
virtual_server 10.10.10.2 80 {
delay_loop 6
#负载均衡算法
lb_algo rr
#负载均衡模式
lb_kind DR
#持久连接
persistence_timeout 50
#负载均衡协议
protocol TCP
#类似于fail_back
sorry_server 192.168.200.200 80
#定义第一个真实服务器
real_server 192.168.200.2 80 {
#权重
weight 1
#定义http判定,并使用get方法
HTTP_GET {
url {
path /
status_code 200
}
delay_loop 6
#负载均衡算法
lb_algo rr
#负载均衡模式
lb_kind DR
#持久连接
persistence_timeout 50
#负载均衡协议
protocol TCP
#类似于fail_back
sorry_server 192.168.200.200 80
#定义第一个真实服务器
real_server 192.168.200.2 80 {
#权重
weight 1
#定义http判定,并使用get方法
HTTP_GET {
url {
path /
status_code 200
}
#超时时间
connect_timeout 3
connect_timeout 3
#重试次数
nb_get_retry 3
nb_get_retry 3
#重试等待间隔时间
delay_before_retry 3
}
}
#定义第二个真实服务器
real_server 192.168.200.3 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
delay_before_retry 3
}
}
#定义第二个真实服务器
real_server 192.168.200.3 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
nb_get_retry 3
delay_before_retry 3
}
}
3、如何对某特定服务器做高可用?(这里以nginx为例)
关键点:监控服务和追踪服务,具体查看上面的配置文件
4、如何实现基于多虚拟路由的master/master模型
定义两个vrrp_instance即可,需要注意的是vmac标识不能一样