keepalived也是为了支持服务器高可用性而存在的,多和lvs配套使用,但是这种基于共享ip的方式当然可以推广应用到很多方面了。
Version 1.1.20 安装的这个版本。
下载安装就不说了,特别注意参考一下官方的http://www.keepalived.org/documentation.html,Keepalived User Guide
默认会装到/usr/loca/下,建议安装到./configure --prefix=/ 会省很多路径找不到的问题,自定义安装注意一下相关的起动脚本的位置,网上搜来的文档这方面强调的不够,我按照文档一步步搞下来就是没有效果。后来发现是启动脚本中的配置文件没有在默认位置,而keepalived不会相应改变的。
配置文件:
vrrp_script chk_haproxy { # Requires keepalived-1.1.13
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth0
state MASTER # BACKUP
virtual_router_id 51
priority 101 # 101 on master, 100 on backup
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_haproxy
}
}
然后检查状态:sudo /etc/rc.d/init.d/keepalived status
启动:sudo /etc/rc.d/init.d/keepalived start
sudo tail -f /var/log/messages 看log输出
有以下输出就表示ok了,启动master:
Nov 4 18:02:21 dev2 Keepalived: Starting Keepalived v1.1.20 (11/04,2010)
Nov 4 18:02:21 dev2 Keepalived: Starting VRRP child process, pid=7012
Nov 4 18:02:21 dev2 Keepalived_vrrp: Registering Kernel netlink reflector
Nov 4 18:02:21 dev2 Keepalived_vrrp: Registering Kernel netlink command channel
Nov 4 18:02:21 dev2 Keepalived_vrrp: Registering gratutious ARP shared channel
Nov 4 18:02:21 dev2 Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Nov 4 18:02:21 dev2 Keepalived_vrrp: Configuration is using : 63920 Bytes
Nov 4 18:02:21 dev2 Keepalived_vrrp: Using LinkWatch kernel netlink reflector...
Nov 4 18:02:21 dev2 Keepalived_vrrp: VRRP_Script(chk_haproxy) succeeded
Nov 4 18:02:22 dev2 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov 4 18:02:22 dev2 Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert
Nov 4 18:02:22 dev2 Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Nov 4 18:02:23 dev2 Keepalived_vrrp: VRRP_Instance(VI_1) forcing a new MASTER election
Nov 4 18:02:24 dev2 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov 4 18:02:25 dev2 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 4 18:02:25 dev2 avahi-daemon[2799]: Registering new address record for 192.168.1.100 on eth0.
192.168.1.100是要虚拟的ip。
如果不是类似的情况,请检查是否没有加载配置文件。
启动slave,sudo /etc/rc.d/init.d/keepalived start:
Nov 4 18:03:34 tester Keepalived: Starting Keepalived v1.1.20 (11/03,2010)
Nov 4 18:03:34 tester Keepalived_vrrp: Registering Kernel netlink reflector
Nov 4 18:03:34 tester Keepalived_vrrp: Registering Kernel netlink command channel
Nov 4 18:03:34 tester Keepalived_vrrp: Registering gratutious ARP shared channel
Nov 4 18:03:34 tester Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Nov 4 18:03:34 tester Keepalived: Starting VRRP child process, pid=30185
Nov 4 18:03:34 tester Keepalived_vrrp: Configuration is using : 63818 Bytes
Nov 4 18:03:34 tester Keepalived_vrrp: Using LinkWatch kernel netlink reflector...
Nov 4 18:03:34 tester Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Nov 4 18:03:34 tester Keepalived_vrrp: VRRP_Script(chk_haproxy) succeeded
定掉master测试,sudo /etc/rc.d/init.d/keepalived stop:
Nov 4 18:05:22 dev2 Keepalived: Terminating on signal
Nov 4 18:05:22 dev2 Keepalived: Stopping Keepalived v1.1.20 (11/04,2010)
Nov 4 18:05:22 dev2 Keepalived_vrrp: Terminating VRRP child process on signal
Nov 4 18:05:22 dev2 avahi-daemon[2799]: Withdrawing address record for 192.168.1.100 on eth0.
slave上的日志输出:
Nov 4 18:04:33 tester Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 4 18:04:33 tester avahi-daemon[2601]: Registering new address record for 192.168.1.100 on eth0.
表示已经接管ip了。
有一些需要注意的地方:
virtual_router_id 在一个网段内(比如内网,外网)不能重复,否则会报:
Mar 9 07:32:52 keepalivet2 Keepalived_vrrp: VRRP_Instance(VI_1) Dropping received VRRP packet…
Mar 9 07:32:53 keepalivet2 Keepalived_vrrp: ip address associated with VRID not present in received packet : 1992032266
Mar 9 07:32:53 keepalivet2 Keepalived_vrrp: one or more VIP associated with VRID mismatch actual MASTER advert
Mar 9 07:32:53 keepalivet2 Keepalived_vrrp: bogus VRRP packet received on eth0 !!!
关于iptable也是一样,如果开启的话,每台机器都会找不到对方而强制启动成master,这时候会访问到后启动的那台上,关于iptable相关的设置我也尝试了很久,可以用以下抓包监控:
tcpdump -v -i eth0 host 224.0.0.18
tcpdump -vvv -n -i eth0 host 224.0.0.18
看到这个网段内所有进行监听的机器,主要必须是双向的,有去有回才对。
iptable以下规则可以搞定:
# /sbin/iptables -I INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
# /sbin/iptables -A INPUT -p 112 -i eth0 -j ACCEPT
# /sbin/iptables -A OUTPUT -p 112 -o eth0 -j ACCEPT
# /sbin/service iptables save
注意网卡eth0是内网还是外网。然后重启iptables,keepalived。
再检查日志看master和backup是否正确进入各自的状态了。
http://www.cyberciti.biz/faq/linux-unix-verify-keepalived-working-or-not/#comment-50616