keepalived之vrrp_script测试

今天就对keepalived进行了自定义脚本的测试。

先是定义一个vrrp_script
脚本名字,指定测试的内容。也可以自定义脚本,设定执行时间。然后在vrrp_instance中调用就可以了。这样一旦出现无法连接VIP就会自动漂移到其它机器上。

今日还顺便测试了下当2个BACKUP的priority相同,master失效的结果,结果发现VIP会同时漂移到这2台机器,而且你用arping的时候会得到2个mca地址,这是非常危险的,所以我们在一个多播组内千万要设置不同的priority.

同时我们在我昨日的blog中老外写的那个监控脚本有关于weight值的设定,这个我自己测试上加了后发现监控就不生效了,我把80口的nginx直接关了也没有实现VIP漂移。关于这个问题以及发信给作者了,现在还在等回复,官方文档找不到,例子中发现weight有-2,-3,-4,2各种不同,实在是不明白。我自己也没看到直接看源码的程度,还是直接问问得了。

vrrp_script chk_http_port {
script "/tcp/127.0.0.1/80" # 连接本机80端口,正常就退出,无法连接就报错
interval 1 # 每秒连接一次
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
smtp_alert

authentication {
auth_type PASS
auth_pass hdtv
}
virtual_ipaddress {
10.1.41.141
}
track_interface {
eth0 #加入网卡部分监控,要实现这个功能也可以不加
}
track_script {
chk_http_port #上面的vrrp_script的名字
}
}

###########################################

Best regards
Timo Seven
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

keepalived.conf之vrrp instance部分解读

keepalived既可以配合lvs使用,也可以单独使用,所以它的配置文件分为如下几个部分:

  1. Global Configuration
  2. Global definitions
  3. Static routes/addresses
  4. Vrrpd Configuration
  5. VRRP synchronization group(s)
  6. VRRP instance(s)
  7. Lvs Configuration
  8. Virtual server group(s)
  9. Virtual server(s)

这次由于主要用到vrrp instance,所以重点对配置文件这个部分进行解读

下面是对这个配置的解释

state MASTER|BACKUP
#如果不指定Master或者BACKUP,那priority最高的就是master

interface eth0
#监听的实际网口

virtual_router_id 51
#组播ID,通过224.0.0.18可以监听到现在已经存在的VRRP ID,最好不要跟现有ID冲突

priority 100
#权重为100,权重数字越大就越高

advert_int 1
#发送组播包的间隔时间,默认为1秒

smtp_alert
#发送邮件报警

authentication {
auth_type PASS
auth_pass hdtv
}
#这个是验证类型为PASS(明文),密码为hdtv。验证类型也可以选择IPSEC,但是官方是不推荐的

virtual_ipaddress {
10.1.41.141
}
#虚拟IP为10.1.41.141

#############下面这些是文档中存在,但是在上面没有用到的#############################

dont_track_primary
#忽略网卡错误

track_interface {
eth0
eth1
}
#监控eth0和eth1这2块网卡的状态

mcast_src_ip
#使用这个地址作为多播包的源IP,而不是使用interface eth0上的IP

lvs_sync_daemon_interface eth1
#绑定eth1作为lvs同步的

garp_master_delay 2
#master和slave漂移时间改为2秒,默认位5秒,怪不得我昨天发现每次都是5秒才转移

