Contents
  1. 1. 开发环境
  2. 2. 源码安装
    1. 2.1. 下载
    2. 2.2. 安装
    3. 2.3. 配置
  3. 3. 主从配置
    1. 3.1. keepalived配置文件
    2. 3.2. 检测脚本
    3. 3.3. 关于优先级
  4. 4. 引用&致谢

这篇Blog拖了好久,导致我上一次部署keepalived的过程都忘记了。。。而且有一篇讲解配置文件的非常好的文章也不知为何404了,所以这次新下来的机器我再次走了一遍配置流程,然后趁热打铁记录一下从源码安装keepalived程序到配置主从的全过程

开发环境

先记录下我的系统及应用环境:

  • Redhat(CentOS) 7.6
  • keepalived 2.0.18
  • 一些必要的依赖 gcc, openssl, openssl-devel, libnl, libnl-devel

可以使用rpm -q gcc openssl openssl-devel libnl libnl-devel来验证是否相关依赖已经安装完成。如果未安装,可以使用rhel或者centOS的iso安装光盘做为yum本地源来安装。
关于yum本地源的使用,可以参见这篇RedHat上静默安装Oracle 11g及初始化配置全过程文章中的相关内容。

源码安装

下载

可以直接从官网下载源码,然后上传到服务器,官网的下载地址如下:https://www.keepalived.org/download.html

或者如果服务器是通公网环境的,直接用下面的命令完成下载。不过我猜需要用源码安装的,八成都不通公网。

1
$ wget http://www.keepalived.org/software/keepalived-2.0.18.tar.gz

安装

假设下载后的压缩文件放在目录/app/software目录下,
我们执行解压缩命令:

1
$ tar -zxvf /app/software/keepalived-2.0.18.tar.gz

会发现解压缩之后的文件目录是/app/software/keepalived-2.0.18

接下来执行源码的配置

1
2
$ cd /app/software/keepalived-2.0.18
$ ./configure --prefix=/usr/local/keepalived

如果之前的依赖都已经提前安装好了,这里的configure过程不会报错,最后执行

1
$ make && make install

就完成了keepalived程序的编译和安装。

配置

程序安装好了,但是因为是源码装,所以还没有办法直接使用systemctl start keepalived这样的命令。依次执行下面的命令

1
2
3
$ mkdir -p /etc/keepalived
$ cp /app/software/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
$ cp /app/software/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

试试执行systemctl status keepalived命令,是否已经能看到相关的信息了呢。

主从配置

keepalived程序安装好了,接下就需要进行配置了,假设最终的配置结果如下:

  • 假设A,B两台物理机的IP地址分别是192.168.1.100192.168.1.101,我们计划用到的虚拟IP地址是192.168.1.200
  • 假设我们计划把1.100这台机器(主机A)作为主用服务器,1.101这台机器(主机B)作为备用服务器,那么配置好后,直接访问192.168.1.200这个地址,就直接访问到了主机A;
  • 当A上出现异常,keepalived程序会自动配置虚IP,这样1.200这个地址就自动飘到了B这台机器上。
    keepalived可以通过配置来决定当A恢复后,是否把虚IP地址飘回到A上面。

keepalived配置文件

先来看一个最简单的配置文件:

  • 配置文件路径位于/etc/keepalived/keepalived.conf
  • A作为主机,业务正常时虚地址飘在这台机器上,A状态为master;A出问题时,虚地址飘到B上,B状态为master
  • 主机A(master)和主机B(backup)的配置文件基本相同,只有细微的差别。

先来看主机A(master)的配置吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
! Configuration File for keepalived

global_defs {
router_id master
}

vrrp_script check_network {
script "/etc/keepalived/monitor.sh"
interval 2
weight 2
rise 2
fall 2
}

vrrp_instance VI_1 {
state MASTER
interface bond0
virtual_router_id 1
priority 100
advert_int 1
unicast_src_ip 192.168.1.100
unicast_peer {
192.168.1.101
}
authentication {
auth_type PASS
auth_pass yourpassword
}
track_script {
check_network
}
virtual_ipaddress {
192.168.1.200
}
}

