Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP全名Virtual Route RedundancyProtocol(虚拟路由冗余协议),VRRP出现的目的就是为了解决静态路由单点故障问题,它能够保证当个别节点宕机时,整个网络可以不间断地运行,所以,keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
keepalived主要有两种应用场景,一个是通过配置keepalived结合ipvs做到负载均衡(LVS+Keepalived);另一个是通过自身健康检查、资源接管等功能做高可用(双机热备),实现故障转移,功能近似于Heartbeat。
keepalived是以VRRP协议为实现基础的,VRRP全称Vritual Router Redundancy Protocol,即虚拟路由冗余协议,可以认为是实现路由器高可用的协议。
通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。
如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。
keepalived是模块化设计,不同模块负责不同的功能,主要有三个模块,分别是core、check和VRRP。
此外还有:
keepalived做负载均衡时工作在TCP/IP协议的3/4/5层,做高可用时工作在OSI七层模型的3/4/7层,基本上一样的。
分层 | 功能 | 相关协议 |
---|---|---|
应用层 | 网络服务和最终用户的一个接口 | TFTP,HTTP,SNMP,DNS,FTP,SMTP,TELNET |
表示层 | 数据的表示、安全、压缩 | 无协议 |
会话层 | 会话的建立、管理、中止 | 无协议 |
传输层 | 定义传输数据的协议端口号,以及流程和差错校验 | TCP,UDP |
网络层 | 进行逻辑地址寻址,实现不同网络之间的路径选择 | IP,ICMP,RIP,OSPF,BGP,IGMP |
数据链路层 | 建立逻辑连接、硬件地址寻址、差错校验等功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理层 | 建立、连接、断开物理连接 | ISO2110,IEEE802,IEEE802.2 |
具体工作层数,区别于使用的哪一个网络协议来进行的健康检查:
Layer3:工作在三层时,keepalived会定期向热备组中的服务器发送一个ICMP数据包,来判断某台服务器是否故障,如果没有响应则将这台服务器从热备组移除。
Layer4:工作在四层时,keepalived以TCP端口的状态判断服务器是否故障,比如MySQL的3306端口,如果无法访问则将这台服务器从热备组移除。
Layer7:工作在七层时,keepalived根据用户设定的策略判断服务器上的程序是否正常运行,比如HTTP请求的方式,如果返回错误状态码则将这台服务器从热备组移除。
在Keepalived服务器群之间,只有作为主的服务器不断发送VRRP广播包,告诉备它还活着,此时备不会抢占主,只有当主不可用,既备接受不到主的VRRP广播包,这时候备就会启动相关的服务接管主的任务向外提供服务,以保证服务的正常使用。
keepalived正常启动的时候,共启动3个进程:
一个父进程,负责监控其子进程;一个时VRRP子进程,另外一个是checkers子进程;两个子进程都被系统watchlog看管,Healthcheck子进程检查各自服务器的健康状况。如果healthchecks进程检查到master上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。
LVS官网
LVS中文站点
LVS 是 Linux Virtual Server 的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统,是根据iptables的实现来开发的,所以使用时会和iptables相似。
NAT模式工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程
NAT 模式就是使用 SNAT 和 DNAT 技术完成报的转发,NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,非常节省成本,但是整个系统的性能受到限制。因为执行 NAT 每次需要重写数据包,有一定的延迟,另外,大部分应用有 80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对LVS形成很大压力,容易成为瓶颈
IP TUN当LVS分配请求到不同的 real server,real server 处理请求后直接回应给用户,这样 LVS 仅处理客户机与服务器的一半连接。IP TUN 技术极大地提高了 LVS 的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。real server 可以在任何 LAN 或 WAN 上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。但此模式要求所有服务器必须支持 IP 隧道协议,因此只能在 linux 下使用,在 windows 无法使用。
DR与 IP TUN 类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性,DR 与 IP TUN 相比,没有 IP 封装的开销,但由于采用物理层(修改 MAC地址)技术,所有服务器都必须在同一个局域网
DR和IP TUN区别
DR和IP TUN相比,没有IP封装的开销,但由于采用数据链路层(修改MAV地址)技术,所有服务器都必须在一个物理网段
NAT模式 | IP TUN模式 | DR模式 |
---|---|---|
对服务器要求 | 任何操做系统都支持 | 必须支持IP隧道协议,目前只有Linux支持 |
网络要求 | 局域网 | 局域网或广域网 |
支持的节点数 | 10-20个,据Diretor处理能力而定 | 可以支持100个节点 |
安全性 | 较高,可以隐藏real server | 较差,real server容易暴露 |
IP要求 | 仅需要一个合法IP地址作为VIP | 除VIP外,每个服务器需要拥有合法IP地址可以直接路由至客户端 |
拓展性 | 差 | 优 |
特点 | 地址转换 | 封装IP地址 |
环境说明:
系统版本 | 软件版本 | 节点名称 | 节点IP地址 |
---|---|---|---|
centos7.9 | keepalived-2.2.7、LVS-1.27 | master | 192.168.182.130 |
centos7.9 | keepalived-2.2.7、LVS-1.27 | backup | 192.168.182.131 |
centos7.9 | httpd不同发行版本,httpd版本也不同 | web01 | 192.168.182.132 |
centos7.9 | httpd不同发行版本,httpd版本也不同 | web02 | 192.168.182.133 |
// 安装前的准备工作
[root@master ~]# systemctl disable --now firewalld //关闭防火墙
[root@master ~]# setenforce 0 //关闭selinux
[root@master ~]# head -7 /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled //改为disabled
[root@master opt]# wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz //下载keepalived
[root@master opt]# tar -zxf keepalived-2.2.7.tar.gz -C /usr/local/ //这里我解压到/usr/local 目录下,各位根据自己需求进行解压
[root@master keepalived-2.2.7]# pwd
/usr/local/keepalived-2.2.7
[root@master keepalived-2.2.7]# yum -y install gcc openssl-devel libnl3-devel //解决依赖问题
[root@master ~]# modprobe ip_vs //加载ip_vs模块
[root@master ~]# modprobe ip_vs
[root@master ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@master ~]# vim /etc/sysctl.conf //调整proc响应参数,并关闭linux内核重定向参数,添加下面内容
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
net.ipv4.ip_forward = 1
[root@master ~]# sysctl -p //加载,使其生效
// 编译安装keepalived
[root@master keepalived-2.2.7]# ./configure --prefix=/usr/local/keepalived
[root@master keepalived-2.2.7]# make && make install
// 启动keepalived
[root@master keepalived]# pwd
/usr/local/keepalived/etc/keepalived
[root@master keepalived]# cp keepalived.conf.sample keepalived.conf //因为没有keepalived配置文件,并且没有配置文件keepalived是启动不了的,所以需要我们自己copy一个配置文件
[root@master keepalived]# cp keepalived.conf keepalived.conf-bak //做一个备份,这一步可做可不做
// 完成上面的步骤依旧启动不了,还需要做以下步骤
[root@master keepalived]# mkdir /etc/keepalived/
[root@master keepalived]# ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@master keepalived]# vim keepalived.conf
interface ens33 //找到21行,将eth0改为ens33,这里的网卡名根据自己的网卡名来修改
[root@master keepalived]# systemctl enable --now keepalived //这样就可以启动keepalived了。
// 安装LVS
[root@master keepalived]# yum -y install ipvsadm
// 在第一次启动LVS时可能会出现报错,解决措施如下
[root@master keepalived]# systemctl cat ipvsadm.service
# /usr/lib/systemd/system/ipvsadm.service
[Unit]
Description=Initialise the Linux Virtual Server
After=syslog.target network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" //我们可以看到LVS启动依赖etc下的ipvsadm这个文件,但是这个文件恰恰没有。
ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
ExecStop=/sbin/ipvsadm -C
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
[root@master keepalived]# touch /etc/sysconfig/ipvsadm //创建完成之后百年可重新启动了。
[root@master keepalived]# systemctl enable --now ipvsadm
配置文件分为: 全局配置、VRRP配置、LVS配置
配置文件又包括以下模块
! Configuration File for keepalived
global_defs { //全局定义部分
notification_email { //设置报警邮件地址,可设置多个
[email protected] //接收通知邮件的地址
[email protected]
[email protected]
}
notification_email_from [email protected] //设置发送邮件通知地址
smtp_server 192.168.200.1 //设置 smtp server 地址,可以ip或域名,可选端口号(默认是25)
smtp_connect_timeout 30 //设置连接 smtp server超时时间
router_id LVS_DEVEL //主机标识,用于邮件通知
vrrp_skip_check_adv_addr
vrrp_strict //严格执行VRRP协议规范,此模式不支持节点单播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script //指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root。
enable_script_security //如果路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_instance VI_1 { //VRRP实例部分定义,VI_1自定义的名称
state MASTER // 指定keepalived的角色,必须大写,可选值为MASTER|BACKUP
interface eth0 //网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 // 虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 // 定义优先级,数字越大,优先级越高
advert_int 1 // 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { //设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { //设置虚拟IP地址,可以设置多个
192.168.200.16
192.168.200.17
192.168.200.18
track_script { // 脚本监控状态
chk_nginx_service // 可加权重,但会覆盖声明的脚本权重值chk_nginx_service weight -20
}
notify_master “写脚本的绝对路径” //当前节点成为master时,通知脚本执行此脚本
notify_backup “写脚本的绝对路径” //当前节点成为master时,通知脚本执行此脚本
notify_fault “写脚本绝对路径” //当前节点出现故障时,执行此脚本
}
}
virtual_server 192.168.200.100 443 { // 定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 // 每隔6秒查询realserver状态
lb_algo rr // 后端调试算法(load balancing algorithm)
lb_kind NAT //LVS调度类型NAT/DR/TUN
persistence_timeout 50 // 同一IP的连接60秒内被分配到同一台realserver
protocol TCP // 用TCP协议检查realserver状态
real_server 192.168.201.100 443 {
weight 1 //权重值越大优先级越高,优先级越大lvs就越优先访问
SSL_GET { // keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 3秒无响应为超时
retry 3 //重连次数
delay_before_retry 3 //重连间隔时间
connect_port 80 //健康检查realserver的端口
}
}
}
[root@master ~]# vim /etc/keepalived/keepalived.conf
router_id LVS_01 //修改此行,指定服务器名称,主备服务器名称须不同这里我修改为LVS_01
!vrrp_strict //注释掉此行内容
state MASTER //指定热备状态,主就改为MASTER,备就为BACKUP
interface ens33 //网卡名也要和自己的网卡名匹配
virtual_router_id 51
nopreempt //设置为非抢占模式,就是MASTER挂了之后BACKUP就不会去替代,如果想设置可以加上此行,这里我们不加
virtual_ipaddress { //指定集群的VIP
192.168.182.100
virtual_server 192.168.182.100 80 { //指定虚拟服务器地址(VIP)、端口号,定义虚拟服务器和web服务器
delay_loop 6 //健康检查时间间隔,就是每隔6秒,检查MASTER是否存活
lb_algo rr //指定调度算法,轮询(rr)
protocol TCP //应用服务使用的是tcp协议
persistence_timeout 0 //连接保持时间默认是秒
real_server 192.168.182.132 80 { //第一个web服务器的ip加端口号
weight 1 节点权重
TCP_CHECK {
connect_port 80 //检查目标端口
connect_timeout 3 //添加连接超时
nb_get_retry 3 //添加重试次数
!retry 3
delay_before_retry 3 //添加重试间隔
}
}
real_server 192.168.182.133 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@master ~]# systemctl restart keepalived.service //修改完之后重启keepalived
[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //添加下面两行内容结即可
IPADDR1=192.168.182.100 //VIP地址
NETMASK1=255.255.255.255 //VIP的子网掩码
[root@master ~]# systemctl restart network //重启网卡服务
[root@master ~]# ip a
1: lo: 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: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:95:56:2e brd ff:ff:ff:ff:ff:ff
inet 192.168.182.130/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.182.100/32 scope global ens33 //这里就是我们刚才添加的VIP
[root@master ~]# ipvsadm-save > /etc/sysconfig/ipvsadm //这条命令是用来保存负载分配策略的
[root@master ~]# ipvsadm -C //此命令是用来清空分配策略的
[root@master ~]# ipvsadm -A -t 192.168.182.100:80 -s rr //A表示的是添加虚拟服务器,t是指定VIP和端口号,s是指定算法,rr表示的是轮询算法
[root@master ~]# ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.132:80 -g //a是添加真实服务器地址,r指定RIP以及端口号,RIP也就是后端服务器ip地址,g表示的是DR模式
[root@master ~]# ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.133:80 -g //132和133分别是web01和02
[root@master ~]# ipvsadm -ln //查看节点状态
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.182.100:80 rr
TCP 10.10.10.2:1358 rr persistent 50
-> 192.168.200.200:1358 Masq 1 0 0
backup也就是192.168.182.131的配置和上面的步骤一样,除以下地方不同之外,其他都一样
[root@backup ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
keepalived配置文件中根据你BACKUP进行修改
router_id LVS_02
state BACKUP
priority 90 //优先级要比主上面小
// 关闭防火墙和selinux
[root@web01 ~]# systemctl disable --now firewalld
[root@web01 ~]# setenforce 0
[root@web01 ~]# head -7 /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
[root@web01 ~]# yum -y install httpd
[root@web01 ~]# systemctl enable --now httpd //设置开机自启
[root@web01 ~]# touch /var/www/html/index.html
[root@web01 ~]# vim /var/www/html/index.html
[root@web01 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web01 ~]# sysctl -p
[root@web01 ~]# route add -host 192.168.182.100 dev lo:1
[root@web01 ~]# route -n
web02的操作和上面web01一样
关闭master上的keepalived
[root@master keepalived]# systemctl stop keepalived.service