Keepalived高可用集群应用实践
Keepalived高可用软件
Keepalived介绍
Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如: Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断的运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
Keepalived三个重要功能
- 管理LVS负载均衡
- 对LVS节点做健康检查(基于端口和URL)healthcheck
- VRRP高可用 ★failover
Keepalived高可用故障切换转移原理
- keepalived之间通过VRRP实现高可用的。
- 通过竞选机制实现高可用,或者说是配置优先级,大的是主,小的是备。
Keepalived服务正常工作时,主master节点会不断地向备节点发送(多播的方式)心跳消息用来告诉Backup自己还活着,当主Master节点发生故障就无法发送心跳消息了,备节点就无法检测到来自Master节点的心跳了,备节点进而调用自身接管程序,接管主Master节点的IP资源和服务。而当主Master节点恢复时,备Backup服务全部交给主Master节点。
关于面试问题
VRRP
1)VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2)VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
3)VRRP是用过P多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信的
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
Keepalived
Keepalived高可用对之间是通过VRRP协议进行通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。
准备两个节点
| 配置 | IP | 名称 |
|---|---|---|
| 1h2g | 192.168.218.136 | master |
| 1h2g | 192.168.218.137 | backup |
Nginx的安装
1.下载

2.上传解压
上传到两个服务器上!
tar -xvf nginx-1.20.2.tar.gz #解压到当前文件夹也可
3.准备编译工具
yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
| 工具名称 | 环境介绍 |
|---|---|
| gcc | 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境 |
| PCRE | PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库,nginx 的 http 模块使用 pcre 来解析正则表达式 |
| pcre-devel | pcre-devel 是使用 pcre 开发的一个二次开发库 |
| zlib | zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip |
| OpenSSL | OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http) |
4.编译安装
cd nginx-1.20.2 #进入到文件夹中./configure --with-http_stub_status_module --with-http_ssl_module --with-debug #执行编译脚本make && make install #编译安装
注意:这里执行编译脚本时,没有设置地址,默认地址为/usr/local/nginx
5.配置环境变量
vim /etc/profile #进入配置文件export PATH=/usr/local/nginx/sbin:$PATHsource /etc/profile #刷新配置文件
此时输入nginx就启动了nginx

