2、keepalive的高可用集群

keepalive工作原理和优点

代理服务器和调度都是单点模式,keepalive就是用来实现调度的高可用集群。

keepalive的工作原理:

keepalive就是专门为了lvs集群开发出来的,但是适用场景不仅仅局限于lvs。

而且keepalive为后台真实服务器做了一个健康检查,当服务不可用时,会自动的移除ipvs的转发策略,服务恢复时,会自动重新把策略加入到ipvs。

他是基于vrrp协议(vrrp:虚拟路由的冗余协议)实现的调度器的高可用方案。

keepalive可以实现:

1、主备切换,优先级,当主故障时,可以自动切换到备,主恢复之后,如果主的优先级比备高,还是会自动的切换到主。

2、故障检测和恢复功能

3、主备之间通过组播地址(224.0.0.18),互相发送健检查的报文,确定主备之间通信(确定双方是否工作正常)。

4、通过配置vip来实现集群的入口,vrrp是一个冗余(一方工作另一方备着)协议,主在工作时,备完全不参与集群的工作,只是监听主的状态。

keepalived实现lvs负载均衡

数据流向图如下:

zw4:主调度器 IP:192.168.254.14 VIP:192.168.254.100

zw5:备调度器 IP:192.168.254.15

zw6:后端真实服务器1 IP:192.168.254.16

tocat1:后端真实服务器2 IP:192.168.254.21

1、安装ipvsadm 和 keepalived软件

apt -y install ipvsadm keepalived

2、复制移动keepalive配置文件到 /etc/keepalived/下

cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf

3、修改主调度器的 keepalive 配置文件 keepalived.conf

global_defs:整个vrrp的全局配置

  • vrrp_iptables:配置了之后,keepalive重启之后不会添加iptables的策略

vrrp_instance VI_1:指定网卡设备和vip地址的模块,以及确定vrrp中主备的关系

virtual_server:指定转发的策略,以及lvs的工作模式和负载均衡的算法

check:负责健康检查,主要是检查服务的端口(监控服务状态一般就是监听端口)。

script:文本模式,也可以支持脚本形式的监控。

keepalived.conf配置文件具体解释如下

! Configuration File for keepalived 2 3 global_defs { 4 notification_email { 5 acassen 6 } 7 notification_email_from Alexandre.Cassen@firewall.loc 8 smtp_server 127.0.0.1

#本地邮件服务,可以删除不要

9 smtp_connect_timeout 30

#本地邮件服务,可以删除不要

10 router_id LVS_01

#确定主备服务器的id号,必须不同

11 vrrp_iptables

配置了之后keepalived重启之后不会添加iptables的策略。

12 } 13 14 vrrp_instance VI_1 { 15 state MASTER

确定服务器的身份 主

16 interface ens33

指定网卡设备

17 virtual_router_id 50

虚拟路由的id,主备保持一致

18 priority 100

优先级。谁数字大就是主

19 advert_int 1

主备之间检查的心跳率

20 virtual_ipaddress { 21 192.168.233.100

集群的vip地址

22 } 23 } 24 25 virtual_server 192.168.233.100 80 {

26 delay_loop 6

健康检查的间隔时间

27 lb_algo rr

负载均衡的算法

28 lb_kind DR

lvs的模式

29 persistence_timeout 50

连接保持的时间

30 protocol TCP

服务采用的协议

31 #指定的后台真实的服务器 32 real_server 192.168.233.61 80 { 33 weight 1

负载算法的圈子

34 TCP_CHECK {

tcp的健康

35 connect_port 80

检查的目标端口是80

36 connect_timeout 3

连接检查的超时时间3秒

37 retry 3

重试的次数

38 delay_before_retry 3

重试的间隔时间

39 } 40 } 41 } 42 }

4、修改备调度器的 keepalive 配置文件 keepalived.conf

首先把主调度器的 keepalived.conf 复制到 备调度器 /etc/keepalived/上

再配置 keepalived.conf

5、重启keepalived服务后检查配置的转发策略是否生效

6、检查主调度器VIP是否产生

这时候VIP地址已经绑定到了主调度器上

并且备调度器上没有VIP

7、模拟故障切换,主的VIP能否跳到备

stop keepalived.service停掉主的服务后,这时候VIP地址已经绑定到了备调度器上

8、检查主恢复之后VIP是否能够回到主

9、配置两台调度器内核文件

