1.什么是高可用,为什么要设计高可用? 两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将称之为高可用。
2.系统可用率算法例:
1个9:(1-90%)*365=36.5天 ----> 表示该系统1年时间里最多可能的业务中断时间是36.5天2个9:(1-99%)*365=3.65天 ----> 表示该系统1年时间里最多可能的业务中断时间是36.5天网络可用性
恢复能力
高可用方式 主备:两个角色主机处理同一个业务,使用一套主备配置参数 双主:两个角色主机处理不同的业务,互为主备,简单理解为两个反方向的主备叠加场景。(使用两套主备配置参数) 集群:多个备用结点、多种业务。当主故障后,被动节点通过内部的选举机制,选取临时的主节点来接管vip
关键技术 为了实现高可用的效果,后端的高可用结点需要如下几种技术来保证:
时间同步
作为一个集群,他们彼此间进行信息通信的一个前提是,时间状态必须一致,如果出现一个主机在2018年,一个在2020年,这种情况下,集群的通信肯定会出现问题,甚至不会传输信息。我们一般会采用时间协议,从一个专用的时间服务器上获取时间,从而保证同一个集群中的所有主机时间都是一致的,这个协议我们一般使用ntp协议。心跳检测
对于高可用集群的各模式来说,有一个关键的点就是:主节点故障了,从节点接管一切。这就涉及到了一种场景:高可用集群节点间需要知道彼此的状态,就类似于我们要知道一个人是否是活的,就看他有没有心跳。所以我们需要通过一种专用的技术来时刻了解集群节点间的状态,我们一般称这种技术为“心跳检测”,常见的软件有VRRP。官方网站:http://www.keepalived.org/ github地址:https://github.com/acassen/keepalived 文档:https://www.keepalived.org/pdf/UserGuide.pdf
关键点: Keepalived软件是有c语言编写的一个开源软件项目,其本质是一个路由软件。 Keepalived基于IPVS功能进行二次整合实现负载均衡功能。 Keepalived基于VRRP协议进行二次整合实现高可用性功能。 Keepalived借助于大量的功能脚本实现高质量的状态检查功能。 Keepalived框架可以单独使用,也可以和其他软件进行整合使用。
核心模块: 这两个内核模块却是keepalived实现负载均衡和高可用性功能的核心模块,其中NETLINK主要用于提供高可用性的路由及网络功能,IPVS主要实现虚拟主机的负载均衡功能。
功能组件: Keepalived的大部分功能模块位于用户空间,主要有这么几个比较核心的功能组件: WatchDog、Checkers、VRRP Stack、IEVS wrapper、Netlink Reflector
工作流程
keepalived部署在多台主机上(一般是两台),keepalived服务启动后,会加载专用的配置文件,调用内核的LVS服务(IPVS)以创建虚拟服务器,并根据配置启用对外的统一访问接口,并且基于相关插件脚本对服务进行监控。为了保证服务对外的统一接口的高可用,VRRP协议将物理Router进行统一管理,并创建一个虚拟路由地址,作为外网的统一出口,物理Router内部通过VRRP机制进行内部通信,保证虚拟路由地址永远可用。负载均衡层 位于集群服务的最前端,有一台或多态负载调度器(Director Server)组成,LVS软件就部署在这层的主机上,我们结合内核空间的IPVS模块,使用用户空间的ipvsadm定义各种ipvs规则,来管理后端所有的应用服务主机。 这一层是LVS集群架构中最核心的一层。
应用服务层 位于集群服务的中间层,由一大堆运行应用服务的主机组成,Real Server可以是web服务、mysql服务、DNS服务等服务器中的一个或多个组合,他们通过基础网络被前段的Director Server进行管理。
数据共享层 位于集群服务的最末端,为所有Real Server提供共享存储空间和内容一致性的存储区域,根据业务场景的不同,可以基于NFS或者是分布式文件系统软件来实现。
核心功能【记住】
互联网中常见的负载均衡解决方案有很多:基于DNS域名轮流解析方案、基于客户端调度访问方案、基于IP地址的调度方案、基于应用层系统负载的调度方案等等。LVS结合IPVS内核模块实现为中间层的应用集群服务提供负载均衡的方式也有很多,其中效率最高的就是基于IP方式的负载均衡,它基于Director Server启用IPVS模块,结合ipvsadm来管理中间层的应用服务器,通过LVS服务器上的VIP同一对外提供服务。IPVS实现负载均衡的方法主要有四种,分别是NAT、DR、TUN、Fullnet。其中效率最高的是DR模型、使用最广的是NAT模型,大网络场景下适用TUN模型,更大的网络场景下可以使用Fullnet模型,只不过该模型需要进行二次内核编译才能实现。LVS不但实现了多种的负载均衡模型,而且实现了多种资源调度算法,在最新版的Linux内核中,IPVS模块提供了将近13种资源调度算法,我们可以结合实际的业务应用场景进行合理的调整和选择。这13种调度算法如下:RR、WRR、LC、WLC、FO、OVF、LBLC、LBLCR、DH、SH、MH、SED、NQ借助VRRP可以有效避免单一链路发生故障后网络中断的现象。
虚拟路由冗余协议(Virtua1 Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点故障现象的路由协议,其本质上是一种路由容错协议。
VRRP将局域网内的一组路由器虚拟为单个路由器。我们称该路由器组为VRRP备份组,它根据优先级选择一个Master主路由器,承担网关功能,其他路由器称为Backup从路由器。基于VRRP虚拟出来是路由我们称之为虚拟路由,该虚拟路由有独立的IP地址(VIP)。
整个过程,后端真实主机看到的仅仅是虚拟路由,无论真实路由如何变幻,整个网络不受任何影响。
软件结构 默认安装的keepalived软件结构如下:
rpm -ql keepalived /etc/keepalived # 默认工作目录 /etc/keepalived/keepalived.conf # 默认配置文件 /etc/sysconfig/keepalived # 服务配置文件 /usr/lib/systemd/system/keepalived.service # 服务配置文件 /usr/sbin/keepalived # 软件命令 ... /usr/share/doc/keepalived-1.3.5/samples # 模板文件目录配置结构 keepalived默认配置文件主要有三部分组成:global_defs、vrrp_instance、virtual_server 其中最重要的配置内容是vrrp_instance,在这个配置段中,设置了我们keepalived对外提供的统一入口。
对于keepalived软件的默认配置文件来说,它主要有这么几块组成:
cat /etc/keepalived/keepalived.conf # 全局配置段 global_defs { ... router_id LVS_DEVEL ... } # VRRP配置段 vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } } # 虚拟主机配置段 virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } 一个virtual_server就是一个LVS的VIP的效果例如:
**lb01配置**: cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 #标识信息 } vrrp_instance VI_1 { state MASTER priority 150 #优先级 interface eth0 #绑定的网卡 virtual_router_id 50 #同一个虚拟的路由 advert_int 1 #心跳的间隔时间 authentication { auth_type PASS #两个主机之间的密语 auth_pass 1111 #心跳密码 } virtual_ipaddress { 10.0.0.3 #虚拟IP地址(可以绑定多个虚拟IP地址) } } **lb02配置**: #lb02配置如下 global_defs { router_id lb02 } vrrp_instance VI_1 { state BACKUP priority 100 interface eth0 virtual_router_id 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 #虚拟IP地址 } }配置简介 作为快速入门阶段来说,此时它的配置信息没有那么的复杂,我们这里只需要修改两台keepalived主机的global_defs和vrrp_instance部分的属性内容,就可以让keepalived正常启动了。在这里我们来简单的看一下这里面的基础重要的属性配置:
global_defs 在这部分的配置段中,我们暂时只需要关心router id即可 router_id 设定当前eepalived提供的路由标识,它在keepalived集群中必须唯一
vrrp_instance 在这部分的配置段中,我们选优关心以下几处的配置信息:
必备: state 描述keepalived主机间的角色定位的,一般只有两个值VASTER、BACKUP interface 指定在哪个网卡上绑定VIP virtual_router_id 指定VIP的唯一标识,在keepalived集群中,此配器必须一致。 priority 被VRRP协议来判断那个router_id作为主路由,值越大,优先级越高 authentication 多个路由之间通信的认证 virtual_ipaddress 指定VIP的地址,可以是多个。全局配置段的router_id是唯一标识 cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
启动后ip addr查看
根据配置文件的属性值,VIP设定到了kpmaster主机上了。 默认情况下,keepalived的日志都打印到message,我们也可以使用 tail -f /var/log/messages的命令来查看服务状态。
因为默认在global_defs配置文件中有vrrp_strict,自动在主机上产生一个keepalived拒绝所有的防火墙。这样就没法基于VRRP访问应用。所以想访问192.168.8.100,需要关闭这个属性 或者防火墙上。 vim /etc/keepalived/keepalived.conf 删掉vrrp_strict 后重启
nginx测试访问效果:
for i in {1..10};do curl 192.168.8.100;done主机故障(自动切换) 模拟master主机故障 1、关停kpmaster主机上的keepalived服务 2、查看kpmaster主机日志效果:可以看到该节点移除了VIP内容 3、kpslave结点检查,ip addr,查看日志。 VIP就被kpslave主机接管了 4、master主机恢复,kpmaster又恢复到master状态,VIP被kmaster重新接管
小结
后端服务实现负载均衡的效果。 Keepalived基于IPVS功能进行二次整合实现负载均衡功能。没有ipvsadm也可以。
DR模型,全在同一个网段,要配置相应的VIP和地址冲突的信息。
操作实践
2.1 基础软件
安装软件 yum install nginx -y 配置首页 # lvs-RS1 主机 echo "nginx-RS1" > /usr/share/nginx/html/index.html # lvs-RS2 主机 echo "nginx-RS2" > /usr/share/nginx/html/index.html 启动两台主机nginx服务 systemctl restart nginx 检查服务效果 curl 192.168.8.16 curl 192.168.8.172.2 配置LVS的DR模式(顺便测试,保证后端主机能实现lvs负载均衡效果) 后端主机配置arp抑制(RS1、RS2)
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce启动后端主机VIP(RS1、RS2)
ifconfig lo 192.168.8.100/32 upLVS主机配置虚拟ip(以kpmaster主机为例)
ifconfig eth0:0 192.168.8.100/32 up ip addr add 192.168.8.100 dev eth0:0配置ipvs规则(以kpmaster主机为例)
yum install ipvsadm -y ipvsadm -A -t 192.168.8.100:80 -s rr ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.16 ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.17 ipvsadm -Ln检查效果
curl 192.168.8.100为不影响后续keepalived的操作,需要ipvsadm情况规则清空 (这一部分只是随便测试下) ipvsadm -C
2.3 配置keepalived(高可用+负载均衡) 属性简介: 虚拟主机配置格式:virtual_server <VIP> <port> { .… } delay_loop 用于服务轮询的延迟计时器 lb_algo 设定访问后端服务的调度策略 lb_kind 设定数据转发的模型 protocol 设定数据通信的协议 real_server 设定后端主机的信息
后端主机配置格式:real_server <RIP> <port> { ... } 注意:以上5项是必须设置的。 real_server 后面的 “{ }” 中即使没有属性,也不能写成"{ }",必须使用Enter换行格式隔开
配置样例
virtual_server 192.168.8.100 80 { delay_loop 2 lb_algo rr lb_kind NAT protocol TCP real_server 192.168.8.14 80 { } real_server 192.168.8.15 80 { } } 这一块配置就像 ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.14 -m实际配置:DR
注意:这里采用的后端主机负载均衡模式是DR模型 real_server后面的"{ }" 必须换行写,否则的话会报错
对于LVS主机不能进行访问,因为他是转发的效果。只能去没有192.168.8.100的主机上进行测试。 用客户端进行访问测试 curl 192.168.8.100 可以看到轮询效果
模拟keepalived故障、服务故障
集群基础:
快速入门
记住全局配置的核心属性 记住VRRP配置的核心属性 应用VRRP状态检测功能 应用虚拟主机核心属性 应用http&tcp服务监控检测 应用keepalived日志定制
全局配置段 默认配置 以下内容是keepalived.conf中的全局配置内容样例:
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }配置详解: man keepalived.conf 在默认的全局配置信息中,主要包含两部分的内容:
邮件信息VRRP全局配置邮件信息(在真实环境有相应的监控平台,更好的实现告警,没必要采取这种)
在这部分中,主要涉及到以下四种属性配置: notification_email 用于设定邮件的接收人员列表 notification_email_from 用于设定邮件的发送人员信息 smtp_server 邮件服务器地址 smtp_connect_timeout 设定邮件连接超时时间VRRP全局配置
router_id 设定主机的唯一标识,默认是本地主机名,生产中不推荐 vrrp_skip_check_adv_addr 设定是否跳过检查VRRP所有的通知信息 vrrp_strict 强制执行VRRP协议 vrrp_grap_interval 设定接口发送arp协议信息间的延迟时间,单位ms vrrp_gna_interval 设定接口上发送的未经请求的NA消息之间的延迟时间配置示例: 一般情况下,我们只设置一下本机的邮件配置,然后设置一个router_id就可以了。
global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id master # 唯一的路由标识,不推荐使用主机名,默认的值:主机名 要保证主机名不会改变 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }默认配置
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } }配置详解 vrrp_instance <VRRP实例名称> { ... } 注意:VRRP实例名称是唯一的,我们可以在一个配置文件中配置多个VRRP实例,只要名称不一致就可以了。
常见属性
state:用于设定集群主机的初始化状态 该状态值有两个:MASTER和BACKUP,不过在集群中一旦加入新的主机,keepa1ived会自动比较并选择一个最优的主机定位MASTER角色,所以该配置可以忽略,基于keepalived自动管理,如果我们做好规划的话,最好设置。 interface:用于设定VRRP实例绑定的物理网卡 该接口必须在宿主机上存在,否则的话会报错。 virtual_router_1d:用于设定VRRP实例的唯一标识 一台主机可能设置多个VRRP实例,我们可以基于0~255数字,用于区分同一个网卡上的多个VRRP实例 priority:用于主机间进行MASTER角色选举用的优先级 如果我们要设置某主机为MASTER角色的话,尽量比其他BACKUP角色主机的值大50 advert_int:VRRP协议用于发送通知信息的时间间隔,单位是s,一般采用默认值 authentication 高可用集群间通信的认证,PASS AH 注意:可用可不用。官方已经没用了 负载均衡的访问地址:单网卡效果下,直接用ip即可。 多网卡推荐增加dev和label virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 }需求分析 1.编写检查脚本文件 2.keepalived配置文件使用脚本
检测脚本在vrrp_script定义检测脚本在vrrp_instance中使用 3.效果检查VRRP script配置 根据man keepalived.conf方式来查看VRRP script的配置信息显示,vrrp_script配置是专门用于设定监控VRRP实例用的配置,格式效果如下:
vrrp_script <SCRIPT_NAME> { 重要 script <STRING>|<QUOTED-STRING> # 设定执行脚本的路径,也可以是命令行的检测命令 重要 interval <INTEGER> # 设定脚本执行的间隔时间,默认1s timeout <INTEGER> # 设定脚本失败的超时时间 weight <INTEGER:-254..254> # 设定脚本的权重,默认是0 rise <INTEGER> # 执行多少次,表示成功OK fail <INTEGER> # 执行多少次,表示失败KO user USERNAME [GROUPNAME] # 设定脚本的用户/组属性信息 init_fail # 假设脚本最初处于失败状态 }注意:一般使用前两条。 检测命令的<SCRIPT_NAME>是VRRP专用的,一定要保证在VRRP场景下是唯一的。 script属性要求尽量使用脚本格式,不包含特殊字符和白到时的简单命令也可以,如果命令里包含特殊字符就不能执行。比如 “[[ ]]”
配置示例 定义检测脚本
vrrp_script <SCRIPT_NAME> { script xxx }使用检测脚本
track_script { <SCRIPT_NAME> }★操作实践
❤关键点
顺序:先编写 vrrp_script,再使用 track_scriptvrrp_script 里面的script必须是标准的脚本执行方式track_script 一定要写到指定的vrrp_instance中关于vrrp_script和track_script的内容在所有的keepalived主机上完全一致权重值:weight 工作目的:自动的切换MASTER和BACKUP 工作原理:有priority 和 weight的差值来确定高可用集群主机间的最终优先级。 一般是将weight设置为负值,达到降低优先级的效果
模拟:touch /tmp/keepalived.fail
一个keepalive.conf可以允许出现多个Virtual_server配置信息 多个lvs集群 组成:虚拟主机组 + 虚拟主机
默认配置 IP+端口
virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }常见属性 7种调度算法、3种调度模式、3种数据转发协议
delay_1oop 用于服务轮询的延迟计时器 1b_algo 设定访问后端服务的调度策略 在当前的keepalived版本下,它支持7种调度算法 rr wrr lc wlc lblc sh dh 1b_kind 设定数据转发的模型 因为是基于IPVS进行负载均衡的,所以数据转发的模型与LVS一致 NAT、DR、TUN persistence_timeout 设定数据持久性的超时时间,黑默认为6分钟 protocol 设定数据通信的协议,默认支持三种 TCP UDP SCTP 这一项是必备的,因为我们使用ipvsadm创建集群的时候,必须指定通信协议 sorry_server 备用真实主机,当所有RS失效后,开始启用该后备主机。 real_server 设定后端真实主机的信息真实主机属性 六中状态检测
weight 设定真实主机的权重,黑默认是1 HTTE_GET 以HTTP方式来检查后端主机 ❤ TCP_CHECK 以TCP方式来检查后端主机 ❤ SMTP_CHECK 以SMTP方式来检查后端主机 DNS_CHECK 以DNS方式来检查后端主机 MISC_CHECK 以MISC方式来检查后端主机HTTP检测和TCP检测属性
操作实践
模拟后端服务
测试内容:日志效果、ipvsadm规则效果、curl访问效果
测试内容:日志效果、ipvsadm规则效果、curl访问效果
注意:如果后端RS主机设置了NAT模式,端口映射,那么就需要自己定制,保证TCP检测的端口和ip地址必须准确。
TCP检测属性: connect ip connect port场景需求:当keepalived的所有RS主机出现故障后,提供一个友好页面
1、要准备维护页面,维护web配置 2、配置失效跳转属性,virtual_server配置sorry_server
配置样例
如果不是NAT模式的话,端口必须要一致。 virtual_server 192.168.8.100 80 { sorry_server 192.168.8.17 80 } 注意:要保证失败的主机端口和VIP的端口一致。keepalived默认记录到/var/log/meesages文件中了,在该文件中不仅仅输出了keepalived日志,还输出了其他无关的日志。
需求:将keepalived日志从message中剥离开,单独存放
环境变量文件 rpm -ql keepalived cat /usr/lib/systemd/system/keepalived.service cat /etc/sysconfig/keepalived 得知 和日志相关的属性: -D,-S 日志参数详解:根据注释信息系提示,日志的高级配置参数是“”–log-facility“”,该参数的作用其实是借用syslog的0-7用户自定义功能来定制keepalived服务的日志信息。我们可以基于该参数来定制我们的keepalived日志。
syslog用户自定义格式如下:
grep -A 2 'boot' /etc/rsyslog.conf local7.* /var/log/boot.log # 打开该文件 默认有这个rsyslog中的local0~7其实指的是8个自定义的接口设备,可以存放定制的日志信息,然后进行转储。
❤日志定制实践 设定的keepalived的启动 命令参数,使用用户自定义日志功能,我们这里使用0级别
vim /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="-D -S 0"定制rsyslog的用户自定义日志功能
vim /etc/rsyslog.conf # Save boot message also to boot.log local0.* /var/log/keepalived.log 注意:localn 的值应该与keepalived文件中的-S指定的值一样。重启服务,顺序很重要 systemctl restart rsyslog systemctl restart keepalived
查看日志效果 ls /var/log/ cat /var/log/keepalived.log
记住keepalived的状态检测原理 记住keepalived虚拟服务原理 记住keepalived路由方式及特点
内核空间:ipvs、netlink 核心模块:watchdog、vrrp stack、checker、ipvs wrapper、netlink reflecter
状态检测原理 watchdog —— 监控 vrrp stack —— vrrp相关的功能 checker —— 状态检测、健康检测 ipvs wrapper —— ipvsadm的封装和加强 netlink reflecter —— 网络相关:负载均衡网络、虚拟路由网络
高可用方面 watchdog – vrrp vrrp_script + track_script负载均衡方面 watchdog + checker + ipvs wrapper vrrp_script + track_script real_server 内部的 专用检测工具(HTTP_GET + TCP_CHECK)虚拟服务原理
管理方面 ipvs warpper + IPVS + 配置管理组件 ipvs warpper 通过配置管理组件 加载keepalived.conf文件中的各种属性,然后将virtual_server中的配置转换为ipvsadm相关的规则,借助于内核空间中的IPVS模块实现后端真实主机的负载均衡管理。
转发简介:
用户请求——keepalived —— virtual_server —— real_server转发功能实现: lb_algo 调度方法 rr、wrr、lc、wlc、lblc、sh、dh lb_kind 转发模式 NAT、DR、TUN keepalived默认推荐的转发模式:DRNAT方式: 进入:客户端 —— 外部VIP —— 转换DNAT —— RS 出去:RS —— 内部VIP —— 转换SNAT —— 客户端 配置:需要同时再keepalived.conf当中设置两个vrrp_instance inside_network 和 outside_network
特点:进入和退出都需要经过keepalived集群,所以在大规模场景下,有可能会成为瓶颈,但是在小场景下,使用范围广
DR方式 进入:外部VIP —— RS 出去:RS —— 互联网 —— 客户端 特点:在各种场景下,效率高,不适用端口映射场景
ARP_ignore、ARP_announce
双主方式
需求案例: 业务场景 在实际的工作中,我们的网站服务一般都是以域名的方式对外提供服务,对于这种情况下一般有这么两种现象:
一个域名对应一个ip地址,万一域名解析的ip地址故障,就出现单点故障现象一个域名可以解析不同的后端服务,我们可以基于同域名解析多个不同服务的ip地址,更精确的响应用户也就是说,我们在实现keepalived的高可用时候,需要在同一组高可用集群中,设置多个对外的VIP即多组VRRP实例,任意一组失误,都不影响用户的访问体验。需求分析 1.准备基本网络环境(DR模型) 2.定制keepalived配置(双VIP实例) 3.测试
操作实践 1.准备基本网络环境 网络设备和网卡信息与之前效果一致,我们无需变动
2.定制keepalived配置 后端主机配置多vip
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 192.168.8.100/32 up ifconfig lo:1 192.168.8.200/32 upkeepalived配置 配置多个vrrp示例 vim /etc/keepalived/keepalived.conf
3.查看效果 结果现实: 当kpslave节点keepalived服务未启动时候,两个vrrp实例都在kpmaster主机上 当kpslave节点keepalived服务启动时候,VI_2的实例优先级较kpmaster主机高,所以将8.200的VIP抢过来了 当RS服务停止的时候,会进行移除,ipvsadm -Ln查看 当两个RS服务都停止的时候,会转为sorry_server
总结:
(1)默认配置为抢占式: master挂掉,backup上台,master重新启动则将IP抢占过去。 (2)非抢占式配置: 两台均为backup,在优先级上做区分,如master挂掉,backup上台,则backup变成master,master变为backup。 a.两个节点的state均为backup(官方建议) b.两个节点都在vrrp_instance中添加nopreempt c.其中一个节点的优先级要高于另外一个节点 两台服务器角色都启用了nopreempt后,必须修改角色状态统一为backup,唯一的区别就是优先级不同。
#Master vrrp_instance VI_1 { state BACKUP priority 150 nopreempt } #Backup vrrp_instance VI_1 { state BACKUP priority 100 nopreempt }keepalive高可用故障脑裂 由于某些原因,导致两台keepalive高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。 a.服务器网线松动等网络故障 b.服务器硬件故障发生损坏现象而奔溃 c.主备服务器都开启了firewalld防火墙
解决方法:
如果Nginx宕机, 会导致用户请求失败, 但Keepalived并不会进行地址漂移所以需要编写一个脚本检测Nginx的存活状态, 如果不存活则kill nginx和keepalived # 脚本如下 [root@lb01 ~]# cat /server/scripts/check_www.sh #!/bin/sh nginxpid=$(ps -C nginx --no-header|wc -l) # -C是cmd #1.判断Nginx是否存活,如果不存活则尝试启动Nginx if [ $nginxpid -eq 0 ];then systemctl start nginx sleep 3 #2.等待3秒后再次获取一次Nginx状态 nginxpid=$(ps -C nginx --no-header|wc -l) #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本 if [ $nginxpid -eq 0 ];then systemctl stop keepalived fi fi [root@lb01 ~]# chmod +x /server/scripts/check_www.sh配置keepalived使用
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 } #定义脚本所在的位置,以及执行时间 vrrp_script check_www { script "/server/scripts/check_www.sh" interval 5 } vrrp_instance VI_1 { state BACKUP priority 150 nopreempt interface eth0 virtual_router_id 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } #调用脚本 track_script { check_www } }