实现主备路由自动切换 – keepalived【二】

实现主备路由自动切换 – keepalived【二】

将最近调试的keepalived做个简单的总结,部分配置可能
由于个人理解的关系,有些不同。希望大家能够指正!

Ubuntu 测试时,编译如下:
官网: http://www.keepalived.org/download.html

cd /usr/local/src

wget  http://www.keepalived.org/software/keepalived-1.2.6.tar.gz

tar zxf keepalived-1.2.6.tar.gz 

cd keepalived-1.2.6

./configure --prefix=/usr/local/keepalived 

make

make install

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

mkdir -p /etc/keepalived/
emacs  /etc/keepalived/keepalived.conf

1. 应用场景

网络拓扑图如下:

实现主备路由自动切换 – keepalived【二】_第1张图片

2. 配置文件

1)主路由:
由于我没有用到邮件通知,所以没有配置。

root@R1:/# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
!  notification_email {
!     user@example.com
!   }

!   notification_email_from mail@example.org
!   smtp_server 192.168.200.1
!   smtp_connect_timeout 30
    router_id NodeA
}

# 本来网上说可以增加脚本配置,但是我测试了不起作用。
#vrrp_script check_local {
#    script "/etc/keepalived/check_local.sh"
#    interval 5
#}

vrrp_instance VI_1 {
    state MASTER #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface br-lan #绑定虚拟IP的网络接口
    virtual_router_id 231 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组

    priority 105 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1 #组播信息发送间隔,两个节点设置必须一样
#    nopreempt

    authentication { #设置验证信息,两个节点必须一致
        auth_type PASS #主从服务器验证方式
        auth_pass 123456
    }
    virtual_ipaddress {  #指定虚拟IP, 两个节点设置必须一样
        10.237.46.233 #虚拟IP
    }

# 触发脚本配置,配置未生效,故自己增加了另外的脚本
#    track_script {
#       check_local
#    }
}
root@R1:/# 

2) 备用路由
配置基本和主路由相同。

root@R1:/# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
!  notification_email {
!     user@example.com
!   }

!   notification_email_from mail@example.org
!   smtp_server 192.168.200.1
!   smtp_connect_timeout 30
    router_id NodeA
}

# 本来网上说可以增加脚本配置,但是我测试了不起作用。
#vrrp_script check_local {
#    script "/etc/keepalived/check_local.sh"
#    interval 5
#}

vrrp_instance VI_1 {
    state BACKUP #标示状态为BACKUP
    interface br-lan
    virtual_router_id 232
    priority 51 #MASTER权重要高于BACKUP
    advert_int 1
#    nopreempt

    authentication {
        auth_type PASS #主从服务器验证方式
        auth_pass 123456
    }
    virtual_ipaddress {
        10.237.46.233 #虚拟IP
    }

# 触发脚本配置,配置未生效,故自己增加了另外的脚本
#    track_script {
#       check_local
#    }
}
root@R1:/# 

3) 基本配置参数的说明

  • virtual_router_id
    网上其他的资料要求2个主备路由器配置的id相同(“VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组”),但是配置后测试发现,有一台的keepalived启动失败(使用“ip a show |grep -w inet”命令即可查看)

  • interface
    原来配置此接口时不太理解,参考网上配置,都为成功,但是修改为br-lan后,成功了。个人理解为:按照我的应用场景,应该是向下的网关。

4) 其他参数:

global_defs: 全局配置标识,表面下面的区域{}是全局配置

 - notification_email:
   里面填邮箱地址,如果keepalived在发生诸如切换操作时会的发邮件到配置上的邮箱,邮件地址可以多个,每行一个
 - notification_email_from:表示发送通知邮件时邮件源地址是谁
 - smtp_server:表示发送email时使用的smtp服务器地址,可以填127.0.0.1
 - smtp_connect_timeout:连接smtp超时时间
 - vrrp_instance:各服务器上实例配置域,这里按本服务器的具体情况填值
 - state:本实例启动状态,MASTERSLAVE,不管填MASTERSLAVE,最终还是要看本机器的权重。
 - interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,这里按本机情况而定
 - virtual_router_id:这里设置VRID,如果两台机器是同一个备份组,设置一样
 - priority:设置本节点的优先级,优先级高的为master,不能超过255
 - advert_int:组播信息发送间隔,同一个备份组两个机器设置必须一样,默认是1S
 - authentication:验证域,同组的机器auth_type(验证类型)和auth_pass(验证密码)必须一样
 - virtual_ipaddress:VIP,为master机器设置的虚拟地址,和实例绑定的网卡(interface)设置到一个网段

4) 自定义的配置脚本
刚开始配置完成后,如果主路由故障,可以自动切换到备用路由。但是,主路由恢复后,不能主动切换回主路由。如做了以下简单的脚本。

有些帖子中提到,nopreempt此参数可以起到自动切换的功能,但是我没有测试成功。

还有在配置文件中增加触发脚本,我也没有测试成功。

基于此,以下脚本使用watch -n 2来执行,即2s执行一次。

root@R1:/# cat keepalived_monitor.sh 
#!/bin/sh

IP=114.114.114.114
FAIL_COUNT=0

while [[ $FAIL_COUNT -le 2 ]]; do
  #statements
  ping -c 2 -W 1 $IP > /dev/null 2>&1
  if [ "$?" == "0" ]; then
    echo "Network connect!"
    keepalived_status=`ps |grep keepalived |grep -v grep`
    if [[ $? == "0" ]]; then
      #
      echo "keepalived is running!"
      break
    else
      #
      echo "keepalived is not running, it will be started."
      /etc/init.d/keepalived start
      break
    fi
  else
    echo "Network disconnect!"
    let FAIL_COUNT++
    echo $FAIL_COUNT
    if [[ $FAIL_COUNT == "3" ]]; then
      # stop the keepalived services.
      /etc/init.d/keepalived stop
      break
    fi
  fi
done

root@R1:/#

此次调试总结,到此为止。希望朋友们指正……有好多参数的具体含义也没有完全理解,应该有更加晚上的配置和脚本,希望后期有时间继续研究。

你可能感兴趣的:(keepalived)