route add -host 192.168.254.100 dev ens33 #路由指向到服务器

10、配置真实服务器

首先配置网卡ens37

再配置真实服务器内核配置文件

最后路由指向到服务器

route add -host 192.168.254.100 dev ens37

11、实现,这时候我们访问192.168.254.100,调度器会采取轮询方式让我们访问两个后端真实服务器

keepalived实现nginx代理高可用

keepalived可以不依赖lvs的环境实现故障切换个高可用

数据流向图如下:

zw4:主代理服务器 IP:192.168.254.14 VIP:192.168.254.100

zw5:备代理服务器 IP:192.168.254.15

zw6:后端真实服务器1 IP:192.168.254.16

tocat1:后端真实服务器2 IP:192.168.254.21

1、修改主代理服务器的keepalived配置文件,调动keepalived脚本模块

调用nginx检查的配置

  • 配置从可执行的脚本中来,位置一定是绝对路径。
  • interval 5
  • 每5秒通过脚本检查nginx的状态

2、配置脚本check_nginx.sh

表示如果关闭了nginx,则会关闭keepalived服务。

并使用chmod 777给脚本赋执行权限

3、修改备代理服务器的keepalived配置文件

router_id LVS_02、state BACKUP和priority 90

4、先启动nginx,在启动keepalived,检查主备切换是否正常

这时候VIP地址在主调度器上,不在备调度器上。

5、配置两台代理服务器的nginx

这里我们使用的是7层代理轮询,两台代理服务器配置一样

6、配置完之后重启两台代理服务器的nginx,这时候我们访问192.168.254.100这个VIP地址,便可访问两个真实服务器的nginx

这时候我们我们关闭主代理服务器的keepalived服务,VIP地址会移交给备代理服务器,我们依然可以正常访问nginx,实现了高可用。

脑裂

在HA系统,只要是通过VIP这个机制实现的,都可能会出现脑裂这个问题。

即VIP地址同时出现在了主和备上

脑裂原因

1、防火墙屏蔽了主备之间的224.0.0.1的报文,导致互相都收不到,就认为都已经挂了,都认为自己是主。

2、网卡出现了故障(硬件故障),配置出问题:IP地址冲突。

3、心跳线:网线之间连接故障,断开,老话。

4、keepalived配置文件有问题,router_id一样、优先级一样、虚拟路由不一样都可能会导致问题(80%)。

解决办法

软件层面

1、抓包进行定位,查看组播的报文是否正常

2、配置文件进行排查(网卡配置,应用配置)

硬件层面

1、更换心跳线(网线)进行测试

2、网卡硬件的问题

3、内存和cpu,硬盘空间不足,也会出现脑裂

keepalived重点

vrrp协议实现的冗余高可用。

224.0.0.18发送组播的报文。

lvs的负载均衡支持的算法:rr、wrr、lc、wlc

脑裂的现象,原因及解决方法

相关推荐
jiecy2 小时前
vxlan 动态三层通信_方式2_通过 BGP EVPN Type 2 MAC Route(IRB路由)
运维·网络
口_天_光健4 小时前
两款轻量级数据库SQLite 和 TinyDB,简单!实用!
数据库·python·sqlite·非关系型数据库
notfindjob4 小时前
sqlite加密-QtCipherSqlitePlugin 下
数据库·算法·sqlite
凡人的AI工具箱4 小时前
每天40分玩转Django:Django部署
数据库·后端·python·算法·django
装不满的克莱因瓶4 小时前
【Redis经典面试题一】如何解决Redis和数据库一致性的问题?
数据库·redis·缓存·一致性·延迟双删·双写一致性
woshilys4 小时前
sql server msdb数据库备份恢复
数据库·sqlserver
Koi慢热5 小时前
黑客术语(1)
运维·服务器·网络·测试工具·网络安全
play_big_knife5 小时前
鸿蒙项目云捐助第十六讲云捐助使用云数据库实现登录注册
数据库·华为云·harmonyos·鸿蒙·云开发·云数据库·鸿蒙开发
火鸟25 小时前
Java 初学者的第一个 SpringBoot3.4.0 登录系统
数据库·通用代码生成器·编程初学者·第一个系统·电音之王·springboot3.4.0·java初学者
总是学不会.6 小时前
【Mysql面试】MyISAM 与 InnoDB相关问题
数据库·mysql·面试