Keepalived基本讲解
1 Keepalived
1.1 keepalived简介
keepalived观察其名可知,保持存活,在网络里面就是保持在线,也就是所谓的高可用或热备,是集群管理中轻量级的保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生
说到keepalived就不得不说VRRP协议(目的是解决静态路由出现的单点故障问题),可以说这个协议就是keepalived实现的基础,那么首先我们来看看VRRP协议
1.2 VRRP协议介绍
学过网络的朋友都知道,网络在设计的时候必须考虑到冗余容灾,包括线路冗余,设备冗余等,防止网络存在单点故障,那在路由器或三层交换机处实现冗余就显得尤为重要。
在网络里面有个协议就是来做这事的,这个协议就是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的发生。
VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。对于VRRP,需要清楚知道的是:
VRRP是用来实现路由器冗余的协议VRRP协议是为了消除在静态缺省路由环境下路由器单点故障引起的网络失效而设计的主备模式的协议,使得发生故障而进行设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数VRRP协议需要具有IP备份,优先路由选择,减少不必要的路由器通信等功能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的正整数
1.3 keepalived工作原理
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能;keepalived是以VRRP虚拟路由冗余协议为基础实现高可用的,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发广播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
下图是keepalived的组件图

keepalived也是模块化设计,不同模块不同的功能,它主要有三个模块,分别是core、check和VRRP,其中:
core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;check:负责健康检查,包括常见的各种检查方式;VRRP模块:是来实现VRRP协议的。system call:系统调用watch dog:监控check和vrrp进程的看管者,check负责检测器子进程的健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上libipfwc:iptables(ipchains)库,配置LVS会用到libipvs*:配置LVS会用到
注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已。
keepalived正常启动的时候,共启动3个进程:
一个是父进程,负责监控其子进程;一个是VRRP子进程,另外一个是checkers子进程;
两个子进程都被系统watchdog看管,两个子进程各自负责自己的事。
Healthcheck子进程检查各自服务器的健康状况,,例如http,lvs。如果healthchecks进程检查到master上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。
1.4 Keepalived作用
Keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
1.5 lvs和keepalived的异同
lvs和keepalived的异同:
- 这两个软件的表现形式很相似,都是
一ip对多ip的存在形式 lvs是一个实现负载均衡的软件,keepalived是一个实现高可用(HA)的软件,他们的主要功能是不同的lvs的工作模式:通过ipvsadm软件设置vip,添加rip(多个),数据从vip进来,经过ipvs的调度,分发到具体的rip机器上keepalived的工作模式:通过配置文件(/etc/keepalived/keepalived.conf)设置vip和主从节点(rip),数据从vip进来,到主节点(rip),当主节点挂掉之后,则到从节点(rip),配置文件可以配置lvs,也可以不配置lvs和keepalived组合
lvs和keepalived的组合使用是:他们公用一个vip,keepalived的主从节点就是一个lvs(对lvs做了主从),然后lvs将数据进行转发
1.6 安装keepalived
1.6.1 下载解压
下载:https://www.keepalived.org/download.html
解压 : tar -zxvf keepalived-2.0.18.tar.gz
1.6.2 编译安装
使用configure命令配置安装目录与核心配置文件所在位置:
./configure --prefix=/usr/local/keepalived --sysconf=/etc
prefix:keepalived安装的位置sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错
配置过程中可能会出现警告信息,如下所示:
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
安装libnl/libnl-3依赖
yum -y install libnl libnl-devel
安装keepalived
make && make install
配置文件在/etc/keepalived/keepalived.conf
如果忘记安装配置的目录,则通过如下命令找到:
whereis keepalived
启动keepalived
进入sbin目录
./keepalived
或者
service keepalived start|status|stop|reload
默认日志路径在/var/log/messages
1.6.3 把keepalived注册为系统服务
拷贝配置文件
将安装目录的keepalived目录下etc/init.d/keepalived拷贝到/etc/init.d/下
将安装目录的keepalived目录下etc/sysconfig/keepalived拷贝到/etc/sysconfig/下
刷新systemctl
systemctl daemon-reload
启动、停止、重启keepalived
启动
systemctl start keepalived.service
停止
systemctl stop keepalived.service
重启
systemctl restart keepalived.service
1.6.4 配置keepalived 主机
通过命令vim keepalived.conf打开配置文件
global_defs {
# 路由id:当前安装keepalived的节点主机标识符,保证全局唯一
router_id keep_171
}
vrrp_instance VI_1 { #当前节点所属的虚拟路由的名称
# 表示状态是MASTER主机还是备用机BACKUP
state MASTER
# 该实例绑定的网卡
interface eth0
# 保证主备节点一致即可
virtual_router_id 51
# 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
priority 100
# 主备之间同步检查时间间隔,单位秒
advert_int 2
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟出来的ip,可以有多个(vip)
virtual_ipaddress {
192.168.1.161
}
}
注意:interface需要查看网卡信息命令,如下就是eth0
ip addr
执行结果:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4e:db:c4 brd ff:ff:ff:ff:ff:ff
inet 10.0.4.8/22 brd 10.0.7.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe4e:dbc4/64 scope link
valid_lft forever preferred_lft forever
启动keepalived
查看进程
ps -ef|grep keepalived
1.6.5 实现双机主备高可用

修改备机配置
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
# 备用机设置为BACKUP
state BACKUP
interface eth0
virtual_router_id 51
# 权重低于MASTER
priority 80
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# 注意:主备两台的vip都是一样的,绑定到同一个vip
192.168.1.161
}
}
启动 Keepalived
访问vip即可访问主机,当主机失效时访问vip就会访问到备机
1.6.6 keepalived配置nginx自动重启
(1)编写脚本
在/etc/keepalived/下创建脚本check_nginx_alive_or_not
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
添加运行权限
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh
配置keepalived监听nginx脚本
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔两秒运行上一行脚本
weight 10 # 如果脚本运行失败,则升级权重+10
}
在vrrp_instance中新增监控的脚本
vrrp_instance VI_1 {
...其他配置
...其他配置
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
}
重启Keepalived使得配置文件生效
systemctl restart keepalived
修改nginx.conf配置
把配置的是当前机器IP的server_name,更改一下成虚拟地址ip:
sever{
listen 80;
# 这里从机器的本地IP改为虚拟IP
server_name 虚拟IP;
}
1.6.7 keepalived双主热备
配置DNS轮询
在同一个域名下配置两个ip,自行百度
配置第一台主机
global_defs {
router_id keep_171
}
vrrp_instance VI_1 {
state MASTER i
nterface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
配置第二台主机
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
重启两台Keepalived
systemctl restart keepalived

浙公网安备 33010602011771号