http://blog.jobbole.com/100390/
http://lanlian.blog.51cto.com/6790106/1303195
环境:主库:192.168.6.119
备库:192.168.6.121
vip: 192.168.6.120
1 master与slave端都安装keepalive
-
[root@MYSQL src]# wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
-
[root@MYSQL src]# tar -xf keepalived-1.2.12.tar.gz
-
[root@MYSQL src]# cd keepalived-1.2.12
-
[root@MYSQL src]# yum -y install gcc gcc-c++ gcc-g77 ncurses-devel bison libaio-devel cmake libnl* libpopt* popt-static openssl-devel
-
[root@MYSQL keepalived-1.2.12]# ./configure
-
[root@MYSQL keepalived-1.2.12]# make && make install
-
[root@MYSQL src]#mkdir /etc/keepalived/
-
-
[root@MYSQL src]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
-
[root@MYSQL src]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
-
[root@MYSQL src]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
- [root@MYSQL src]#cp /usr/local/sbin/keepalived /usr/sbin/
2. 配置 keepalived
-
[root@MYSQL keepalived]# vi keepalived.conf
-
! Configuration File for keepalived
-
-
global_defs {
-
notification_email {
-
acassen@firewall.loc
-
failover@firewall.loc
-
sysadmin@firewall.loc
-
}
-
notification_email_from Alexandre.Cassen@firewall.loc
-
smtp_server 192.168.200.1
-
smtp_connect_timeout 30
-
router_id LVS_DEVEL ##配置是为了标识当前节点,两个节点的此项设置可相同,也可不相同
-
}
-
vrrp_script chk_http_port { ---配合脚本使用,比如说检查nginx是否存活,检查mysql是否存活等
script "/usr/local/keepalived/nginx.sh" #在这里添加脚本链接
interval 3 #脚本执行间隔
weight -2 #脚本结果导致的优先级变更 ###如果检测返回值不为真weight -2 表示减2,权重值降低,backup server权重值(99)>现Master(100-2)的,切换
} -
-
vrrp_instance VI_1 {
- state MASTER #指定A节点为主节点 备用节点上设置为BACKUP即可
-
interface eth0
-
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP
-
priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
- ###nopreempt ###这个参数也可以防止切换到从库后,主keepalived恢复后自动切换回主库
-
advert_int 1
-
authentication { #设置验证信息,两个节点必须一致
-
auth_type PASS
-
auth_pass 1111
-
}
-
chk_http_port #添加脚本执行
}
-
virtual_ipaddress {
-
192.168.6.120 =====vip,指定一个或多个vip
-
}
- }
上面的脚本简单的查看http进程是否存在,不存在就退出返回假。
点击(此处)折叠或打开
-
#!/bin/bash
A=`netstat -nputl|grep -i 80 |wc -l`
if [ $A -eq 0 ];then
exit 1;
#/etc/init.d/keepalived stop
fi
- 实验一:
- master与backup ip分别如下
-
[root@node1 keepalived]# ip a
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:7a:c6:9c brd ff:ff:ff:ff:ff:ff
inet 192.168.6.114/24 brd 192.168.6.255 scope global eth0
inet 192.168.6.120/32 scope global eth0
inet6 fe80::a00:27ff:fe7a:c69c/64 scope link
valid_lft forever preferred_lft forever
[root@node2 keepalived]# ip a
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:03:1b:a1 brd ff:ff:ff:ff:ff:ff
inet 192.168.6.115/24 brd 192.168.6.255 scope global eth0
inet6 fe80::a00:27ff:fe03:1ba1/64 scope link
valid_lft forever preferred_lft forever
-
- 关闭主库http
-
[root@node1 keepalived]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
- 主库与从库ip:
-
[root@node1 keepalived]# ip a
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:7a:c6:9c brd ff:ff:ff:ff:ff:ff
inet 192.168.6.114/24 brd 192.168.6.255 scope global eth0
inet6 fe80::a00:27ff:fe7a:c69c/64 scope link
valid_lft forever preferred_lft forever -
[root@node2 keepalived]# ip a
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:03:1b:a1 brd ff:ff:ff:ff:ff:ff
inet 192.168.6.115/24 brd 192.168.6.255 scope global eth0
inet 192.168.6.120/32 scope global eth0 ---vip飘到从库了
inet6 fe80::a00:27ff:fe03:1ba1/64 scope link
valid_lft forever preferred_lft forever
- 恢复主库http
-
[root@node1 keepalived]# /etc/init.d/httpd start
Starting httpd: [ OK ] - 主库与从库ip:
-
[root@node1 keepalived]# ip a
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:7a:c6:9c brd ff:ff:ff:ff:ff:ff
inet 192.168.6.114/24 brd 192.168.6.255 scope global eth0
inet 192.168.6.120/32 scope global eth0 ---vip又飘回主库了
inet6 fe80::a00:27ff:fe7a:c69c/64 scope link
valid_lft forever preferred_lft forever
[root@node2 keepalived]# ip a
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:03:1b:a1 brd ff:ff:ff:ff:ff:ff
inet 192.168.6.115/24 brd 192.168.6.255 scope global eth0
inet6 fe80::a00:27ff:fe03:1ba1/64 scope link
valid_lft forever preferred_lft forever -
nopreempt 参数的作用:静止vip再飘回来(少用,根据情况配置)-
node1 node2 vip漂移过程(关闭主库http,恢复主库http) 原因 无nopreempt 无nopreempt node1》node2》node1 nopreempt 无nopreempt node1》node2》node2(vip不飘了) node1静止vip飘回去 无nopreempt nopreempt 一直在node1上,飘不动 node2静止vip飘过去 nopreempt nopreempt 一直在nide1上,漂不动 node2静止vip飘过去
-
实验二:
-
配置文件为脚本改为:若http服务失效,则kill keepalive进程
-
[root@node1 keepalived]# more keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/keepalived/nginx.sh"
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.6.120
}
}
-
[root@node1 keepalived]# more keepalived.conf
-
-
#!/bin/bash
A=`netstat -nputl|grep -i 80 |wc -l`
if [ $A -eq 0 ];then
#exit 1;
/etc/init.d/keepalived stop
fi
和实验一的效果一样:vip先飘到从库,恢复http后,启动keepalive后又飘回主库,要想不飘回主库,改小权重 -
#!/bin/bash
实验一二的区别:一个是通过权重来控制vip的飘逸。一个直接是控制keepalive进程的存活来控制vip的飘逸
3.如何在状态转换时进行通知?
1.要在状态转换是进行通知,需要定义通知脚本可以在
vrrp_sync_group{
}中定义,也可以在
vrrp_instance{
}中定义
通过man keepalived命令可以查看通知脚本定义的两种方法
第一种
# to MASTER transition
notify_master /path/to_master.sh
# to BACKUP transition
notify_backup /path/to_backup.sh
# FAULT transition
notify_fault "/path/fault.sh VG_1"
第二种
#arguments
# $1 ="GROUP"|"INSTANCE"
# $2 = name of group or instance
# $3 = target state of transition
# ("MASTER"|"BACKUP"|"FAULT")
notify /path/notify.sh
下面用一个脚本notify.sh实现状态转换通知的简单示例:#Author: MageEdu <linuxedu@foxmail.com>
#description: An example of notify script
#
vip=192.168.6.120
contact='root@localhost'
notify(){
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrptransition, `hostname` changed to be $1"
echo $mailbody | mail -s"$mailsubject" $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
chmod +x notify.sh 主从配置文件修改
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/keepalived/nginx.sh"
interval 3
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 99
# nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
notify_master "/usr/local/keepalived/notify.sh master"
notify_backup"/usr/local/keepalived/notify.sh backup"
notify_fault"/usr/local/keepalived/notify.sh fault"
virtual_ipaddress {
192.168.6.120
}
}
测试:
[root@node1 ~]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[root@node1 ~]# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root@localhost.local Thu Jun 30 21:10 16/716 "node1 to be backup:"
[root@node2 keepalived]# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root@localhost.local Thu Jun 30 21:10 16/716 "node2 to be master:"
恢复主库http服务 [root@node1 ~]# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/root": 2 messages 1 new 2 unread
U 1 root@localhost.local Thu Jun 30 21:10 17/726 "node1 to be backup:"
>N 2 root@localhost.local Thu Jun 30 21:12 16/716 "node1 to be master:"
[root@node2 keepalived]# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/root": 2 messages 1 new 2 unread
U 1 root@localhost.local Thu Jun 30 21:10 17/726 "node2 to be master:"
>N 2 root@localhost.local Thu Jun 30 21:12 16/716 "node2 to be backup:"
参考文档
http://kaifly.blog.51cto.com/3209616/1665729 --MySQL主库高可用 -- 双主单活故障自动切换方案
http://www.tuicool.com/articles/nYvuYf ---结合keepalived实现redis群集高可用故障自动切换
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29096438/viewspace-2121347/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29096438/viewspace-2121347/
本文详细介绍Keepalived的安装配置流程及其实验案例,包括如何通过权重和进程控制实现VIP漂移,以及如何配置状态转换通知脚本来监控VIP的变化。
1805

被折叠的 条评论
为什么被折叠?



