当前位置: 首页 > news >正文

第三章 LVS(DR模式)+keepalived群集【重要】

        企业应用中,单台服务器承担应用存在单点故障的危险。单点故障一旦发生,企业服务将发生中断,造成极大的危害。既然一个服务器会产生单点故障,那么我们可以使用两台或多台服务器来预防单点故障的问题。Keepalived工具是专为LVS负载均衡器(调度器)HA高可用设计的一款健康检查工具。健康检查也叫做探针,对象有两个,一是调度器,二是节点服务器,主切换到备的过程叫做故障转移。健康检查和故障转移属于高可用的范畴。 

一、一个合格的群集应该具备的特点

  1. 负载均衡:用于提高群集的性能(LVS Nginx HAProxy SLB F5实现)
  2. 健康检查(探针):针对于调度器和节点服务器   (keepalived Hearbeat实现)
  3. 故障转移:通过vip漂移实现主备切换(通过vrrp 或 脚本实现)

二、健康检查常用的工作方式

  1. 发送心跳消息:vrrp探测报文  ping/pong消息
  2. tcp端口检查:向目标主机的IP:端口发起tcp连接请求,如果tcp连接三次握手成功则认为健康检查正常,否则认为健康检查异常。
  3. HTTP URL检查:向目标主机的url路径(如http://192.168.170.50:80/url路径)发起HTTP GET 请求方法,如果响应2xx或3xx状态码,则认为健康检查正常,如果响应4xx或5xx则认为异常,触发故障转移。

三、keepalived原理

        Keepalived 是基于 VRRP 协议实现的高可用方案。默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP),继续提供服务,保证服务的高可用。

四、Keepalived安装与启动

主调度器192.168.170.100
备调度器192.168.170.200
VIP:192.168.170.222

keepalived双机热备的故障切换是由虚拟ip地址的漂移实现的,适用于各种应用服务器。在LVS群集环境中应用时,还需用到ipvsadm管理工具。

1.主机初始化设置

关闭防火墙,挂载镜像,准备好阿里云镜像源和在线源,保证网络联通

2.部署2台调度器

①安装keepalived

访问官网Keepalived.org下载源码包或者yum软件包。挂载后我们的镜像中是有keepalived的,直接升级一下(准备好epel在线源和阿里云镜像源,安装keepalived)

②修改配置文件

cd /etc/keepalived/
vim keepalived.conf 
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf 
systemctl start keepalived.service
systemctl enable keepalived.service

global全局配置,邮箱通知,路由器id号,4个vrrp配置删除注释都可以

vrrp主配置为master,接口设置网卡接口,id51号,优先级设置,发送vrrp报文的间隔时间,密码验证设置一样,默认1111

virtual是lvs配置暂时不设置,删除

备调度器配置

ip address命令查看vrrp地址

 

五、Keepalived两个模式

  1. 抢占模式:如上面部署测试中的默认模式,master故障恢复后会从backup接管vip
  2. 非抢占模式:master故障恢复后不会主动抢占backup的vip。网络不稳定情况下,有效防止vip来回切换导致数据丢失。但是要注意,配置非抢占模式要注意启动服务的顺序,有限启动的获取master权限,与优先级无关。

主备都关掉keepalived,非抢占模式下谁先启动谁是主。

systemctl stop keepalived.service
systemctl start keepalived.service

如果就想要主服务器接管vip,生产环境中找个业务低谷时间重启备的keepalived即可(或者可以at做一次性计划任务)

六、部署LVS+Keepalived高可用群集

1)实验准备

主调度器(lvs)192.168.170.100
备调度器(lvs)192.168.170.200
节点服务器1192.168.170.4
节点服务器2192.168.170.5
nfs服务器192.168.170.6
vip:192.168.170.222

节点服务器和nfs沿用上面的配置,检查虚接口、内核配置文件、添加路由,验证能够正常访问。

2)nfs服务器配置192.168.170.6

#安装nfs和rpcbind
yum install -y nfs-utils rpcbind#创建共享目录和测试文件
mkdir /share/{xy101,xy102} -p
ls /share/
cd /share/
echo '<h1>this is xy101 test web page</h1>' >xy101/test.html
echo '<h1>this is xy102 test web page</h1>' >xy102/test.html
vim /etc/exports/share/xy101 192.168.170.0/24(ro)/share/xy102 192.168.170.0/24(ro)
systemctl enable --now rpcbind nfs
showmount -e

