【KeepAlived】keepalived 源码安装 + 主从高可用配置
阅读数:
这篇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 | $ cd /app/software/keepalived-2.0.18 |
如果之前的依赖都已经提前安装好了,这里的configure过程不会报错,最后执行
1 | $ make && make install |
就完成了keepalived程序的编译和安装。
配置
程序安装好了,但是因为是源码装,所以还没有办法直接使用systemctl start keepalived
这样的命令。依次执行下面的命令
1 | $ mkdir -p /etc/keepalived |
试试执行systemctl status keepalived
命令,是否已经能看到相关的信息了呢。
主从配置
keepalived程序安装好了,接下就需要进行配置了,假设最终的配置结果如下:
- 假设A,B两台物理机的IP地址分别是
192.168.1.100
和192.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 | ! Configuration File for keepalived |
我们依次来讲解下每个参数的作用
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地址
- state 这行表示当前服务器的默认状态是master还是backup,但是这个master和backup仅仅作用在当主备的两台机器的优先级,也就是下面的
基本上一个最简单的配置文件就以上内容了,我们再来看backup的配置:
1 | ! Configuration File for keepalived |
和master配置不一样的:
- router_id
- state
- priority 注意,一般备机的priority字段肯定是要比主机的要小的,但是他们的差值不能超过weight值,后面我们详细介绍
- unicast_src_ip 和 unicast_peer 主备正好相反
检测脚本
同样我们来看一个最简单的检测脚本
1 | !/bin/bash |
这个脚本的作用就是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上。