Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。本篇文章会介绍keepalived的安装,配置,还有keepalived的一些脚本,keepalived+nginx高可用实现和keepalived双机互为主从的实现。
keepalived环境安装:
centos6.5上默认提供的keepalived版本为1.2.7的版本,但是官网最新的版本已经为1.2.13,所以这里我们源码的方式来安装keepalived。首先去http://www.keepalived.org/software/keepalived-1.2.13.tar.gz下载最新的keepalived。然后直接编译安装的话就可以,如果没有装上默认的开发环境,编译过程中会报一些常见的错误,遇到什么错误,装上对应的环境包即可。当然如果为了方便,可以直接装上centos 6提供的开发包,这样编译过程中就不会出现什么问题。yum groupinstall "Desktop Platform Development" "Development tools" "Server Platform Development"。我的编译安装过程如下:
[root@bogon ~]# tar xf keepalived-1.2.13.tar.gz
[root@bogon ~]# cd keepalived-1.2.13
[root@bogon ~]# ./configure --prefix=/usr/local/keeaplived --sysconfdir=/etc/
[root@bogon ~]# make && make install
[root@bogon ~]# chkconfig --add keepalived
上面装的keepalived在使用service keepalived start的时候会报错,因为我们把keepalived的脚本安装在了/usr/local/keepalived/sbin目录下,而/etc/rc.rd下的keepalived中直接使用的是keepalived脚本。因此可以在PATH中加入/usr/local/keepalived/sbin这个目录或者在keepalived把调用keepalived的地方全部改成/usr/local/keepalived/sbin/keepalived即可。
为了查阅keepalived.conf文件的方便,可以在/etc/man.config文件中加入如下配置:
MANPATH /usr/local/keepalived/share/man
这样以后就可以直接使用man keepalived.conf来方便的查看keepalived的配置文件了
keepalived+ipvs实现httpd的高可用实验环境(centos6.5):
1.keepalived的MASTER节点(192.168.1.134)
2.keepalived的BACKUP节点(192.168.1.136)
3.两台real server的地址分别是(192.168.1.143,192.168.1.170)
4.vip的地址是192.168.1.200
一。首先在两台real server下配置好arp协议,vip地址和路由策略:
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@bogon ~]# ifconfig lo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255
[root@bogon ~]# route add -host 192.168.1.200 dev lo:0
二。在192.168.1.134和192.168.1.136两台节点上装上keepalived和ipvsadm。
并且为MASTER节点的/etc/keepalived/keepalived.conf中提供如下的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #邮件的收信人地址
}
notification_email_from keepalived@localhost #邮件的发信人地址
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1 #两台节点之间同步信息的间隔
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.200
}
}
virtual_server 192.168.1.200 80 {
delay_loop 6 #选举服务投票的延迟时间
lb_algo rr #调度算法
lb_kind DR #LVS的类型
nat_mask 255.255.255.0
# persistence_timeout 50 #持久连接的超时时间
protocol TCP
real_server 192.168.1.143 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3 #连接的超时时间
nb_get_retry 3 #尝试的次数
delay_before_retry 3 #尝试的延迟
}
}
real_server 192.168.1.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
把上面的内容复制到BACKUP节点上,只需要修改state MASTER为state BACKUP和priority 110为priority 100即可。然后启动keepalived服务,观察ipvsadm中是否有对应的列表,如果有,证明我们的keepalived已经配置成功.
keepalived默认支持的检查机制不止HTTP的方式,还有SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK。如果想要插叙具体的用法,直接man keepalived.conf即可
扩展keepalived的功能:
1.在real server中所有的节点都挂了的时候,再次访问的时候将不会得到服务,为了用户的体验友好性,可以在MASTER和SLAVE节点上提供一个错误,当所有的节点都不在的时候,提供一个错误的页面。因此在MASTER和BACKUP两台主机上装上httpd服务,并且提供默认的页面。在此需要在MASTER和BACKUP上修改keepalived.conf配置文件
virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80 #virtual_server的配置地方和上面一样,只是这里需要新增一行
real_server 192.168.1.143 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
通过上述的配置以后,当所有的real server都挂掉的时候,默认MASTER上的httpd服务器将启用,而当有一台real server上线的时候,MASTER上面的http服务器将会下线。
2.默认情况下,keepalived的默认配置邮件服务功能,只会在real server发生宕机或者恢复功能的时候发出邮件。很多时候,更希望看到的是提供keepalived的节点发生故障的时候提供邮件服务。keepalived默认提供了三个参数为notify_master,notify_backup和notify_fault。他们分别表示在节点变为master,节点变为backup和节点不可用时可以执行的脚本。具体的信息可以通过man查看。因此下面的配置是为keepalived的MASTER节点发生转移的时候提供邮件功能:
在/etc/keepalived/下面建立一个新的脚本文件keepalived_message.sh,这个脚本接收2个参数,分别是状态和VIP的地址。当我们调用前面notify_master等脚本的时候就去自动调用这个脚本对应的参数,实现发送邮件的功能。脚本内容如下:
#!/bin/bash
VIP=$2
Usage (){
echo "Usage: `basename $0` {mater|backup} VIP"
}
Send_message (){
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to $1"
echo $content | mail -s "$subject" root@localhost
}
[ $# -lt 2 ] && Usage && exit
case $1 in
master)
Send_message master
;;
backup)
Send_message backup
;;
fault)
Send_message fault
;;
*)
Usage
exit 1
;;
esac
然后在配置文件keepalived.conf中添加如下内容:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
#下面的内容是我们新添加的三行,当keepalived的节点变成对应状态的时候就去执行上面给出的脚本发邮件
notify_master "/etc/keepalived/keepalived_message.sh master 192.168.1.200"
notify_backup "/etc/keepalived/keepalived_message.sh backup 192.168.1.200"
notify_fault "/etc/keepalived/keepalived_message.sh fault 192.168.1.200"
}
把上面新添加的keepalived_message.sh脚本和主配置文件中新添加的三条信息传给另外一台keepalived服务器,然后测试,会发现,对应keepalived的关闭,启动都会有相应的邮件过来了。
3.keepalived还提供了vrrp_script脚本,可以扩展当前的监控,这样我们就可以让keepalived用在nginx和haproxy的高可用上了。vrrp_script的默认语法为:
vrrp_script check_name {
script "" 需要执行的脚本内容或脚本文件存放的位置
interval 2 每隔多少秒做一次检测
weight -2 如果失败了,降低多少权重
fail 2 检测多少次失败,才认为是真的失败
rise 1 检测一次成功,就认为在线了
}
vrrp_script脚本定义在实例之外。
上面只是定义了一个vrrp_script脚本,还需要执行它,执行的话可以通过track_script来执行。track_script需要放在实例中,让实例随时的去执行这个脚本,判断服务的状况。因此如果我们定义的是vrrp_script check_name{xxx},在vrrp_instance中需要相应的添加:
track_script{
check_name
}
下面实现keepalived+nginx的高可用功能脚本,这里的nginx服务器仍然做的是负载均衡服务器,MASTER上的脚本如下:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "killall -0 nginx"
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
track_script {
check_nginx
}
}
在BACKUP节点上只需要把priority 的值换成100,把state的状态换成BACKUP即可.
4.有时候让一台BACKUP长期处于空闲状态容易造成资源浪费,因此可以配置双机互为主从。其主要的思路就是创建2个虚拟路由器,并以两个节点互为主从。我们修改上面顶一个nginx+keepalived的高可用脚本来实现互为主从:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "killall -0 nginx"
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
track_script {
check_nginx
}
}
vrrp_instance VI_2 {
state BACKUP #对于另外一台主的从
interface eth0
virtual_router_id 52 #定义一个新的虚拟路由的时候,不能和原来的虚拟路由ID的值一样
priority 100 #对于另外一台的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.201 #定义在BACKUP上的VIP
}
track_script {
check_nginx
}
}
然后在BACKUP上面互换关系即可。然后再次查看会发现在原来的MASTER上面会绑定192.168.1.200的VIP,原来的BACKUP上面会绑定192.168.1.201的VIP。
keepalived环境安装:
centos6.5上默认提供的keepalived版本为1.2.7的版本,但是官网最新的版本已经为1.2.13,所以这里我们源码的方式来安装keepalived。首先去http://www.keepalived.org/software/keepalived-1.2.13.tar.gz下载最新的keepalived。然后直接编译安装的话就可以,如果没有装上默认的开发环境,编译过程中会报一些常见的错误,遇到什么错误,装上对应的环境包即可。当然如果为了方便,可以直接装上centos 6提供的开发包,这样编译过程中就不会出现什么问题。yum groupinstall "Desktop Platform Development" "Development tools" "Server Platform Development"。我的编译安装过程如下:
[root@bogon ~]# tar xf keepalived-1.2.13.tar.gz
[root@bogon ~]# cd keepalived-1.2.13
[root@bogon ~]# ./configure --prefix=/usr/local/keeaplived --sysconfdir=/etc/
[root@bogon ~]# make && make install
[root@bogon ~]# chkconfig --add keepalived
上面装的keepalived在使用service keepalived start的时候会报错,因为我们把keepalived的脚本安装在了/usr/local/keepalived/sbin目录下,而/etc/rc.rd下的keepalived中直接使用的是keepalived脚本。因此可以在PATH中加入/usr/local/keepalived/sbin这个目录或者在keepalived把调用keepalived的地方全部改成/usr/local/keepalived/sbin/keepalived即可。
为了查阅keepalived.conf文件的方便,可以在/etc/man.config文件中加入如下配置:
MANPATH /usr/local/keepalived/share/man
这样以后就可以直接使用man keepalived.conf来方便的查看keepalived的配置文件了
keepalived+ipvs实现httpd的高可用实验环境(centos6.5):
1.keepalived的MASTER节点(192.168.1.134)
2.keepalived的BACKUP节点(192.168.1.136)
3.两台real server的地址分别是(192.168.1.143,192.168.1.170)
4.vip的地址是192.168.1.200
一。首先在两台real server下配置好arp协议,vip地址和路由策略:
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@bogon ~]# ifconfig lo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255
[root@bogon ~]# route add -host 192.168.1.200 dev lo:0
二。在192.168.1.134和192.168.1.136两台节点上装上keepalived和ipvsadm。
并且为MASTER节点的/etc/keepalived/keepalived.conf中提供如下的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #邮件的收信人地址
}
notification_email_from keepalived@localhost #邮件的发信人地址
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1 #两台节点之间同步信息的间隔
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.200
}
}
virtual_server 192.168.1.200 80 {
delay_loop 6 #选举服务投票的延迟时间
lb_algo rr #调度算法
lb_kind DR #LVS的类型
nat_mask 255.255.255.0
# persistence_timeout 50 #持久连接的超时时间
protocol TCP
real_server 192.168.1.143 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3 #连接的超时时间
nb_get_retry 3 #尝试的次数
delay_before_retry 3 #尝试的延迟
}
}
real_server 192.168.1.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
把上面的内容复制到BACKUP节点上,只需要修改state MASTER为state BACKUP和priority 110为priority 100即可。然后启动keepalived服务,观察ipvsadm中是否有对应的列表,如果有,证明我们的keepalived已经配置成功.
keepalived默认支持的检查机制不止HTTP的方式,还有SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK。如果想要插叙具体的用法,直接man keepalived.conf即可
扩展keepalived的功能:
1.在real server中所有的节点都挂了的时候,再次访问的时候将不会得到服务,为了用户的体验友好性,可以在MASTER和SLAVE节点上提供一个错误,当所有的节点都不在的时候,提供一个错误的页面。因此在MASTER和BACKUP两台主机上装上httpd服务,并且提供默认的页面。在此需要在MASTER和BACKUP上修改keepalived.conf配置文件
virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80 #virtual_server的配置地方和上面一样,只是这里需要新增一行
real_server 192.168.1.143 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
通过上述的配置以后,当所有的real server都挂掉的时候,默认MASTER上的httpd服务器将启用,而当有一台real server上线的时候,MASTER上面的http服务器将会下线。
2.默认情况下,keepalived的默认配置邮件服务功能,只会在real server发生宕机或者恢复功能的时候发出邮件。很多时候,更希望看到的是提供keepalived的节点发生故障的时候提供邮件服务。keepalived默认提供了三个参数为notify_master,notify_backup和notify_fault。他们分别表示在节点变为master,节点变为backup和节点不可用时可以执行的脚本。具体的信息可以通过man查看。因此下面的配置是为keepalived的MASTER节点发生转移的时候提供邮件功能:
在/etc/keepalived/下面建立一个新的脚本文件keepalived_message.sh,这个脚本接收2个参数,分别是状态和VIP的地址。当我们调用前面notify_master等脚本的时候就去自动调用这个脚本对应的参数,实现发送邮件的功能。脚本内容如下:
#!/bin/bash
VIP=$2
Usage (){
echo "Usage: `basename $0` {mater|backup} VIP"
}
Send_message (){
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to $1"
echo $content | mail -s "$subject" root@localhost
}
[ $# -lt 2 ] && Usage && exit
case $1 in
master)
Send_message master
;;
backup)
Send_message backup
;;
fault)
Send_message fault
;;
*)
Usage
exit 1
;;
esac
然后在配置文件keepalived.conf中添加如下内容:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
#下面的内容是我们新添加的三行,当keepalived的节点变成对应状态的时候就去执行上面给出的脚本发邮件
notify_master "/etc/keepalived/keepalived_message.sh master 192.168.1.200"
notify_backup "/etc/keepalived/keepalived_message.sh backup 192.168.1.200"
notify_fault "/etc/keepalived/keepalived_message.sh fault 192.168.1.200"
}
把上面新添加的keepalived_message.sh脚本和主配置文件中新添加的三条信息传给另外一台keepalived服务器,然后测试,会发现,对应keepalived的关闭,启动都会有相应的邮件过来了。
3.keepalived还提供了vrrp_script脚本,可以扩展当前的监控,这样我们就可以让keepalived用在nginx和haproxy的高可用上了。vrrp_script的默认语法为:
vrrp_script check_name {
script "" 需要执行的脚本内容或脚本文件存放的位置
interval 2 每隔多少秒做一次检测
weight -2 如果失败了,降低多少权重
fail 2 检测多少次失败,才认为是真的失败
rise 1 检测一次成功,就认为在线了
}
vrrp_script脚本定义在实例之外。
上面只是定义了一个vrrp_script脚本,还需要执行它,执行的话可以通过track_script来执行。track_script需要放在实例中,让实例随时的去执行这个脚本,判断服务的状况。因此如果我们定义的是vrrp_script check_name{xxx},在vrrp_instance中需要相应的添加:
track_script{
check_name
}
下面实现keepalived+nginx的高可用功能脚本,这里的nginx服务器仍然做的是负载均衡服务器,MASTER上的脚本如下:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "killall -0 nginx"
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
track_script {
check_nginx
}
}
在BACKUP节点上只需要把priority 的值换成100,把state的状态换成BACKUP即可.
4.有时候让一台BACKUP长期处于空闲状态容易造成资源浪费,因此可以配置双机互为主从。其主要的思路就是创建2个虚拟路由器,并以两个节点互为主从。我们修改上面顶一个nginx+keepalived的高可用脚本来实现互为主从:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "killall -0 nginx"
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
track_script {
check_nginx
}
}
vrrp_instance VI_2 {
state BACKUP #对于另外一台主的从
interface eth0
virtual_router_id 52 #定义一个新的虚拟路由的时候,不能和原来的虚拟路由ID的值一样
priority 100 #对于另外一台的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.201 #定义在BACKUP上的VIP
}
track_script {
check_nginx
}
}
然后在BACKUP上面互换关系即可。然后再次查看会发现在原来的MASTER上面会绑定192.168.1.200的VIP,原来的BACKUP上面会绑定192.168.1.201的VIP。