2)配置2台web服务器

 注意:配置lo:0虚接口承载VIP;修改内核参数 arp_ignore=1、arp_announce=2防止网关ARP紊乱问题;添加路由 route add -host <VIP> dev lo:0

#节点服务器1,ip地址为192.168.170.4
systemctl start rpcbind
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#挂载
showmount -e 192.168.170.6
#上传nginx的repo源
cd /etc/yum.repos.d/
#安装nginx
yum install -y nginx
systemctl start nginx
#挂载
mount 192.168.170.6:/share/xy101 /usr/share/nginx/html/
ls /usr/share/nginx/html/

//配置虚拟网卡和vip
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0DEVICE=lo:0IPADDR=192.168.170.50NETMASK=255.255.255.255ONBOOT=yes
systemctl restart network
ifconfig 

#验证需要关闭nginx长连接功能,不然要每次等65秒
vim /etc/nginx/nginx.confkeepalive_timeout  0;
systemctl restart nginx
systemctl enable nginx

#添加内核参数,解决ARP紊乱的问题
vim /etc/sysctl.conf
------------------------------------------------------------
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
------------------------------------------------------------
sysctl -p#添加路由规则,把VIP地址指向lo网卡,物理网卡收到数据包后把请求送到lo网卡上
route add -host 192.168.170.222 lo:0
route -n
#永久添加的方式
vim /etc/sysconfig/static-routesany host 192.168.170.170.222 dev lo:0#配置开启自动添加路由的配置(实验可不加)
vim /etc/rc.local
/sbin/route add -host 192.168.170.222 dev lo:0
--------------------------------------------------------------------------------------
#节点服务器2,ip地址为192.168.170.5,操作同上。注意挂载的目录如果你创建了两个,要区别开,不要挂载到一个目录

3)部署2台调度器

#调度器安装ipvsadm,加载ip模块
yum install -y ipvsadm
touch /etc/sysconfig/ipvsadm
modprobe ip_vs
lsmod | grep ip_vs
touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm#keepalived重新配置
cp /etc/keepalived/keepalived.conf.bak keepalived.conf
vim keepalived.conf
-----------------------------------------------------------1 Configuration File for keepalived2 3 global_defs {4    notification_email {5      acassen@firewall.loc6      failover@firewall.loc7      sysadmin@firewall.loc8    }9    notification_email_from Alexandre.Cassen@firewall.loc10    smtp_server 127.0.0.1                //邮箱地址指向本地11    smtp_connect_timeout 3012    router_id LVS_01                     //LVS_01   13 }14 15 vrrp_instance VI_1 {16     state MASTER17     interface ens33           //网卡名18     virtual_router_id 51      //可改可不改19     priority 10020     advert_int 121     authentication {22         auth_type PASS23         auth_pass 111124     }25     virtual_ipaddress {26         192.168.170.222       //vip地址,要与节点服务器的一致        27     }28 }29 30 virtual_server 192.168.170.222 80 {         虚拟服务器配置31     delay_loop 6                            对节点服务器的健康检查间隔时间32     lb_algo rr                              调度策略33     lb_kind DR                              lvs模式改成dr模式34     persistence_timeout 0                   根据需求改连接保持时间35     protocol TCP36 37     real_server 192.168.170.4 80 {          真实服务器配置38         weight 1                            权重39         TCP_CHECK {                         默认是SSL_GET,这里改为TCP40             connect_port 80                 连接真实服务器的端口       41             connect_timeout 3               连接超时时间3秒42             nb_get_retry 3                  连接重试次数3次      43             delay_before_retry 3            每次重试间隔3秒44         }45     }46 47     real_server 192.168.170.5 80 {48         weight 149         TCP_CHECK {50             connect_port 8051             connect_timeout 352             nb_get_retry 353             delay_before_retry 354         }55     }56 }
-----------------------------------------------------------
#把配置文件远程给另一台调度器
scp keepalived.conf 192.168.170.200:/etc/keepalived/

文件配置好了之后重启2台调度器的keepalived服务

systemctl restart keepalived.service
#规则通过vip自动生成了
ip aadress

我这里主调度器的规则没有自动生成,我手动创建了。
#创建规则
ipvsadm -ln
ipvsadm -C
ipvsadm -A -t 192.168.170.222:80 -s rr
ipvsadm -a -t 192.168.170.222:80 -r 192.168.170.4:80 -g
ipvsadm -a -t 192.168.170.222:80 -r 192.168.170.5:80 -g

4)测试

