keepalived讲解
一、keepalived概述
概述:
keepalived起初为Lvs设计的一款强大的辅助工具,保证LB负载调度器的故障切换以及RS节点的健康状态检查,后续被应用到很多需要容错的场景下,keepalived自身基于VRRP协议–虚拟路由冗余协议,思科公有协议。
二、keepalived设计原理
2.1 为什么keepalived能够实现高可用呢?
- 因为他用到了虚拟路由冗余协议(VRRP)
2.2 keepalived有哪些设计模块?
- core模块 //为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析
- check模块 //负责real server 节点池内的节点的健康检测
- VRRP模块 //在master与backup之间执行心跳检测
2.3 keepalived的热备实现过程
- 将多个主机以软件的方式组成一个热备组,通过共有的虚拟ip(VIP)地址对外提供服务,同一时刻,热备组中只有一台主机在工作,别的主机冗余状态,当当前在线的主机失效时,其他冗余的主机会自动接替虚拟ip地址,继续提供服务,以保证架构的稳定性。
三、VRRP协议
3.1 简介
VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议。
VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。
配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。
VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。
VRRP的工作过程为:
虚拟路由器中的路由器根据优先级选举出Master。Master 路由器通过发送免费ARP 报文,将自己的虚拟MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;
Master 路由器周期性发送VRRP 报文,以公布其配置信息(优先级等)和工作状况;
如果Master 路由器出现故障,虚拟路由器中的Backup 路由器将根据优先级重新选举新的Master;
虚拟路由器状态切换时,Master 路由器由一台设备切换为另外一台设备,新的Master 路由器只是简单地发送一个携带虚拟路由器的MAC 地址和虚拟IP地址信息的免费ARP 报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到Master 路由器已经切换为另外一台设备。
Backup 路由器的优先级高于Master 路由器时,由Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。
3.2 VRRP的几个术语
- 虚拟路由器:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关。
- 虚拟路由器标识 VRID:虚拟路由器的标识。由相同VRID的一组路由器构成一个虚拟路由器。
- Master路由器:虚拟路由器中承担报文转发任务的路由器。
- Backup路由器:Master路由器出现故障时,能够代替Master路由器工作的路由器。
- 虚拟IP地址:虚拟路由器的IP地址。一个虚拟路由器可以拥有一个或多个IP地址。
- 优先级:VRRP根据优先级来确定虚拟路由器中每台路由器的地位。
- 虚拟MAC地址:一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。
四、keepalived架构图
4.1 示图

4.2 各组件说明
| 组件说明 | |
|---|---|
| checkers | 检查后端RS的健康状态,并且也能管理后端RS,该组件使用独立的子进程负责,由父进程管理。 |
| VRRPstack | 基于VRRP协议实现高可用的组件,它能够提供故障转移功能,并且能单独使用,即不对后端做健康检查,运行为一个独立的子进程由父进程管理 |
| System Call | 提供读取自定义脚本的功能 |
| IPVS wrapper | 能够读取配置文件的规则,通过系统调用直接管理ipvs |
| NetlinkReflector | 用于管理和检查VIP地址 |
| Watch Dog | 用于检查Checkers和VRRPstack进程 |
五、Keepalived 实现双机热备
- 案例环境
| 系统类型 | IP地址 | 主机名 | 软件包 |
|---|---|---|---|
| Centos7 | 192.168.2.1 | keep01 | keepalived-1.2.13.tar.gz |
| Centos7 | 192.168.2.2 | keep02 | keepalived-1.2.13.tar.gz |
5.1 两台节点上部署httpd服务
1 | //keep01节点 |
- 访问查看一下


