1.什么是keepalived?
- Keepalived是用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础结构提供负载均衡和高可用性的简单而强大的功能。依赖于提供第4层负载平衡的Linux虚拟服务器(LVS)内核模块。Keepalived实现了一组健康检查器,以根据其运行状态,自适应地维护和管理负载平衡的服务器池(LVS)。Keepalived就是VRRP协议的实现,该协议是虚拟冗余路由协议,VRRP是路由器故障转移的基础。
- VRRP:Virtual Router Redundancy Protocol 虚拟路由器冗余协议
2.作用
-
实现将用户需要访问的地址转移到可用LVS节点实现。
-
监控并管理 LVS 集群系统中各个服务节点的状态
-
对后端应用服务器健康检查的功能
3.keepalived.conf配置文件
加了!!!代表重要,更多配置信息可以参考:keepalived-doc
! Configuration File for keepalived
global_defs {
# 邮件通知信息
notification_email {
# 定义收件人
acassen@firewall.loc
}
router_id LVS_DEVEL # !!!设置lvs的id,在一个网络内应该是唯一的
enable_script_security # !!!允许执行外部脚本
}
# !!!配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
user root
}
# !!!配置对外提供服务的VIP vrrp_instance配置
vrrp_instance VI_1 {
# !!!指定vrrp_instance的状态,是MASTER还是BACKUP主要还是看优先级。
state MASTER
# !!!指定vrrp_instance绑定的网卡,最终通过指定的网卡绑定VIP
interface ens33
# !!!相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
virtual_router_id 51
# !!!本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
priority 100
# !!!心跳间隔检查,默认为1s,MASTER会每隔1秒发送一个报文告知组内其他机器自己还活着。
advert_int 1
# !!!通信认证机制,这里是明文认证还有一种是加密认证
authentication {
auth_type PASS
auth_pass 1111
}
# !!!定义虚拟IP(VIP)为192.168.159.100,可多设,每行一个
virtual_ipaddress {
192.168.159.100
}
# !!!本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
chk_real_server
}
# !!!监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
track_interface {
eth0
ens33
}
# !!!虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
virtual_routes {
192.168.110.0/24 dev eth2
}
# 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
nopreempt|preempt
# 如果是抢占默认则可以设置等多久再抢占,默认5分钟
preempt delay 300
# !!!三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
notify_master ""
notify_backup ""
notify_fault ""
}
# !!!定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.159.100 80 {
# !!!设置健康检查时间,单位是秒
delay_loop 6
# !!!设置负载调度的算法
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
# !!!设置LVS实现负载的机制,有NAT、TUN、DR三个模式
lb_kind NAT
# !!!会话保持时间
persistence_timeout 50
# !!!指定转发协议类型(TCP、UDP)
protocol TCP
# 子网掩码,这个掩码是VIP的掩码
nat_mask 255.255.255.0
# 如果后端应用服务器都不可用,就会定向到那个服务器上
sorry_server 192.168.200.200 1358
# !!!指定real server1的IP地址
real_server 192.168.159.146 80 {
# 配置节点权值,数字越大权重越高
weight 1
# 健康检查方式
TCP_CHECK { # 健康检查方式
connect_timeout 10 # 连接超时
retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
connect_port 80 # 检查时连接的端口
}
# 应用服务器UP或者DOWN,就执行那个脚本
notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
notify_down "/PATH/SCRIPTS.sh 参数"
}
}
real_server的健康检查方法
更多配置信息可以参考:keepalived-doc
# 可以是每种类型的多个 HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|DNS_CHECK|MISC_CHECK|BFD_CHECK|UDP_CHECK|PING_CHECK|FILE_CHECK
4.安装、配置注意事项
- 安装
yum install -y keepalived
#路径
cd /etc/keepalived
- 启动
#启动
service keepalived start
#停止
service keepalived stop
#查看状态
service keepalived status
#重启
service keepalived restart
#停止防火墙
systemctl stop firewalld.service
- 依赖缺少可执行
# 注意: 如果有缺少依赖可以执行下面的命令
yum install -y gcc
yum install -y openssl-devel
yum install -y libnl libnl-devel
yum install -y libnfnetlink-devel
yum install -y net-tools
yum install -y vim wget
- keepalived.conf注意事项
router_id后面跟的自定义的ID在同一个网络下是一致的
state后跟的MASTER和BACKUP必须是大写;否则会造成配置无法生效的问题
interface 网卡ID;要根据自己的实际情况来看,可以使用以下方式查询 ip a 查询
在BACKUP节点上,其keepalived.conf与Master上基本一致,修改state为BACKUP,priority值改小即可
authentication主备之间的认证方式,一般使用PASS即可;主备的配置必须一致,不能超过8位
- ip飘逸失败(故障转移失败)可能的原因
1.禁用SElinux、清除iptables规则、关闭防火墙
2.各个节点时间同步,启用时间同步服务 systemctl start chronyd
3.确保Keepalive使用的网卡开启了多播(MULTICAST)
eth1 Link encap:Ethernet HWaddr 00:50:56:BF:81:53
inet addr:192.168.177.155 Bcast:192.168.177.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:febf:8153/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:373026 errors:0 dropped:28 overruns:0 frame:0
TX packets:2540 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:57778200 (55.1 Mb) TX bytes:152568 (148.9 Kb)