通过虚拟ip实现负载均衡。模拟主调度器宕机,看看还能不能正常提供服务器。

现在关闭一台web服务器

至此就实现了LVS-DR配合keepalived的高可用

七、部署nginx+Keepalived高可用群集

1)实验准备

主调度器(nginx)192.168.170.100
备调度器(nginx)192.168.170.200
节点服务器1192.168.170.4
节点服务器2192.168.170.5
nfs服务器192.168.170.6
vip:192.168.170.222

节点服务器和nfs沿用上面的配置,检查虚接口、内核配置文件、添加路由,验证能够正常访问。

调度器使用100和200,还原初始状态关闭防火墙和selinux

2)配置nginx调度器

nginx配置四层反向代理,upstream定义服务器名称backends

验证nginx的四层代理

然后开始配置nginx调度器的keepalived高可用

cd /etc/keepalived/
touch nginx_check.sh
vim nginx_check.sh
---------------------------------------------------
#!/bin/bashif ! killall -0 nginx &> /dev/nullthensystemctl stop keepalived
fi
---------------------------------------------------
chmod +x nginx_check.shvim /etc/keepalived/keepalived.conf
---------------------------------------------------
! 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 NGINX_01#vrrp_skip_check_adv_addr#vrrp_strict#vrrp_garp_interval 0#vrrp_gna_interval 0
}vrrp_script nginx_check {script "/etc/keepalived/nginx_check.sh"inrerval 2weight 2
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.170.222}   track_script {nginx_check}
}
#这里是用nginx做负载均衡器的,下面的内容全部删除
---------------------------------------------------------------
scp nginx_check.sh keepalived.conf 192.168.170.200:`pwd`

第二台nginx调度器修改配置文件

#分别启动nginx和keepalived
systemctl restart nginx
systemctl start keepalived.service
systemctl enable keepalived.service --now
ip address

3)验证,访问VIP

模拟故障,关闭一台nginx调度器

模拟调度器故障恢复,开启主调度器的nginx,再启动keepalived,主调度器又会掌管VIP做代理转发了。

八、keepalived脑裂故障

1)现象

主服务器和备服务器都同时拥有相同的VIP

2)原因

Master一直发送心跳消息给backup主机,如果中间的链路突然断掉,backup主机将无法收到master主机发送过来的心跳消息(也就是vrrp报文),backup这时候会立即抢占master的工作,但其实这时候的master是正常工作的,此时就会出现脑裂的现象。

3)如何解决

关闭主服务器或备服务器其中一个的keepalived服务

3)如何预防脑裂现象

  1. 如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
  2. 如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
  3. 在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
  4. 利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java技术面试(一面)
  • 单调栈《数组模拟》
  • 极狐 GitLab 依赖扫描:助力开发者管理软件供应链
  • SQL数据抽样:精准洞察的高效策略
  • 开放平台: 签名密钥、回调地址、ip白名单管理。
  • excel导入
  • vue3中引入插件报ts报错Could not find a declaration file for module
  • 学懂C++(二十四):高级教程——C++ 多线程编程中 std::thread 的深入详解
  • java 面试 PDF 资料整理
  • 【vue】浏览器兼容相关
  • 关于近期安卓开发书籍阅读观后感
  • 【自动驾驶】ROS中参数服务器通信(c++)
  • R语言文本挖掘-万字详细解析tm包
  • Android 开发中常用的布局类型及其选择指南
  • Hadoop之DataNode启动源码解析
  • 【comparator, comparable】小总结
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • flask接收请求并推入栈
  • HomeBrew常规使用教程
  • js继承的实现方法
  • LeetCode18.四数之和 JavaScript
  • PV统计优化设计
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 浮动相关
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #Linux(Source Insight安装及工程建立)
  • $refs 、$nextTic、动态组件、name的使用
  • (52)只出现一次的数字III
  • (C++20) consteval立即函数
  • (libusb) usb口自动刷新
  • (补充)IDEA项目结构
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (九)信息融合方式简介
  • (算法)硬币问题
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转) Face-Resources
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .“空心村”成因分析及解决对策122344
  • .NET 8.0 发布到 IIS
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [5] CUDA线程调用与存储器架构
  • [Android 数据通信] android cmwap接入点
  • [BSidesCF 2019]Kookie1
  • [CC-FNCS]Chef and Churu
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [Day 43] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [Hive] 常见函数
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [ICCV2017]Neural Person Search Machines
  • [IE编程] IE中对网页进行截图的编程接口