5.2 两台节点上安装keepalived(操作相同)
5.2.1 下载官方的软件包并解压
1 | [root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz |
5.2.2 YUM安装依赖包
1 | //安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源 |
5.2.3 配置、编译、安装
1 | [root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived |


5.2.4 安装后产生的目录
- 安装完成后会在keepalived家目录生成这 bin etc sbin share 这 4 个目录。
- 其中一个是主配置文件(keepalived.conf)在 /usr/local/keepalived/etc/keepalived/ 这个路径下
- 还有一个是启动文件(keepalived)在 /usr/local/keepalived/etc/rc.d/init.d/ 这个路径下

5.2.5 将上面相关的文件拷贝到对应目录下
1 | //创建keepalived主配置文件目录 |
5.2.6 配置文件详解
默认的配置文件中,使用第三方smtp服务器,但这在现实中几乎没有意义(需要验证的原因),我们将其指定为localhost, 将通知信息的发送交给本地sendmail服务处理。查阅说明文档得知route_id配置是为了标识当前节点,我将其设置为NodeA。当然两个节点的此项设置可相同,也可不相同。
Keepalived的配置文件分为3部分:
- 全局定义本分
- VRRPD部分
- virtual_server部分
1 | ! Configuration File for keepalived |
5.3 配置keep01的master主节点
- 修改keepalived.conf配置文件
1 | [root@keep01 ~]# vim /etc/keepalived/keepalived.conf |
- 编写配置文件中指定的check.sh采用脚本
1 | [root@keep01 ~]# vim /etc/keepalived/check.sh |
- 启动主keepalived 并 检查虚拟VIP是否在他这里
1 | [root@keep01 ~]# /etc/init.d/keepalived startStarting keepalived (via systemctl): [ 确定 ][root@keep01 ~]# ip a |grep 192.168.2.100 inet 192.168.2.100/32 scope global ens32 |
5.4 配置keep02上backup从节点
1 | [root@keep02 ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id kp02}vrrp_instance VI_1 { state BACKUP interface ens32 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 123123 } virtual_ipaddress { 192.168.2.100 }}virtual_server 192.168.2.100 80 { delay_loop 3 lb_algo wrr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.2.2 80 { weight 3 notify_down /etc/keepalived/check.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }} |
- 编写配置文件中指定的check.sh采用脚本
1 | [root@keep02 ~]# vim /etc/keepalived/check.sh#!/bin/bash/etc/init.d/keepalived stopIPV4=`ip a|grep ens32|grep inet|awk '{print $2}'|awk -F'/' '{print $1}'`echo "$IPV4 (httpd) is down on $(date +%F-%T)" >>/root/check_httpd.log:wq[root@keep02 ~]# chmod 777 /etc/keepalived/check.sh |
- 启动主keepalived 并 检查虚拟VIP是否在他这里
1 | [root@keep02 ~]# /etc/init.d/keepalived startReloading systemd: [ 确定 ]Starting keepalived (via systemctl): [ 确定 ][root@keep02 ~]# ip a |grep 192.168.2.100#因为他是备的身份,所以只要在主没出现问题的时候,VIP都不会到他这里来 |
- 启动之后会有三个进程

5.5 客户端访问测试双机热备的效果

- 当master的httpd服务down掉后

- 查看keep01的keepalived的状态

- 查看有没有root下有没有生产check_httpd.log日志文件

- 此时再回到keep02从主机上查看VIP是否会自动漂移过来


可以看到,这里已经实现了双机热备的功能~~~
- 将keep01节点的http和keepalived服务重新启动
1 | [root@keep01 ~]# systemctl start httpd |
- 验证虚拟VIP在主keepalived恢复后是否还会飘过来


可以看到,当主keepalived恢复后,VIP会自动再回到他的上面来,下面再来访问一下浏览器

- 上述步骤实现了keepalived在real server节点池中进行了四层健康监测(传输层,基于协议或者端口号),下面展示keepalived如何对节点池中进行七层健康监测(应用层)
1 | [root@keep01 ~]# vim /etc/keepalived/keepalived.conf |
六、脑裂是什么?【重点】
- 脑裂:经常会出现在高可用软件身上,什么是脑裂?也就是主从上都有vip,那是怎么导致
的这种情况?网络波动、抖动导致的。 - 怎么解决这种问题?
- 直接重启keepalived服务【不建议】
- 给中从做一个机制策略,仲裁,给中从写入一个脚本,让他俩定时ping自己的网关,以但一方ping不通的时候,就把这一方的keepalived服务停掉。【建议】
keepalived实战案例
案例(一)
LVS+Keepalived实现高可用负载均衡
架构图如下:

- 环境准备
| 主机名 / 角色 | 操作系统 | IP地址 | 软件包 |
|---|---|---|---|
| keep01 / LB-MASTER | Centos7.4_3.10 X86 | 192.168.1.1 | keepalived-1.2.13.tar.gz |
| keep02 / LB-BACKUP | Centos7.4_3.10 X86 | 192.168.1.2 | keepalived-1.2.13.tar.gz |
| web01 / RS-WEBSERVER | Centos7.4_3.10 X86 | 192.168.1.3 | apache或者nginx |
| web02 / RS-WEBSERVER | Centos7.4_3.10 X86 | 192.168.1.4 | apache或者nginx |
| client01 / 测试 | Centos7.4_3.10 X86 | 192.168.1.5 | curl 或者 wget |
1. 在两台web主机上安装httpd服务
1 | yum -y install httpd |
2. 在两台keep主机上安装keepalived和ipvsadm管理工具(相同配置)
1 | [root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz |
1 | //安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源 |
1 | [root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived |
1 | //创建keepalived主配置文件目录 |
1 | //在LVS集群环境中应用时,也需要用到ipvsadm管理工具 |
3. 配置MASTER调度器(keep01)
1 | [root@keep01 ~]# vim /etc/keepalived/keepalived.conf |
4. 配置BACKUP调度器(keep02)
1 | [root@keep01 ~]# scp /etc/keepalived/keepalived.conf 192.168.2.2:/etc/keepalived/ |

5. 接下来启动lvs 和 keepalived
1 | //启动keep01的lvs和keepalived |
6. 在两台keep节点上查看一下虚拟VIP

- 以上图中可以看到vip地址已经承载到了这块网卡上,接下来启动从服务器查看IP地址

- 以上图中可以看到从服务器上面没有vip地址的,那么就是正常的,因为它是老二,是一个备用服务器,啥时候等主服务器挂了那么它就会自动继承主服务器该做的事情。
7. 在两台keep节点上查看一下LVS集群转发情况


8. 在两台RS上编写realserver.sh脚本
1 | #在两台RS上编写以下脚本文件realserver.sh |
9. 在两台RS上分别执行脚本
1 | [root@web01 ~]# bash /opt/realserver.sh start |


10. 客户端测试负载均衡



11. 查看两台web服务的访问日志


12. 模拟主服务器down掉后是否还能正常访问
1 | [root@keep01 ~]# /etc/init.d/keepalived stop |

13. 验证主服务器恢复之后vip是否还会回来
1 | [root@keep01 ~]# /etc/init.d/keepalived start |
至此,nginx + keepalived高可用负载均衡已经完成~~~
案例(二)
- Nginx+Keepalived实现高可用负载均衡
- 架构图如下:

环境准备
| 主机名 / 角色 | 操作系统 | IP地址 | 软件包 |
|---|---|---|---|
| keep01 / LB-MASTER | Centos7.4_3.10 | 192.168.1.1 | keepalived-1.2.13.tar.gz、nginx-1.12.2.tar.gz |
| keep02 / LB-BACKUP | Centos7.4_3.10 | 192.168.1.2 | keepalived-1.2.13.tar.gz、nginx-1.12.2.tar.gz |
| web01 / RS-WEBSERVER | Centos7.4_3.10 | 192.168.1.3 | jdk-8u181-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz |
| web02 / RS-WEBSERVER | Centos7.4_3.10 | 192.168.1.4 | jdk-8u181-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz |
| client01 / 测试 | Centos7.4_3.10 | 192.168.1.5 | curl 或者 wget |
1. 安装Tomcat
1.1 安装JDK(配置相同)
1 | [root@web01 ~]# tar xf jdk-8u181-linux-x64.tar.gz |
1.2 安装tomcat(配置相同)
1 | #安装tomcat |
1.3 修改两台tomcat的默认页面
1 | //web01 |
1.4 访问两台web服务

2. 安装 keepalived + Nginx
2.1 安装keepalived
1 | [root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz |
1 | //安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源 |
1 | [root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived |
1 | //创建keepalived主配置文件目录 |
2.2 分别配置两台keepalived
2.2.1 主Keepalived配置
1 | [root@keep01 ~]# vi /etc/keepalived/keepalived.conf |
2.2.2 备Keepalived配置
1 | [root@keep02 ~]# vi /etc/keepalived/keepalived.conf |
2.2.3 Nginx状态检查脚本创建(内容相同)
1 | [root@keep01 ~]# vim /etc/keepalived/check_nginx.sh |
2.3 安装Nginx
1 | [root@keep01 ~]# yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel |
2.4 分别配置两台服务器的Nginx(内容相同)
1 | [root@keep01 ~]# vim /usr/local/nginx/conf/nginx.conf |
3. 启动nginx 和 keepalived
1 | nginx -s start/etc/init.d/keepalived start |
- 查看虚拟VIP

4. 模拟主服务器的nginx宕机后VIP自动漂移
1 | [root@keep01 ~]# echo 'error' >> /usr/local/nginx/conf/nginx.conf #注释:这上面必须要先在nginx配置文件中插入一条错误配置,不然就算是你关闭了nginx,他之后也会靠着check_nginx.sh脚本将nginx起来!! |

- 验证是否还能够正常访问


- 可以看到,这里已经实现了双机热备的功能~~~
5. 将主节点的nginx和keepalived恢复
1 | [root@keep01 ~]# sed -i '/^error/d' /usr/local/nginx/conf/nginx.conf #将刚才插入到nginx中的配置给其删掉 |

可以看到,当主keepalived恢复后,VIP会自动再回到他的上面来,下面再来访问一下浏览器