Keepalived的安装
Keeaplived对版本要求并不是很高,所以这里用yum安装即可。
yum install -y keepalived #安装keepalived
此时两个节点,master和backup都安装了keepalived和nginx
1.配置keepalived
在master节点配置
vim /etc/keepalived/keepalived.conf #进入配置文件#配置文件中有很多用不到的功能,这里只讲和修改用到的! Configuration File for keepalivedglobal_defs {notification_email { #自带的邮件提醒功能1182350036@qq.com #表示发送通知邮件时邮件源地址是谁}notification_email_from test@test.com#表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个smtp_server 127.0.0.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现smtp_connect_timeout 30 #连接smtp连接超时时间router_id a136 #机器标识,在一个网络应该是唯一的#这里还有4个配置,也一并删除}vrrp_script chk_config { #脚本配置script "/usr/local/sbin/check_ng.sh" #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态interval 3 #检查时间间断是3秒}vrrp_instance VI_1 { #VRRP配置标识 VI_1是实例名称state MASTER #定义master相关interface ens33 #通过vrrp协议去通信、去发广播。此为网卡名 ens33和eth33要注意别写错。virtual_router_id 136 #定义路由器ID ,配置的时候和从机器一致priority 100 #权重,主角色和从角色的权重是不同的,一般主比从大advert_int 1 #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒authentication { #认证相关信息auth_type PASS #认证类型auth_pass 1111 #密码的形式是一个字符串}virtual_ipaddress { #虚拟IP192.168.218.100}track_script{ #跟踪执行脚本chk_nginx}}#在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!!#在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!!#在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!!virtual_server 192.168.200.100 443 {delay_loop 6lb_algo rrlb_kind NATpersistence_timeout 50protocol TCPreal_server 192.168.201.100 443 {weight 1SSL_GET {url {path /digest ff20ad2481f97b1754ef3e12ecd3a9cc}url {path /mrtg/digest 9b3a0c85a887a256d6939da88aabd8cd}connect_timeout 3nb_get_retry 3delay_before_retry 3}}}virtual_server 10.10.10.2 1358 {delay_loop 6lb_algo rrlb_kind NATpersistence_timeout 50protocol TCPsorry_server 192.168.200.200 1358real_server 192.168.200.2 1358 {weight 1HTTP_GET {url {path /testurl/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}url {path /testurl2/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}url {path /testurl3/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.200.3 1358 {weight 1HTTP_GET {url {path /testurl/test.jspdigest 640205b7b0fc66c1ea91c463fac6334c}url {path /testurl2/test.jspdigest 640205b7b0fc66c1ea91c463fac6334c}connect_timeout 3nb_get_retry 3delay_before_retry 3}}}virtual_server 10.10.10.3 1358 {delay_loop 3lb_algo rrlb_kind NATpersistence_timeout 50protocol TCPreal_server 192.168.200.4 1358 {weight 1HTTP_GET {url {path /testurl/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}url {path /testurl2/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}url {path /testurl3/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.200.5 1358 {weight 1HTTP_GET {url {path /testurl/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}url {path /testurl2/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}url {path /testurl3/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}connect_timeout 3nb_get_retry 3delay_before_retry 3}}}
backup节点
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id a137}vrrp_script chk_config{script "/usr/local/sbin/check_ng.sh"interval 3}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 136priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.218.100}track_script{chk_config}}
设置脚本,两个节点的脚本皆是如此
[master/backup] vim /usr/local/sbin/check_ng.sh #在两个节点中创建脚本文件,内容如下:d='date --date today +%Y%m%d_%H:%M:S'n='ps -C nginx --no-heading|wc -l'if [ $n -eq "0" ]; then/etc/init.d/nginx startn2='ps -C nginx --no-heading|wc -l'if [ $n -eq "0" ]; thenecho "$d nginx down,keepalived will stop" >> /var/log/check_ng.logsystemctl stop keepalivedfifi
2.重启nginx和keepalived
创建nginx.service配置nginx自启
我们用tar包安装的时候,虽然配置了环境变量,但是依然无法使用systemctl控制nginx的启动,所以创建文件设置自启!
[master/backup]vim /lib/systemed/system/nginx.serivce#写入以下内容[Unit]Description=nginx serviceAfter=network.target[Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginx #这里注意nginx的位置ExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s quitPrivateTmp=true[Install]WantedBy=multi-user.target[master/backup]systemctl enable nginx #设置nginx自启[master/backup]systemctl enable keepalived #设置keepalived自启[master/backup]systemctl restart nginx keepalived #重启两个服务
查看高可用
前面我们给两个节点配置的IP为192.168.218.100,并且网卡中会出现该IP!所以通过192.168.218.100就可以进入主节点的nginx服务器。

此时192.168.218.100进入的是master的136

此时我们把master节点的keepalived关闭,再刷新192.168.218.100。
[master]systemctl stop keepalived
此时访问的就是backup节点的nginx服务器。

除了切换到backup节点,数据再转回到master节点也是同样重要的!我们这里把master节点的keepalived打开!
[master]systemctl start keepalived
此时就转回到master节点了。

LVS高并发集群
LVS就是Linux虚拟服务器,Linxu virtual server,是由章文嵩博士主导开发的负载均衡项目。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器。
轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
原文链接:https://blog.csdn.net/weixin_40470303/article/details/80541639