我们依次来讲解下每个参数的作用

  • router_id 自定义的编号,master和salve区分开即可

  • vrrp_script check_network部分,这部分是用于检测当前服务状态是否正常的脚本。check_network是这部分的一个别名,可以看到在配置的末尾track_script部分就写上了当前的名称。

    • script “/etc/keepalived/monitor.sh” 这一行是脚本的地址,我们后面再来介绍脚本内容
    • interval 表示脚本检测的时间间隔,单位是秒
    • weight 表示脚本检测结果后权重变化,可以为正值,也可以为负值;正值表示脚本判断结果成功时,在基准的优先级上加上特定的数,脚本执行失败则不处理;负值表示脚本判断结果失败时,在基准优先级上减去特定值,脚本执行成功则不处理。
    • rise 表示脚本判定结果为成功时,需要连续的次数。如上示例,只有连续2次脚本判定结果成功时,才认为成功。
    • fall 和rise相反,如上示例,脚本连续两次判定失败时,才认为失败。
  • vrrp_instance VI_1 部分,这部分就是虚拟IP地址的相关配置了。

    • state 这行表示当前服务器的默认状态是master还是backup,但是这个master和backup仅仅作用在当主备的两台机器的优先级,也就是下面的priority值相同时,才起作用
    • interface 要绑定虚拟IP的网卡,每台服务器可能不一样
    • virtual_router_id 随便设置,但是主备机的配置要保持一致
    • priority 优先级,这个是配置中最重要的参数,判定当前虚地址飘在A还是B就靠这个值,设定中的是一个初始值,根据脚本执行结果进行增加或这减少,最终根据两台机器上的priority字段来判定哪台机器激活master。关于这个值的详细讲解,我们后面再展开。
    • advert_int 主备保持一致即可
    • unicast_src_ip和unicast_peer 当设备所处的网络环境禁止广播时,需要通过这两个参数来人工指定设备的IP地址,一般稳妥起见,我都直接手动配置好
    • authentication 密码自己随便设定即可
    • track_script 就是上一个部分介绍的检测脚本
    • virtual_ipaddress 虚拟IP地址

基本上一个最简单的配置文件就以上内容了,我们再来看backup的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
! Configuration File for keepalived

global_defs {
router_id backup
}

vrrp_script check_network {
script "/etc/keepalived/monitor.sh"
interval 2
weight 2
rise 2
fall 2
}

vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id 1
priority 99
advert_int 1
unicast_src_ip 192.168.1.101
unicast_peer {
192.168.1.100
}
authentication {
auth_type PASS
auth_pass yourpassword
}
track_script {
check_network
}
virtual_ipaddress {
192.168.1.200
}
}

和master配置不一样的:

  • router_id
  • state
  • priority 注意,一般备机的priority字段肯定是要比主机的要小的,但是他们的差值不能超过weight值,后面我们详细介绍
  • unicast_src_ip 和 unicast_peer 主备正好相反

检测脚本

同样我们来看一个最简单的检测脚本

1
2
3
4
5
6
7
8
#!/bin/bash
# check if network is ok
ping -c 1 192.168.1.1 > /dev/null 2>&1
if [ $? -eq 0 ]; then
exit 0
else
exit 1
fi

这个脚本的作用就是ping一个网关的地址,如果可以ping通,就表示脚本检测结果成功(exit 0);否则认为失败。

当然这个是最简单的ping网关方式确定网络是否通常,常见的是检测nginx是否正常来决定是否切换节点。

关于优先级

上面零散地介绍了一些关于主备状态切换时的一些点,这里咱们统一进行一下汇总:

  • priority字段是真正能定义当前设备状态的,priority高的为master,低的为backup
  • 当priority相同时,再根据state字段决定主备机位置
  • weight正值表示脚本执行成功时加上,weight负值表示脚本执行失败时减去
  • 主备机的priority绝对值一定要小于weight值,否则会导致切换失败。

下面我们用一个表格来分析各种情况。
环境就是我们上面的配置,A的优先级是100,B的优先级是99,weight都是2

主机 A,B均正常 A异常,B正常 A正常,B异常 A,B均异常
A priority 100+2=102(master) 100(backup) 100+2=102(master) 100(master)
B priority 99+2=101(backup) 99+2=101(master) 99(backup) 99(backup)

所以这也是为什么weight要大于A和B的优先级绝对值,否则即便A出现的了异常,也无法切换到B上。

引用&致谢

Contents
  1. 1. 开发环境
  2. 2. 源码安装
    1. 2.1. 下载
    2. 2.2. 安装
    3. 2.3. 配置
  3. 3. 主从配置
    1. 3.1. keepalived配置文件
    2. 3.2. 检测脚本
    3. 3.3. 关于优先级
  4. 4. 引用&致谢