virtual_ipaddress {
/ brd dev scope label 192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
#vip可以写成整个网段和某块网卡上的所有IP

virtual_ipaddress_excluded {
/ brd dev scope / brd dev scope ...
}
#排除哪些IP

virtual_routes {
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
}
#当状态切换的时候会增加和删除路由,格式如src [to] / via|gw dev scope tab

nopreempt
#这个参数是用来,当master当掉,slave接替原来的master作为master后,这个时候当master重新起来后,有了这个参数后原来的slave就不会自动再自动切换为slave,而是继续作为master

preempt_delay 300
#接上面那个参数,这个表示,只有在老的master重新正常300秒后,老的master才会切换为master,这个参数范围是0-1000,默认为0

notify_master | notify_backup
| notify_fault | notify |
smtp_alert
#各种报警方式,可以定义具体的内容来达到不同的报警信息。

上面这些是官方的配置文件,下面这些是放狗搜索出来的其它配置,主要是为了做服务状态的检测,不然keepalived只能看网口有没有down掉再进行迁移,那样就要另外写其它的监控脚本来达到当服务挂掉后就把网口down掉。
下面这个是从邮件列表中抄袭而来,但是没有测试过,明日会找时间进行测试。下面这个是在1.1.13版本之后就实现了。

! Configuration File for keepalived
vrrp_script chk_sshd {
script "killall -0 sshd" # cheaper than pidof
interval 2 # check every 2 seconds weight -4 # default prio: -4 if KO }
vrrp_script chk_haproxy {
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds }
vrrp_script chk_http_port {
script "/tcp/127.0.0.1/80" # connects and exits
interval 1 # check every second
weight -2 # default prio: -2 if connect fails
}
vrrp_script chk_https_port {
script "/tcp/127.0.0.1/443"
interval 1
weight -2
}
vrrp_script chk_smtp_port {
script "/tcp/127.0.0.1/25"
interval 1
weight -2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 100
virtual_ipaddress {
192.168.200.18/25
}
track_interface {
eth1 weight 2 # prio = +2 if UP
eth2 weight -2 # prio = -2 if DOWN
eth3 # no weight, fault if down
}
track_script {
chk_sshd # use default weight from the script chk_haproxy weight 2 # +2 if process is present
chk_http_port
chk_https_port
chk_smtp_port
}
}
vrrp_instance VI_2 {
interface eth1
state MASTER
virtual_router_id 52
priority 100
virtual_ipaddress {
192.168.201.18/26
}
track_interface {
eth0 weight 2 # prio = +2 if UP
eth2 weight -2 # prio = -2 if DOWN
eth3 # no weight, fault if down
}
track_script {
chk_haproxy weight 2
chk_http_port
chk_https_port
chk_smtp_port
}
}

###########################################

Best regards
Timo Seven
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

初次使用keepalived

使用keepalived,是因为keepalvied的切换时间非常短,我在Linux用ping进行测试基本4秒左右就可以切换了,这样的时间还是可以接受的。

做LVS最讨厌的就是有太多的机器做LVS的时候会浪费一半的机器。这样其实是非常不合算的。

而heardbeat实在是太麻烦了。keepalived问题就是文档实在不怎么全,最新的完整文档还是2002年的。

在测试环境中我使用了3台机器,其中每台机器都是前端,但是又各自备了其它的其它2个前端。健康检查是通过实际IP进行的,而所有的服务端口都是跑在vip的端口上。vip也可以指定多个。

机器分配如下:

a: 10.1.41.90   vip  10.1.41.141

b: 10.1.41.91  vip   10.1.41.142

c: 10.1.41.92  vip   10.1.41.144

keepalived安装很容易,基本的安装就可以了。

修改keepalived.conf配置文件。下面这个是a机的keepalived.conf文件,其它2台注意修改MASTER和SLAVE,以及priority,priority值越大说明权重越高。

!This is keepalived config file
global_defs {
   notification_email {
        timoqi@sohu-inc.com
   }
   notification_email_from hdtv@sohu-inc.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   lvs_id LVS_DEVEL_1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    smtp_alert

    authentication {
        auth_type PASS
        auth_pass hdtv
    }
    virtual_ipaddress {
        10.1.41.141
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 10
    advert_int 1
    smtp_alert

    authentication {
        auth_type PASS
        auth_pass hdtv
    }
    virtual_ipaddress {
        10.1.41.142
    }
}

vrrp_instance VI_3 {
    state BACKUP
    interface eth0
    virtual_router_id 53
    priority 10
    advert_int 1
    smtp_alert

    authentication {
        auth_type PASS
        auth_pass hdtv
    }
    virtual_ipaddress {
        10.1.41.144
    }
}

然后我们就可以启动keepalived。它的启动方式如下:

/usr/sbin/keepalived -f /etc/keepalived.conf

keepalived的启动方式还有很多选择。

  keepalived --vrrp               -P    Only run with VRRP subsystem.
  keepalived --check              -C    Only run with Health-checker subsystem.
  keepalived --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
  keepalived --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
  keepalived --dont-fork          -n    Dont fork the daemon process.
  keepalived --use-file           -f    Use the specified configuration file.
                                Default is /etc/keepalived/keepalived.conf.
  keepalived --dump-conf          -d    Dump the configuration data.
  keepalived --log-console        -l    Log message to local console.
  keepalived --log-detail         -D    Detailed log messages.
  keepalived --log-facility       -S    0-7 Set syslog facility to LOG_LOCAL[0-7]. (default=LOG_DAEMON)
  keepalived --help               -h    Display this short inlined help screen.
  keepalived --version            -v    Display the version number
  keepalived --pid                -p    pidfile
  keepalived --checkers_pid       -c    checkers pidfile
  keepalived --vrrp_pid           -r    vrrp pidfile

续:明日会继续测试keepalived其它功能,比如对服务进行健康检查等。