集群功能分类
LB:Load Balancing,负载均衡,增加处理能力,有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为根本着眼点。
软件负载均衡设备:LVS,NGINX,HAPROXY。便宜,易用,但是对比于硬件设备功能低一些。三个软件技术之间,各有千秋,企业三种软件都会使用。
HA:High Avaliability 高可用集群(增加服务的可用性)。高可用服务器保持服务器始终在线不宕机。
衡量可用性:在线时间/(在线时间+故障处理时间)。
负载均衡
负载均衡有多种实现方式:
- Http重定向
- 搭建HTTP重定向服务器,用户访问到服务器,服务器再响应重定向到web服务器。
- 优点:简单
- 缺点:性能差,需要多次访问,并且还会被SEO判断为作弊。

- DNS负载均衡
- 我们无法实现,必须花钱。在DNS解析时获得负载能力,DNS服务器的算法进行域名分配。
- 优点:将负载均衡交给了DNS,省去了网站管理和负载均衡服务器的麻烦。
- 缺点:目前的DNS解析时多级解析,每一级DNS都可能化缓存记录A,当模拟服务器下线后,DNS记录依然存在,导致分配到该服务器的用户访问失败。
- DNS负载均衡的控制权在服务商手里,网站可能无法做出过多的改善和管理,不能够按照服务器处理能力来分配负载均衡。不能区分服务器之间的差异,不能反映服务器当前运行状态。
- 反向代理负载均衡
- 反向代理处于web服务器这边,反向代理服务器提供负载均衡的功能,同时管理一组web服务器,它根据负载均衡算法将请求的浏览器访问转发到不同的店web服务器处理,处理结果经过反向服务器返回给浏览器。
- 优点:部署简单,处于http协议层面
- IP负载均衡
- IP网络层负载均衡(根据IP进行转发)
- 在网络层和传输层(ip和端口)通过修改目标地址进行负载均衡。用户访问请求到达负载均衡服务器,服务器在操作系统内核进程获取网络数据包,根据算法得到一台真是服务器地址,然后将用户请求的目标地址改成真是服务器地址,数据处理完后返回给负载均衡服务器,服务器收到响应后将自身地址修改成原用户访问地址后再讲数据返回回去。类似于反向服务器负载均衡。
- 优点:速度很快
- 缺点:无法处理比较高级的请求
- 数据链路层负载均衡(根据MAC地址进行转发)
- 在数据链路层修改Mac地址进行负载均衡。负载均衡服务器的IP和它所管理的web服务群的虚拟IP一致;负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址;通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问。
- 优点:不需要负载均衡器进行IP地址转换,也就是进入时会被分配到不同MAC相同IP的服务器,回来时由当前服务器直接返回。
- 缺点:对负载均衡服务器网卡要求较高
- IP网络层负载均衡(根据IP进行转发)
- F5硬件负载均衡
- 前面技术有的,他都有。能根据URL,IP,MAC,DNS都能转发。
- 缺点:贵
四层负载和七层负载
第四层:传输层
第七层:应用层
所谓四层就是基于IP+端口的负载均衡,主要代表有LVS。
七层负载也称内容交换,就是基于URL等应用信息的负载均衡,主要代表有nginx。
LVS概述
LVS工作在一台server上提供Directory(负载均衡器/目录服务器)的功能,本身并不提供服务,只是把特定的请求转发给对应的real server(真正提供服务的主机),从而实现集群环境中的负载均衡。
工作模式
- NAT转发模式
Network Address Translation 网络地址转发模式
工作原理:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标IP地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
④.然后lvs将此报文的源地址修改为本机并发送给客户端。
优点:
网络隔离更安全
节约IP地址
缺点:
随着数据的加大,目录服务器会成为系统性能的瓶颈,容易被卡脖子。
- DR直接路由模式
DR模式和NAT模式的区别,Client还是访问LVS服务器,LVS服务器将流量带到内网web服务器中,但是数据的返回将不再经过LVS服务器,而是直接返回数据到Client。
direct routing 直连路由。
优点:
集群节点和director必须在一个物理网络内。
RIP可以使用公网地址或私有地址。
director仅处理入站请求,服务器压力比较小。
集群节点网关不指向director,故出站不经过director。
不支持端口映射。
大多数操作系统可以作为realserver,要支持隔离arp广播。
- TUN-IP隧道模式
- FULL-NAT
- 模式对比
LVS-Nat实战案例
创建四台机器
| 节点名称 | 作用 | 网卡 | IP |
|---|---|---|---|
| LVS-LVS | LVS服务器 | NAT网卡/仅主机网卡 | 192.168.218.140/192.168.63.101 |
| client | 模拟用户 | 仅主机网卡 | 192.168.63.100 |
| LVS-web1 | 网页服务器① | NAT网卡 | 192.168.138 |
| LVS-web2 | 网页服务器② | NAT网卡 | 192.168.139 |
LVS服务器必须要有两张网卡,一张网卡用来模拟外网(仅主机),一张网卡连接内网(NAT)。LVS服务器的作用就是以仅主机网卡,通信NAT网卡进入内网。所以clinet节点只需要有外网网卡即可(仅主机)。而web服务器只需要内网网卡(NAT)。
web节点配置
两个节点都进行配置
systemctl stop firewalld #关闭防火墙systemctl disable firewalld #关闭防火墙自启setenforce 0 #关闭selinuxsed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinuxyum install vim net-tools httpd -y #安装Apache和一些工具systemctl start httpd #启动httpdsystemctl enable httpd #设置httpd自启
两个web服务器路由配置
route add -net 192.168.63.0/24 gw 192.168.218.140#外网网段 #LVS内网IP作为网关
route add: 添加路由
-net: 设置网络段
gw: 写网关,因为数据要从网关出来
因为我们的数据要从外网进,内网出,如果web服务器接收到了外网的流量请求,数据要从网关返回,我们的网关就是LVS。
也就是LVS把流量从外网口领到了LVS内网网卡,由内网网卡进入到内网服务器,然后服务器统一返回数据到LVS网关(LVS的内网口)。
LVS服务器节点配置
基础配置
systemctl stop firewalld #关闭防火墙systemctl enable firewalld #关闭防火墙自启setenforce 0 #关闭selinuxsed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinuxyum install vim net-tools -y #安装一些工具
路由功能配置
echo 1 > /proc/sys/net/ipv4/ip_forward #启动路由功能#必须启动转发功能
当Linux接收到一个不是自己的包的时候,设备默认是丢弃的,会认为这个包传递错误。而我们现在需要将数据包进行传递,所以这样是行不通的。
但是现在的LVS服务器比较特殊,按照上面的解释就是,Client节点访问LVS服务器,LVS要将数据传递给web服务器,web服务器需要再通过LVS服务器传递给Client节点。
当将ip_forwad内容修改为1的时候,这个LVS服务器就具有路由转发功能了。
安装并配置LVS
yum install ipvsadm -y #安装LVS
暴露对外虚拟服务器(-A),使用TCP协议(-t),暴露的ip为LVS的外网网卡(192.168.63.101),使用策略(-s)为轮巡策略(rr)。
rr轮巡策略:就是无任何条件限制逐个分配服务器。
ipvsadm -A -t 192.168.63.101:80 -s rr
对内暴露真实服务器(-a),使用TCP协议(-t),以对外IP路由连接到真实服务器(-r)中(192.168.218.138/139)。
ipvsadm -a -t 192.168.63.101:80 -r 192.168.218.138:80 -mipvsadm -a -t 192.168.63.101:80 -r 192.168.218.139:80 -m
Client访问LVS服务器公网IP,LVS服务器啥都干不了只能转发流量,然后转发到内网中。
此时使用curl 192.168.63.101 即可查看是否配置成功。

