keepalived双机热备

keepalived使用LVS和VRRP协议,可以实现设备故障时自动迁移ip,实现“ip漂移”的效果,实现多台机器之间的相互备份。

下图是keepalived的架构,来自keepalived官网,可以了解keepalived的大致实现方式。

keepalived架构

注意:相互备份的机器必须在同一个广播域

安装keepalived

1.首先在http://www.keepalived.org/download.html下载最新版本

2.解压,configure

tar -xf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure --prefix=/u/services/keepalived

这里指定了prefix,就是安装目录。

如果configure过程中出现问题,往往是一些依赖的软件没有,安装即可,一般有以下这些:

gcc:

yum install gcc gcc-c++

openssl:

yum install openssl-devel openssl

popt-devel,libnl-devel:

yum install popt-devel libnl-devel

内核源码:

yum install kernel-devel kernel
ln -s /usr/src/kernels/内核名称/   /usr/src/linux

这些是centos系统的依赖安装,其他系统也可以用类似的方法。

关注configure执行的最后:

      Keepalived configuration
      -------------------------------------------------
      Keepalived version           :1.2.1
      Compiler                   :gcc
      Compiler flags               :-g -O2-DETHERTYPE_IPV6=0x86dd
      Extra Lib                    :-lpopt -lsssl -lcrypto
      Use IPVS Framework          :Yes
      IPVS sync daemon support      :Yes
      Use VRRP Framework          :Yes
      Use Debug flags               :No

确保其中的Use IPVS Framework和IPVS sync daemon support的选项为Yes,如果不是的话,应该是make的过程中没有找到内核源码,请确保内核源码已安装,另外如果源码已安装,但是configure找不到的话,可以使用configure的选项--with-kernel-dir来制定内核源码目录。

3.make & make install

make
make install

此时应该可以在configure的制定目录(/u/services/keepalived)中看到安装成功的文件。

安装目录

其中,bin是工具目录,etc是配置目录,sbin是主程序目录,share是文档目录。(这种目录安排符合开源软件的习惯)。

如果两台机器是同样的环境,可以直接把安装目录直接拷贝到相同的位置即可完成另外另外一台机器的安装,当然,另外一台机器也需要安装依赖的软件。

也可以把keepalived加入到服务列表和开机自启动中,当然,这个不是必须的:

cp /u/services/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp/u/services/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /u/services/keepalived/sbin/keepalived /usr/bin/
chkconfig --add keepalived

keepalived启动时会自动加载/etc/keepalived/keepalived.conf配置文件,因此也可以把配置文件拷贝到这个位置

mkdir /etc/keepalived/
cp cp /u/services/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

在keepalived启动时,也可以指定配置文件,因此这个操作也不是必须的。

配置keepalived

用来做互备的两台机器的ip分别为192.168.19.60何192.168.19.61,使用192.168.19.60为MASTER,192.168.19.61为BACKUP,使用ip192.168.19.150来做虚拟ip。

修改60机器的/u/services/keepalived/etc/keepalived/keepalived.conf配置文件为(或者/etc/keepalived/keepalived.conf):

global_defs {
   notification_email {
        xxxx@qq.com
   }
   notification_email_from pub@easymobi.cn
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    mcast_src_ip 192.168.19.60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111222
    }
    virtual_ipaddress {
       192.168.19.150/24
    }
}

其中global_defs中除了router_id外都是使用smtp服务器发邮件的设置,在ip做迁移时会发送通知邮件到对应的邮箱,可以先随便填写,不影响其他的功能。router_id填写一个字符串, 它标识当前节点,两个节点的此项设置可相同,也可不相同。

  • vrrp_instance 定义一个vrrp的实例,VI_1为实例名,两台机器一致
  • state:主节点为MASTER,备用节点为BACKUP
  • interface:虚拟ip绑定的网卡
  • virtual_router_id:VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
  • mcast_src_ip: VRRP Multicast广播源地址,分别取主、备机地址,不能取与virtual_ipaddress相同
  • priority: 主节点的优先级(1-254之间),备用节点必须比主节点优先级低
  • advert_int:组播信息发送间隔,两个节点设置必须一样
  • authentication:设置验证信息,两个节点必须一致
  • virtual_ipaddress:制定虚拟ip,带子网掩码

在61机器上修改相同配置文件如下:

global_defs {
   notification_email {
        xxx@qq.com
   }
   notification_email_from pub@easymobi.cn
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 51
    mcast_src_ip 192.168.19.61
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111222
    }
    virtual_ipaddress {
       192.168.19.150/24
    }
}

注意其中的state,virtual_router_id,mcast_src_ip和priority的值和60不一样。

启动keepalived

进入60机器安装目录的sbin目录,该目录下有keepalived程序,使用以下命令启动keepalived:

./keepalived -f /u/services/keeplived/etc/keepalived/keepalived.conf

其中-f选项指定配置文件(如果配置文件为/etc/keepalived/keepalived.conf则不需要该选项,keepalived会自动找该配置)。

使用命令ps auxf | grep keep可以看到keepalived的三个进程:

ps的输出

其中父进程是用来监控子进程的,一个子进程是处理VRRP协议,一个子进程做健康检查。

使用命令ip addr可以看到虚拟ip已经绑定到当前的eth1上:

ip addr输出

使用同样的方法在61上启动keepalived。

测试热备效果

现在两台机器上都部署好了keepalived,现在测试在master上杀掉keepalived进程,虚拟ip会不会自动“漂移”到backup上。

在60机器上执行killall keepalived杀掉master上的keepalived进程,此时在master上使用ip addr查看ip绑定情况:

ip addr输出

虚拟ip已经取消绑定了。此时查看61备机上的ip绑定情况如下:

ip addr输出

虚拟ip已经“漂移”到备机上了!

然后再使用

./keepalived -f /u/services/keeplived/etc/keepalived/keepalived.conf

启动master上的keepalived进程,分别查看master和backup的ip绑定情况,master如下:

ip addr输出

backup的如下:

ip addr输出

这样就实现了master在恢复之后,ip自动“漂移”回master的功能。

总结

keepalived配置和安装相对简单,热备的效果也很有用,在互联网企业中经常用做高可用的方案,使用keepalived可以搭建出nginx和mysql的高可用的集群。

keepalived的缺点也很明显,backup只有在master故障之后才会用到,在硬件资源上有一些浪费。