LVS-DR实战案例
四台机器都需要在同一个网段。
| 节点名称 | 作用 | 网卡 | IP |
|---|---|---|---|
| client | 模拟用户 | NAT | 192.168.218.128 |
| web1 | web节点1 | NAT | 192.168.218.138 |
| web2 | web节点2 | NAT | 192.168.218.139 |
| LVS-LVS | LVS服务器 | NAT | 192.168.218.141 |
LVS创建虚拟IP和路由
对外暴露的一个IP,真实服务器也用这个IP。
ifconfig ens33:0 192.168.218.100 broadcast 192.168.218.255 netmask 255.255.255.0 up
使用ifconfig工具,给ens33网卡配置一个子接口,设置IP为192.168.218.100,设置广播地址为192.168.218.255,netmask子网掩码为255.255.255.0,设置为开启。

route add -host 192.168.218.100 dev ens33:0
添加主机路由,只要有人访问该IP,只允许ens33:0子接口进行通讯。
vim /etc/sysctl.conf #进入配置文件,设置路由转发net.ipv4.ip_forward = 1 #开启路由转发net.ipv4.conf.all.send_redirects = 0 #禁止转发重定向报文net.ipv4.conf.ens33.send_redirects = 0 #禁止ens33转发重定向报文net.ipv4.conf.default.send_redirects = 0 #禁止转发默认重定向报文
开启路由转发后,那怕访问的不是该机器,该机器也会帮你把数据传输到指定位置。
LVS设置负载均衡条目/规则
设置IPVSADM
yum install -y ipvsadm #安装LVSipvsadm -C #清除ipvsadm规则ipvsadm -A -t 192.168.218.100:80 -s rr #添加VIP规则ipvsadm -a -t 192.168.218.100:80 -r 192.168.218.138:80 -g#当有人访问100时,我将你的访问转移到真实服务器138中,并且是以DR模式ipvsadm -a -t 192.168.218.100:80 -r 192.168.218.139:80 -gipvsadm-save > /etc/sysconfig/ipvsadm #将配置保存到该文件,即可重启后依然保存配置systemctl enable ipvsadm #设置自启
web集群配置
在两个web服务器做以下操作:
安装apache
yum install -y httpd #安装Apachesystemctl start httpd #启动apachesystemctl disable httpd #设置Apache自启echo wuhu > /var/www/html/index.html #设置index界面
配置虚拟IP
ifconfig lo:0 192.168.218.100/32
lo:loop back 虚拟网卡不做通信,我们要配置假接口下的子接口。
web服务器设置内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore#忽略arp响应,不允许接收echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
两条命令最简单的理解是:有人喊我我听不见,但是发包了我接收并送出去。
此时LVS-DR已经配置完成
curl 192.168.218.100

资源信息查看
tail /var/log/httpd/access_log #查看Apache日志ipvsadm -Lnc #查看本机被访问过的信息ipvsadm -Ln #检查本机配置的规则信息

LVS理论知识
ipvsadm -A -t 192.168.63.100 -s rr #这里给LVS服务器配置轮巡算法
1.RR 轮巡
交替进行循环,也就是逐个分配到服务器中。
2.WRR 加权轮巡
根据服务器处理不同的能力,设置不同的权重,来调度访问请求。这样可以保证处理能力强的服务器可以处理更多的访问流量。
3.LC 最少连接
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
4.WLC 加权最少连接
在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
LVS工作模式模式对比
| VS/NAT | VS/TUN | VS/DR | |
|---|---|---|---|
| 服务器操作系统 | 任意 | 支持隧道 | 多数(支持non-arp) |
| 服务器网络 | 私有网络 | 局域网/广域网 | 局域网 |
| 服务器数目 | 10-20 | 100 | 大于100 |
| 服务器网关 | 负载均衡器 | 自己的路由 | 自己的路由 |
| 效率 | 一般 | 高 | 最高 |
LVS命令解释
| 命令 | 解释 |
|---|---|
| -A | 对外暴露虚拟服务器 |
| -t | 使用TCP协议 |
| -a | 对内暴露真实地址 |
| -r | 真实服务器 |
| -m | 地址伪装,指定LVS的工作模式为NAT模式 |
| -w | 真实服务器权值 |
| -g | 设置为DR模式 |
| -E | 修改虚拟服务器的算法 |
| -D | 删除虚拟服务器 |
| -C | 删除所有LVS配置 |
| -Ln | 检查当前配置的虚拟机和各个RS的权重 |
| -Lnc | 查看当前ipvs模块中记录的连接 |
Keepalived进阶版
高可用衡量标准,MTTF,平均无故障时间。
| 描述 | 通俗叫法 | 可用性级别 | 年度停机时间 |
|---|---|---|---|
| 基本可用性 | 2个9 | 99% | 87.6小时 |
| 较高可用性 | 3个9 | 99.9% | 8.8小时 |
| 具有故障自动修复的可用性 | 4个9 | 99.99% | 53分钟 |
| 极高可用性 | 5个9 | 99.999% | 5分钟 |
自动切换/故障转移
自动切换阶段某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。
通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。
通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等)从该不具备法定票数的集群节点转移到故障转移域(Failover Domain,可以接收故障资源转移的节点)。
自动侦测
自动侦测阶段由主机上的软件通过冗余侦测线,经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。
常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。
脑裂
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为两个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果或者共享资源被瓜分、两边”服务”都起不来了;或者两边”服务”都起来了,但同时读写”共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
常见解决方案:
添加冗余的心跳线(常用):例如双线条线,心跳也HA,尽量减少脑裂发生的几率。
磁盘锁:正在服务一方锁住共享 磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动”解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。一个人用的时候另一个人不能用,大家不能同时用,只能一个人用。
设置仲裁机制:例如设置参考IP(如网关IP或某一个服务器),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续〉应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
脑裂监控报警:邮件手机短信或者值班人员。例如zabbix。
其他高可用方案:heartbeat,pacemaker,piranha。
Keepalived工作原理
将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip) , master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master
Keepalived的三个模块
分别是core、check和vrrp。
core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析check负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。
Keepalived实战案例
创建两个节点
| 节点 | IP | 配置 |
|---|---|---|
| master | 192.168.218.143 | 1h2g |
| backup | 192.168.218.144 | 1h2g |
两个节点做以下操作:
安装keepalived,修改配置文件
systemctl stop firewalld #关闭防火墙systemctl disable firewalld #关闭防火墙自启setenforce 0 #关闭selinuxsed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinuxrpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm #下载nginx rpm包yum install vim keepalived net-tools nginx -y #安装所需要的工具systemctl start nginx.service #启动nginx.servicesystemctl enable nginx.service #设置自启nginx.service
修改配置文件
在master节点:
vim /etc/keepalived/keepalived.conf #进入配置文件#删除配置文件全部信息,将以下内容加入! Configuration File for keepalivedglobal_defs { #全局变量router_id a01 #设备在组中的标识,设置的不一样即可}#vrrp_script chk_nginx { #健康检查# srcipt "/etc/keepalived/ck_ng.sh" #检查脚本# interval 2 #检查频率# weight -5 #priority减少5# fall 3 #失败3次#}vrrp_instance VI_1 { #VI_1 实例两台路由器要相同state MASTER #设置主或者从状态interface ens33 #监控网卡mcast_src_ip 192.168.218.143 #心跳源IPvirtual_router_id 10 #虚拟路由编号,主从要一致priority 100 #优先级advert_int 1 #心跳间隔authentication { #为防止不认识的集群加入设置秘钥认证。auth_type PASSauth_pass 123456}virtual_ipaddress { #虚拟IP192.168.218.110}#track_script { #应用脚本# chk_nginx#}}
backup节点
vim /etc/keepalived/keepalived.conf #进入配置文件#删除配置文件全部信息,将以下内容加入! Configuration File for keepalivedglobal_defs { #全局变量router_id a02 #设备在组中的标识,设置的不一样即可}#vrrp_script chk_nginx { #健康检查# script "/etc/keepalived/ck_ng.sh" #检查脚本# interval 2 #检查频率# weight -5 #priority减少5# fall 3 #失败3次#}vrrp_instance VI_1 { #VI_1 实例两台路由器要相同state MASTER #设置主或者从状态interface ens33 #监控网卡mcast_src_ip 192.168.218.144 #心跳源IPvirtual_router_id 10 #虚拟路由编号,主从要一致priority 99 #优先级advert_int 1 #心跳间隔authentication { #为防止不认识的集群加入设置秘钥认证。auth_type PASSauth_pass 123456}virtual_ipaddress { #虚拟IP192.168.218.110}#track_script { #应用脚本# chk_nginx#}}
systemctl restart keepalived #分别重启keepalived#可以通过关闭网卡/关闭keepalived来进行查看。
Keepalived感知网页服务
虽然在上线我们把网线拔了,但是nginx/apache实际上还在运行。如果nginx出bug导致网页无法运行,此时keepalived还在发心跳包,我们的也就会访问出现bug的nginx。我们不能这样。
现在尴尬的情况,服务器跑的服务出问题,但是keepalived没问题。导致我们依然会访问出问题的网页。我们可以写监控脚本来感知服务。
两个节点做如下操作:
vim /etc/keepalived/ch_ng.sh #编写脚本#!/bin/bash#检查nginx进程是否存在counter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = 0 ]; then#尝试启动一次nginx 停止5秒后再检测service nginx startsleep 5counter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = 0 ]; thenservice keepalived stopfifichmod +x /etc/keepalived/ch_ng.sh #给脚本添加权限systemctl restart /etc/keepalived/ch_ng.sh #重启keepalived
将前面配置文件注释去掉,即可调用脚本文件。
Keepalived+LVS实战案例
上面的案例都是一个LVS加上多个集群,如果LVS出现故障呢?此时我们就需要给LVS配置高可用。
准备节点服务器
| 节点名称 | 作用 | 网卡 | IP |
|---|---|---|---|
| web1 | web节点1 | NAT | 192.168.218.143 |
| web2 | web节点2 | NAT | 192.168.218.144 |
| LVS-master | LVS服务器 | NAT | 192.168.218.145 |
| LVS-backup | LVS服务器 | NAT | 192.168.218.146 |
在两台LVS服务器上操作
systemctl stop firewalld #关闭防火墙systemctl disable firewalld #关闭防火墙自启setenforce 0 #关闭selinuxsed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinuxyum install -y keepalived ipvsadm #安装lvs和keepalived
填写配置文件
lvs-master
!Configuration File for keepalivedglobal_defs {router_id Director1}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_passwd 1111}virtual_ipaddress {192.168.218.111/24 dev ens33}}virtual_server 192.168.218.111 80 { #LVS配置delay_loop 3 #服务轮巡时间间隔,每3秒检查一次real_server状态lb_algo rr #使用rr算法lb_kind DR #设置DR集群模式protocol TCP #TCP 检查real_server 192.168.218.143 80{weight 1TCP_CHECK {connect_timeout 3 #健康检查超时时间}}real_server 192.168.218.144 80weight 1TCP_CHECK {connect_timeout 3}}
重启keepalived
systemctl start keepalivedsystemctl enable keepalivedsystemctl restart keepalived
配置两台web服务器
两台web服务器都做以下配置
yum install -y httpd && systemctl enable httpd && systemctl start httpd #安装http并配置自启
配置虚拟地址
cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0 #复制本地虚拟网卡配置文件vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #进入并修改配置文件DEVICE=lo:0 #网卡接口名称IPADDR=192.168.218.111 #虚拟IPNETMASK=255.255.255.255 #子网掩码ONBOOT=yes #自动启动#没有的删除,不一样的修改systemctl restart network
配置服务器路由
vim /etc/rc.local #进入自启动配置文件,让他每次开机都能自动设置路由/sbin/route add -host 192.168.218.111 dev lo:0vim /etc/sysctl.conf #进入配置文件,设置路由转发net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.lo.arp_ignore = 1 #忽略arp请求net.ipv4.conf.lo.arp_announce = 2 #可以回复请求
此时重启全部机器,检查错误,开启服务。
通过浏览器访问网页,会发现实现了负载均衡。尝试停止一个LVS服务器,依然可以访问网页。

