10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?

news2024/11/18 16:36:18

说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,很多小伙伴拿高薪,完成架构的升级,进入架构师赛道,打开薪酬天花板

最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架构师,遇到一些很重要的面试题:

  • 你的项目达到10Wqps,这么高的吞吐量,你是怎么实现的?

此文,40岁老架构师尼恩,结合《10Wqps Netty API网关架构与实操》 的业务场景,给大家提供一份比较全面的参考答案。使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让你的面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V116版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取

文章目录

    • 说在前面
    • 背景
    • 接入层的架构目标
    • 什么是LVS:
      • LVS 工作模式(三种)
        • NAT 基于网络地址转换
        • TUN ip隧道模式
        • DR 直接路由模式
    • 高并发负载均衡—LVS DR
      • LVS DR(Direct Routing)
      • DR拓补图
      • DR数据包流向分析
      • 问题一:IP 地址冲突
      • 问题二:第二次再有访问请求
      • 配置重点
    • lvs实操
      • 配置负载调度器
      • 第一台Web节点服务器
      • 基础知识:LINUX中的lo(回环接口)
      • 第二台Web节点服务器
      • 客户机测试(192.168.61.55)
    • 故障隔离:LVS实现健康性检查Ldirectord使用
      • ldirectord
      • Idirectord 软件和配置文件说明:
    • 失败切换:keepalived+LVS实现高可用性集群
      • keepalived+LVS-DR实现高可用
      • keepalive故障自动切换
      • 抢占与非抢占
      • keepalive+LVS
      • LVS集中节点的健康检查
      • 部署LVS + keeplived 高可用集群
        • 1)部署DR模式的负载均衡集群
        • 2)配置web服务器
        • 3)添加路由
        • 4)配置keepalived
        • 5)编译安装
          • 使用yum的方式直接安装keepalived
        • 6)修改keepalived配置文件
          • 修改完配置文件后重启keeplived使其生效
        • 7)配置backup备份
    • 说在最后:有问题可以找老架构取经
    • 参考文献
    • 尼恩技术圣经系列PDF

背景

在互联网的中型项目中,单服务器往往已经无法满足业务本身的性能要求,尼恩正在为大家梳理10Wqps Netty API网关架构与实操。

第一个问题是,如何支撑10Wqps?

第二个问题是,如何高可用的支持10Wqps?

《10Wqps Netty API网关架构与实操》 的总体架构图如下:

10Wqps Netty API网关网络拓扑架构:

  • 方案1:基于ECS/IDC机房的手动扩容网络拓扑架构
  • 方案2:基于ECS/IDC机房+K8S云原生自伸缩自扩容网络拓扑架构

方案1基于ECS/IDC机房的手动扩容网络拓扑架构,核心如下:

方案2基于ECS/IDC机房+K8S云原生自伸缩自扩容网络拓扑架构,将在此基础上,结合尼恩的硬核视频进行介绍。

不论方案1、方案2, 在接入层,都需要进行10Wqps网关接入层的架构设计。

这里尼恩特别说一下,为啥要用lvs,因为一个nginx扛不住 10Wqps,这个尼恩的在视频里边,是做过了实操演示的。

接入层的架构目标

接入层集群架构目标,包括如下三点:高可用、可扩展、负载均衡。

一个完整的集群架构,则需要包含如下三个功能:负载均衡、故障隔离、失败切换

  • 负载均衡:根据设定的算法,通过负载均衡器(Director)把外部请求转发到各个集群中的服务器上(Real server)
  • 故障隔离:当集群中一个或多个服务器(Real server)发生故障或无法提供服务时,集群能够把它们从转发队列中移除出去,以确保用户访问不会被错误转发到无法提供的服务器(Real server)处理。而当故障的服务器(Real server)重新恢复正常时候,又能够重新加入到集群的转发队列中。
  • 失败切换:失败切换主(Master)要就是去除负载均衡器(Director)的单点问题,一旦负载均衡器(Director)发生故障,备机(Slave)能够替代主(Master)负载均衡器(Director)接受用户请求,而当主负载均衡器(Director)恢复正常时,能够重新接管用户请求(根据配置而定)

什么是LVS:

  1. 高伸缩性,高可用的服务;
  2. 已被集成到Linux中;
  3. 整体架构和Nginx相似,也是集群;

lvs基于四层,处理能力是Nginx的几十倍,负载能力更高。lvs可以只接受不响应,nginx接收并相应

思考: LVS 和 Nginx 很像,为什么还要使用LVS?

  1. LVS基于四层,工作效率高
    1. LVS基于四层,请求接收到直接转发
    2. Nginx接收到请求后,还需要对请求做一定处理(会有一定性能损耗)
    3. 假如Nginx能支持的并发能达到几万,那么LVS能支持的负载可以达到Nginx的几十倍
  2. 单个Nginx承受不了压力,需要集群
    1. 当使用Nginx集群的时候,Nginx前置的调度者不能再由Nginx充当了,因为这样还是相当于Nginx承担了所有的压力,所以我们用LVS充当Nginx集群前置调度者;
    2. 备注: LVS+Nginx 相当于 LVS就是Nginx,Nginx就是上游服务器;
  3. Nginx接收请求来回, LVS可以只接受不响应;所以LVS的负载能力肯定比Nginx高;

补充一下名称:

LVS是Linux Virtual Linux的缩写,即Linux虚拟服务器,是一个常用的服务器集群系统,该功能已经广泛集成在Linux内核中。

Keepalived则是一个服务器检测状态软件,能够为集群提供故障隔离和失败切换功能

ipvsadm则是LVS的管理工具,能够添加,修改,删除,查看当前集群的配置和转发状态等。在使用Keepalived的方案中,只要系统安装有ipvsadm命令,只需要通过Keepalived的配置文件即可实现集群的所有配置。

LVS 工作模式(三种)

NAT 基于网络地址转换

(这种模式是和Nginx模式类似,不适用超大并发场景)

TUN ip隧道模式

条件限制: 所有的计算机节点都必须要有网卡, RealServer 向客户端响应不用经过LVS, 而是通过网卡之间建立一种 “隧道”,通信就通过这种隧道的方式;

优点: 请求上行(客户端-服务器) 没啥变化,下行(realserver - 客户端)大大优化;大大提高吞吐量和并发能力;

缺点: 需要每一个计算机节点都配置一个网卡, RealServerl暴露在公网(不好)

DR 直接路由模式

(解决 Real Server 暴露在公网问题)

高并发负载均衡—LVS DR

LVS-DR(Linux Virtual Server Director Server)工作模式 ,是生产环境中最常用的一 种工作模式。

  • LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用
  • 节点 Director Server 与 Real Server 需要在同一个网络中,返回给客户端的数据不需要经过 Director
    Server。

为了响应对整个群集的访问,Director Server 与 Real Server 都需要配置 VIP 地址。

客户机发起请求,经过调度服务器(lvs),经过算法调度,去访问真实服务器(RS)

由于不原路返回,客户机不知道,真实主机的ip地址,

所以只能通过调度服务器的外网ip(vip)去反回报文信息。

LVS DR(Direct Routing)

名称含义
DS(Director Server)前端负载均衡节点服务器
RS(Real SERVER)后端真实服务器
CIP(Client IP)客户端IP地址
VIP(Virtual IP)负载均衡对外提供访问的IP地址,一般负载均衡IP都会通过Viirtual IP实现高可用
RIP(RealServer IP)负载均衡后端的真实服务器IP地址
  • Director Server 和 Real Server 必须在同一个物理网络中。
  • Real Server 可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过 互联网对 RIP 进行直接访问。
  • 所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server。
  • Real Server 的网关不允许指向 Director Server IP,即不允许数据包经过 Director S erver。
  • Real Server 上的 lo 接口配置 VIP 的 IP 地址。

DR拓补图

DR拓扑图

  • VIP:虚拟服务器地址
  • DIP:转发的网络地址
  • RIP:后端真实主机(后端服务器)
  • CIP:客户端IP地址

DR数据包流向分析

(1) 客户端 发送请求到 Director Server,请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP) 到达内核空间。

(2) Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输。

(3) 内核空间判断数据包的目标 IP 是本机 VIP,此时 IPVS 比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源IP 地址与目标 IP 地址没有改变(源 IP 是 CIP,目标 IP 是 VIP),然后将数据包发送给 Real Server。

(4) 到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。

(5) 响应的时候,数据包重新封装报文(源 IP 地址为VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理 网卡然后向外发出。Real Server 直接将响应报文传送到客户端。

问题一:IP 地址冲突

在LVS-DR负载均衡集群中,负载均衡器 DS与节点服务器 RS 都要配置相同的VIP地址,在局域网中具有相同的IP地址。势必会造成各服务器ARP通信的紊乱

  • 当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
  • 只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播

解决思路:

路由器发送ARP请求(广播)

ARP---->广播去找ip地址解析成mac地址, 默认使用DR调度服务器上的外网地址(vip地址)响应,

需要在真实服务器上修改内核参数,使真实服务器只对自己服务器上的真实IP地址响应ARP解析。

解决方法:

对RS节点服务器进行处理,使其不响应针对VIP的ARP请求。

策略是要配置环回接口、修改内核参数。

用虚接口lo:0承载VIP地址。设置内核参数arp_ ignore=1: 系统只响应目的IP为本地IP的ARP请求

内核参数 arp_ignore 的作用:定义接收到ARP请求时的相应级别

两个级别:

  1. 只要本地有相应地址就给予响应
  2. 仅在请求的目标(MAC)地址配置请求到达接口才给予响应

问题二:第二次再有访问请求

RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址,发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址,路由器收到ARP请求后,将更新ARP表项,原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址。路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效

解决方法:

对RS节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择DR发送接口的IP地址

路由器上绑定了 真实服务器1的mac信息,

#请求到达真实服务器

在真实服务器上修改内核参数

只对所有服务器真实网卡上的地址进行反馈,解析

内核参数 arp_announce:定义将自己的地址向外通告的级别

  1. 将本地任何接口上的地址向外通告
  2. 试图仅向目标网络通告与其网络匹配的地址
  3. 仅向与本地接口上地址匹配的网络进行通告

配置重点

将server的VIP配置为对外隐藏,对内可见。

  • 将VIP配置在环回接口:隐藏VIP,外界请求不能到达
  • arp_ignore修改为1
  • arp_announce修改为2
  1. arp_ignore=1

防止网关路由发送ARP广播时调度调节器和节点服务器都进行响应,导致ARP缓存表紊乱,不对非本地物理网卡的ARP请求进行响应,因为vip时,承载lo:0

  1. arp_announce=2

系统不使用响应数据的源IP地址(VIP)来作为本机进行ARP请求报文的源IP地址,而使用发送报文的物理网卡IP地址作为ARP请求报文的源IP地址,这样可以防止网关路由器接收到的源IP地址为VIP的ARP请求报文后又更新ARP缓存表,导致外网再发送请求时,数据包到达不了调度器

lvs实操

主机IP地址
DR服务器192.168.61.44
web服务器192.168.61.22
web服务器192.168.61.33
vip(虚拟回环)192.168.61.45
客户端192.168.61.55

配置负载调度器

192.168.61.44
虚拟vip:192.168.61.45

   1. #关闭防火墙
      systemctl stop firewalld.service
      setenforce 0
   2. #安装ipvsadm工具
      yum install ipvsadm.x86_64 -y
   3. #配置虚拟IP地址(VIP:192.168.61.44)
      cd /etc/sysconfig/network-scripts/
      cp ifcfg-ens33 ifcfg-ens33:0
      vim ifcfg-ens33:0
      #删除UUID,dns与网关,注意子网
      NAME=ens33:0
      DEVICE=ens33:0
      IPADDR=192.168.61.45
      NETMASK=255.255.255.255
   4. #重启网络服务、启动网卡
      systemctl restart network
      ifup ifcfg-ens33:0
   5. #调整/proc响应参数   
      #对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能
      vi /etc/sysctl.conf
      net.ipv4.ip_forward = 0
      net.ipv4.conf.all.send_redirects = 0
      net.ipv4.conf.default.send_redirects = 0
      net.ipv4.conf.ens33.send_redirects = 0
   6. #刷新配置
      sysctl -p
   7. #加载模块
      modprobe ip_vs
      cat /proc/net/ip_vs
   8. #配置负载分配策略,并启动服务
      ipvsadm-save >/etc/sysconfig/ipvsadm
      systemctl start ipvsadm.service
   9. #清空ipvsadm,并做策略
      ##添加真实服务器-a  指定VIP地址及TCP端口-t   指定RIP地址及TCP端口 -r 指定DR模式-g
      ipvsadm -C
      ipvsadm -A -t 192.168.61.45:80 -s rr
      ipvsadm -a -t 192.168.61.45:80 -r 192.168.61.22:80 -g
      ipvsadm -a -t 192.168.61.45:80 -r 192.168.61.33:80 -g
   10. #保存设置
       ipvsadm
       ipvsadm -ln
       ipvsadm-save >/etc/sysconfig/ipvsadm

关闭防火墙

安装ipvsadm工具

配置虚拟IP地址(VIP:192.168.61.45)

重启网络服务、启动网卡

调整/proc响应参数

刷新配置

加载模块

配置负载分配策略,并启动服务

清空ipvsadm,并做策略

保存设置

第一台Web节点服务器

192.168.61.22

1. #关闭防火墙
systemctl stop firewalld.service
setenforce 0
 
2. #安装httpd、开启服务
yum install httpd -y
systemctl start httpd
 
3. #创建一个站点文件
vim /var/www/html/index.html
this is 192.168.61.22
 
3. #添加回环网卡,修改回环网卡名,IP地址,子网掩码
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.61.45
NETMASK=255.255.255.255
NETWORK=127.0.0.0
 
systemctl restart network
 
 
4. #设置路由
route add -host 192.168.61.45 dev lo:0
route -n
 
5. #开机执行命令
vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.61.45 dev lo:0
 
chmod +x /etc/rc.d/rc.local
 
6. #调整 proc 响应参数
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
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
 
sysctl -p

关闭防火墙

安装httpd、开启服务

创建一个站点文件

添加回环网卡,修改回环网卡名,IP地址,子网掩码

设置路由

开机执行命令

调整 proc 响应参数

基础知识:LINUX中的lo(回环接口)

上面的配置,添加回环网卡,修改回环网卡名,IP地址,子网掩码

cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.61.45
NETMASK=255.255.255.255
NETWORK=127.0.0.0

什么是LO接口?

在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。

LO接口的作用是什么?假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的’lo’接口,然后返回进入链的’lo’接口.

网络接口的命名

这里并不存在一定的命名规范,但网络接口名字的定义一般都是要有意义的。例如:

  • eth0: ethernet的简写,一般用于以太网接口。
  • wifi0:wifi是无线局域网,因此wifi0一般指无线网络接口。
  • ath0: Atheros的简写,一般指Atheros芯片所包含的无线网络接口。
  • lo: local的简写,一般指本地环回接口。

网络接口如何工作

网络接口是用来发送和接受数据包的基本设备。

系统中的所有网络接口组成一个链状结构,应用层程序使用时按名称调用。

每个网络接口在linux系统中对应于一个struct net_device结构体,包含name,mac,mask,mtu…信息。

每个硬件网卡(一个MAC)对应一个网络接口,其工作完全由相应的驱动程序控制。

虚拟网络接口

虚拟网络接口的应用范围非常广泛。最着名的当属“lo”了,基本上每个linux系统都有这个接口。

虚拟网络接口并不真实地从外界接收和发送数据包,而是在系统内部接收和发送数据包,因此虚拟网络接口不需要驱动程序。

虚拟网络接口和真实存在的网络接口在使用上是一致的。

网络接口的创建

硬件网卡的网络接口由驱动程序创建。而虚拟的网络接口由系统创建或通过应用层程序创建。

驱动中创建网络接口的函数是:

  • register_netdev(struct net_device * )
  • 或者register_netdevice(struct net_device * )。

这两个函数的区别是:register_netdev(…)会自动生成以”eth”作为打头名称的接口,而register_netdevice(…)需要提前指定接口名称.

事实上,register_netdev(…)也是通过调用register_netdevice(…)实现的。

第二台Web节点服务器

192.168.61.33

1. #关闭防火墙
systemctl stop firewalld.service
setenforce 0
 
2. #安装httpd、开启服务
yum install httpd -y
systemctl start httpd
 
3. #创建一个站点文件
vim /var/www/html/index.html
this is 192.168.61.33
 
3. #添加回环网卡,修改回环网卡名,IP地址,子网掩码
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.61.45
NETMASK=255.255.255.255
NETWORK=127.0.0.0
 
systemctl restart network
 
 
4. #设置路由
route add -host 192.168.59.188 dev lo:0
route -n
 
5. #开机执行命令
vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.59.188 dev lo:0
 
chmod +x /etc/rc.d/rc.local
 
6. #调整 proc 响应参数
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
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
 
sysctl -p

关闭防火墙

安装httpd、开启服务

创建一个站点文件

添加回环网卡,修改回环网卡名,IP地址,子网掩码

设置路由

开机执行命令

调整 proc 响应参数

客户机测试(192.168.61.55)

故障隔离:LVS实现健康性检查Ldirectord使用

独立的lvs并不具备对后端服务器执行健康检查的机制,这时通常需要配合第三方的工具来一起使用。

而ldirectord的作用就是用来监测Real Server,当Real Server失效时,把它从虚拟服务器列表中删除,恢复时重新添加到列表。

  1. LVS不可用,整个系统将不可用;SPoF Single Point of Failure

解决方案:高可用

keepalived heartbeat/corosync

  1. RS不可用时,Director依然会调度请求至此RS

解决方案: 由Director对各RS健康状态进行检查,失败时禁用,成功时启用

keepalived heartbeat/corosync ldirectord

检测方式:

(a) 网络层检测,icmp

(b) 传输层检测,端口探测

© 应用层检测,请求某关键资源

RS全不用时:backup server, sorry server

ldirectord

ldirectord是一个守护进程,用于监视和管理负载平衡虚拟服务器的LVS集群中的真实服务器。

ldirectord通常用作Linux HA的资源,但也可以从命令行运行。

使用ldirectord程序,这个程序在启动时自动建立IPVS表,然后监视集群节点的健康情况,在发现失效节点时将其自动从IPVS表中移除

ldirectord守护进程通过向每台真实服务器真实IP(RIP)上的集群资源发送访问请求来实现对真实服务器的监控,这对所有类型的LVS集群都是成立的:LVS-DR,LVS-NAT和LVS-TUN。

正常情况下,为每个Director上的VIP地址运行一个ldirectord守护进程,当真实服务器不响应运行在Director上的ldirectord守护进程时,ldirectord守护进程运行适当的ipvsadm命令将VIP地址从IPVS表中移除。(以后,当真实服务器回到在线状态时,ldirectord使用适当的ipvsadm命令将真实服务器重新添加到IPVS表中)

另外,Ldirectord也可以通过定期请求已知的URL,并检查响应是否包含预期的响应,来监视实际服务器的运行状况。如果一个真正的服务器出现故障,那么该服务器将被删除,并在重新联机后重新激活。

如果所有真正的服务器都关闭了,那么会在池中插入一个回退服务器,这将使一个静态的真正的Web服务器重新联机。通常,回退服务器是本地主机。如果正在提供HTTP虚拟服务,那么运行一个ApacheHTTP服务器是很有用的,该服务器返回一个页面,指示该服务暂时不可访问。

Idirectord 软件和配置文件说明:

包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
下载:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/x86_64/
安装:yum install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm -y  (需要epel源中的Perl)
 
文件:
    /etc/ha.d/ldirectord.cf 主配置文件
    /usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
    /usr/lib/systemd/system/ldirectord.service 服务
    /usr/sbin/ldirectord 主程序,Perl实现
    /var/log/ldirectord.log 日志
    /var/run/ldirectord.ldirectord.pid pid文件
 
 
Ldirectord配置文件说明
checktimeout=20           #判定real server出错的时间间隔。
checkinterval=10          #指定ldirectord在两次检查之间的间隔时间。
fallback=127.0.0.1:80     #当所有的real server节点不能工作时,web服务重定向的地址。
autoreload=yes            #是否自动重载配置文件,选yes时,配置文件发生变化,自动载入配置信息。
logfile="/var/log/ldirectord.log"   #设定ldirectord日志输出文件路径。
logfile="local0"            #rsyslog方式定义日志输出。
 
quiescent=no                        #当RS服务down时状态时, yes权重设为0,no为删除RS服务器。
当选择no时,如果一个节点在checktimeout设置的时间周期内没有响应,ldirectord将会从LVS的路由表中直接移除real server,此时,将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,
如果选择为yes,当某个real server失效时,ldirectord将失效节点的权值设置为0,新的连接将不能到达,但是并不从LVS路由表中清除此节点,同时,连接跟踪记录和程 序连接模板仍然保留在Director上。
virtual=5               #指定虚拟的IP地址和端口号,FWM(标签)或 IP:PORT
virtual=192.168.60.200:80           #指定虚拟的IP地址和端口号
   real=192.168.60.132:80 gate      #指定Real Server服务器地址和端口,同时设定LVS工作模式,用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
   real=192.168.60.144:80 gate
   fallback=127.0.0.1:80 gate       #sorry server
   service=http                     #指定服务的类型,这里是对http服务做负载均衡。
   request="index.html"             #ldirectord将根据指定的RealServer地址,结合该选项给出的请求路径,发送访问请求,检查RealServer上的服务是否正常运行,确保这里给出的页面地址是可访问的,不然ldirectord会误认为此节点已经失效,发生错误监控现象。
   receive="Test Page"              #指定请求和应答字串。
   scheduler=rr                     #指定调度算法,这里是rr(轮叫)算法。
   protocol=tcp                     #指定协议的类型,LVS支持TCP和UDP协议。
   checktype=negotiate              #指定Ldirectord的检测类型,默认为negotiate。
   checkport=80                     #指定监控的端口号。
   persistence=360                  #持久连接
   virtualhost=www.gaojf.com        #虚拟服务器的名称,随便指定

案例图:

LVS_DR lvs 与 rs 不同网段

前期规则设置(参考: 实践LVS的DR模式,lvs与rs不同网段)
CIP:192.168.10.50      gateway:192.168.10.60
Route: eth0(192.168.10.60)    eth0(192.168.80.60 、10.0.0.200/8 ) 启用IP_forward的功能
LVS:DIP:192.168.80.100  gateway:192.168.80.60   VIP: 10.0.0.100/32    gateway和VIP两个IP绑定在同一个网卡上
RS1: RIP:192.168.80.110  gateway:192.168.80.60   VIP: 10.0.0.100/32  VIP绑定在lo
RS2: RIP:192.168.80.120  gateway:192.168.80.60   VIP: 10.0.0.100/32  VIP绑定在lo
 
 
Route设置
ip a a  10.0.0.200/8 dev eth0   与80.60同一网卡上。
         
 
LVS服务器设置:
设置VIP地址  
    ip addr add  10.0.0.100/8 dev eth0
 
RS的服务器设置:
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
两台RS设置VIP地址
    ip addr add 10.0.0.100/8 dev lo:1
 
安装sorry Sever服务器,和 ldirectord服务
    yum install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm -y
    yum install httpd -y
    echo Sorry Server > /var/www/html/index.html
    systemctl start httpd
清空规则,复制配置文件模版
    ipvsadm -C  
    cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
设置配置文件
Ldirectord配置文件说明
    checktimeout=3                  #检查RS次数
    checkinterval=1                 #检查RS时间
    autoreload=yes
    logfile=“/var/log/ldirectord.log“ #日志文件
    #logfile="local0"                 #日志级别
    quiescent=no                      #当RS服务down时状态时, yes权重设为0,no为删除RS服务器。
virtual=10.0.0.100:80
    real=192.168.80.110:80 gate 2       #gate指DR模型,权重为 2
    real=192.168.80.120:80 gate 1
    fallback=127.0.0.1:80 gate          #sorry server, 当两个RS服务器出现问题,LVS的提示。
    service=http
    scheduler=wrr
    protocol=tcp
    checktype=negotiate
    checkport=80
    request="index.html"
 
 
# systemctl restart ldirectord.service
 
 
 while true ; do curl http://10.0.0.100 ;sleep 1; done    systemectl stop httpd 测试
192.168.80.120
192.168.80.110
192.168.80.120
192.168.80.110
192.168.80.120
192.168.80.120
sorry services
sorry services

失败切换:keepalived+LVS实现高可用性集群

失败切换主(Master)要就是去除负载均衡器(Director)的单点问题,一旦负载均衡器(Director)发生故障,备机(Slave)能够替代主(Master)负载均衡器(Director)接受用户请求,而当主负载均衡器(Director)恢复正常时,能够重新接管用户请求(根据配置而定)

keepalived+LVS-DR实现高可用

当LVS负载均衡的主服务器出现故障时,keepalived会及时切换到备份服务器;

keepalived+LVS实现高可用性集群_LVS

keepalive故障自动切换

① 两台DS同时安装好keepalived并且启动服务

当启动的时候master主机获得所有资源并且对用户提供服务(请求)当角色Backup的主机作为master热备,当master出现故障,Backup主机自动接管master主机所有工作

② 当master主机故障修复后,就会自动接管回它原来的所有工作,同时Backup主机则释放原master主机的所有工作,此时两台主机恢复到初始角色以及工作状态

抢占与非抢占

抢占:master恢复后,将VIP从Backup节点中抢占过来,回复自己master工作

非抢占:master恢复后,不抢占Backup目前的状态,Backup升级为master继续工作

keepalive+LVS

keepalive可以通过读取自身的配置文件,实现通过更底层的接口直接管理,LVS配置以及服务的启动、停止功能,这会使LVS应用更加简便

LVS集中节点的健康检查

Keeplived.conf文件配置LVS的节点IP和相关参数来实现对LVS直接管理,如果几个节点服务器同时发生故障无法提供服务,Keeplived服务会自动把那个失效节点服务器从LVS正常转发列中清除出去,并且将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响,当故障的节点服务器修复以后,Keepalived服务又会自动把他们加入到转发列中,对外面客户提供服务

部署LVS + keeplived 高可用集群

1)部署DR模式的负载均衡集群

禁用网卡发送重定向

#0 表示禁用发送重定向,禁用发送重定向可以防止ARP欺骗和IP欺骗
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    #ens33网卡的(根据需要修改为真实网卡即可)
#添加完毕后,刷新内核参数使其生效
sysctl -p   #刷新内核参数
2)配置web服务器

修改内核文件,控制arp行为

#配置内核文件,控制arp行为

arp-ignore
# 0 只要本机配置有相应IP地址就响应;
# 1 仅在请求的目标地址配置在请求到达网络接口上时,才给予响应;
arp-announce
# 0 将本机任何网络接口上的任何地址都向外通告;
# 1 尽可能避免向目标网络通告与其网络不匹配的地址信息表;
# 2 仅向目标网络通告与其网络相匹配的地址信息。
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
3)添加路由
route add -host 10.10.10.100 dev lo:0   #DR模式下,后端的真实服务器必须添加此路由,否则无法与客户端通信
4)配置keepalived

下载keepalived源码包

https://www.keepalived.org/software/keepalived-2.0.18.tar.gz

解压文件:

tar -zxvf [下载的包名]
#安装相关依赖
yum install -y kernel-devel openssl-devel popt-devel gcc*
5)编译安装

编译安装后,在/etc/查看是否存在keepalived目录,如果不存在则在解压的源码目录/root/keepalived-2.0.18/keepalived/etc/keepalived中将keepalived.conf配置文件复制一份过来否则无法启动

#在解压后的目录中执行编译安装
 ./configure --prefix=/
 make && make install  
检查/etc/init.d/目录下是否存在 keepalived 文件,如果不存在则在源码的init.d文件夹中拷贝一份启动脚本到/etc/init.d/目录下
cp /root/keepalived-2.0.18/keepalived/etc/init.d  /etc/init.d/
#拷贝完成后设置为开机自启
chkconfig --add keepalived  #添加为系统服务
chkconfig keepalived on     #设置为开机自启
使用yum的方式直接安装keepalived
#安装依赖
yum install -y kernel-devel openssl-devel popt-devel gcc*
#安装keepalived
yum install keepalived -y
6)修改keepalived配置文件

vim /etc/keepalived/keepalived.conf

global_defs {
   router_id LVS_MASTER   #设置自定义名称
}

vrrp_instance VI_1 {
    state MASTER      #设置状态主或备,根据实际情况修改
    interface eth0    #指定网卡做心跳检测
    virtual_router_id 51    #配置虚拟组,主备lvs服务器必须在同一个组里否则不生效
    priority 100            #优先级配置。主与从之间差距最好在50,最大设置为150
    advert_int 1            #心跳检测间隔为1s
    authentication {        #配置主备之间的认证
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.100
        #此处填写集群IP地址
    }
}

#配置集群的IP端口,算法与部署模式
virtual_server 10.10.10.100 80 {
    delay_loop 6    #检测循环的次数以及时间
    lb_algo rr       #设置当前集群使用的算法
    lb_kind DR      #设置当前集群的模式  
    persistence_timeout 50    # 同一IP的连接50秒内被分配到同一台realserver
    protocol TCP      #设置检测使用的协议为TCP

    #配置真实服务器的相关IP和端口信息,有几个真实服务器就填写几个real_server
    real_server 10.10.10.12 80 {          
        weight 1                              #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                           #keepalived默认的健康检查方式为HTTP_GET,其他健康检测方式分别是: SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 3                #健康监测超时时间
            retry 3                           #重连次数3次
            delay_before_retry 3              #重连间隔时间
            connect_port 80                   #健康检查realserver的端口
        }                                     
    }
修改完配置文件后重启keeplived使其生效
service keeplived start
7)配置backup备份

网卡配置部分略,跟主服务器同网段IP即可,虚拟IP主备必须保持一致。在同一局域网配置相同ip后启动网卡时会报错。这是因为网卡启动时会通过发送ARP请求检测目标IP地址是否与其他主机发生了冲突,所以这里需要手动关闭backup服务器网卡的arp检测功能。

vim /etc/sysconfig/network-scripts/ifup-eth    
 #由于不通系统版本文件存放位置不一致,此路径为centos7下的配置文件存放位置。其他系统需重新找到ifup-eth文件的正确位置

#在配置文件中注释掉arp命令检测的相关判断,在配置文件的275行左右注释后即可重启网卡成功
if [ $? = 1 ]; then
   ARPINGMAC=$(echo $ARPING |  sed -ne 's/.*\[\(.*\)\].*/\1/p')
   net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."
   exit 1
 fi

安装keepalived步骤不在赘述,与master安装步骤一致。

修改配置文件,将状态设置为backup

! Configuration File for keepalived

global_defs {
   router_id LVS2   #修改备份服务器的名称,不能与主服务器名称重复
}

vrrp_instance VI_1 {     
    state BACKUP    #状态设置为backup或者SLAVE
    interface ens33    
    virtual_router_id 51
    priority 50    #修改优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.100
    }
}
virtual_server 10.10.10.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

    real_server 10.10.10.12 80 {
        weight 1
        TCP_CHECK{
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 10.10.10.13 80 {
        weight 1
        TCP_CHECK{
            connect_timeout 3
            connect_port 80
            retry 3
            delay_before_retry 3
        }
    }
}

说在最后:有问题可以找老架构取经

架构之路,充满了坎坷

如何顺利的跨过架构师的坎,化茧为蝶,完成架构师的顺利蜕变,是很多开发同学的梦寐以求的事情。

好事总是多磨。

架构和高级开发不一样 , 架构问题是open/开放式的,架构问题是没有标准答案的。

为了完成蜕变,很多小伙伴,耗费很多精力,耗费很多金钱。

但是,遗憾的是,蜕变之路非常曲折,甚至很多同学折腾一生都没有完成架构升级。

所以,在架构升级/转型过程中,如果确实找不到有效的方案,可以来找40岁老架构尼恩求助、帮扶。

前段时间一个小伙伴,做化工15年后,跨行来做Java,同样面临转架构难题,但是经过尼恩几轮指导,顺利拿到了Java架构师+大数据架构师。

所以,如果大家遇到转架构的难题,可以找尼恩取经,保证峰回路转。

参考文献

https://www.cnblogs.com/Yuanbangchen/p/16544951.html

https://blog.csdn.net/lyfqyr/article/details/125446564

https://blog.51cto.com/zero01/1982076

https://cloud.tencent.com/developer/article/1981119

https://blog.csdn.net/Liu_Fang_Hong/article/details/131577146

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1089203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis的Java客户端-Jedis

目录 一、Jedis基本用法二、Jedis连接池 一、Jedis基本用法 二、Jedis连接池

C语言中的自定义类型详解(结构体 + 枚举 + 联合(共用体))

文章目录 1. 结构体1.1 结构体的声明1.2 结构体成员的访问1.3 匿名结构体1.4 结构体的自引用1.5 结构体内存对齐(计算结构体的大小)1.6 结构体传参1.6.1 传值传递1.6.2 传址传递(使用指针) 2. 位段2.1 什么是位段?2.2 …

Pytorch从零开始实战05

Pytorch从零开始实战——运动鞋识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——运动鞋识别环境准备数据集模型选择数据可视化模型预测总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytorch2.0.1cu118…

五、OSPF动态路由实验

拓扑图: 基本ip的配置已经配置好了,接下来对两台路由器配置ospf协议,两台PC进行跨网段通讯 R1与R2构成单区域OSPF区域0,首先对R1进行配置 首先进入ospf 默认进程1,router id省略空缺,之后进入area 0区域&…

NodeMCU ESP8266 GPIO使用详解(图文并茂)

NodeMCU ESP8266 GPIO使用详解 文章目录 NodeMCU ESP8266 GPIO使用详解前言什么是GPIO?GPIO 的使用GPIO模式作为输出输出高电平输出低电平 作为输入上拉输入下拉输入读取输入值 总结 前言 前面的文章中我们已经学习了如何点亮一个LED灯,在嵌入式的世界里…

Web自动化测试入门 : 前端页面的组成分析详解

目前常见的前端页面是由HTMLcssJavaScript组成。 一、HTML: 作用:定义页面呈现的内容 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language)HTML 不是一种编程语言,而是一种标记语言 (markup langua…

【问题思考】为什么SCAN CSCAN会导致磁臂黏着而FCFS不会导致磁臂黏着?

问题 这道18年的真题引起了我的疑惑,SCAN和CSCAN我认为应该也不会导致磁臂黏着,因为他们对于一个访问序列,比如19,24,52,现在正往外走,但是来了一个12的,不是早晚会往回走&#xff…

【数据结构】:队列的实现

队列 队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队…

AN基础工具——变形工具

【AN基础工具——变形工具】 基本使用方法:任意变形工具基础动画 本篇内容:学会使用变形工具 重点内容:变形工具 工 具:Adobe Animate 2022 基本使用方法: 任意变形工具 《任意变形工具(快捷键Q&#xff0…

QT实现的截屏工具与录像功能

前言 目前实现了高仿微信的截屏工具,altx截屏,用户选取区域进行截屏确认,截屏完成后复制到了粘贴板,用全局按键监听按键,程序在最小化时也可以对按键进行监听,有截屏预览与保存按键。 大致流程&#xff1a…

统计学中箱型图的理解

一、箱形图的介绍 箱形图又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况的统计图,因型状如箱子而得名。它是利用数据中的五个统计量:最小值、上四分位数、中位数、下四分位数与最大值来描述数据的一种统计图。 箱形图…

【MySQL入门到精通-黑马程序员】MySQL基础篇-函数

文章目录 前言一、字符串函数二、数值函数三、日期函数四、流程控制函数总结 前言 本专栏文章为观看黑马程序员《MySQL入门到精通》所做笔记,课程地址在这。如有侵权,立即删除。 函数 是指一段可以直接被另一段程序调用的程序或代码。 一、字符串函数 格…

C# AnimeGANv2 人像动漫化

效果 项目 下载 可执行程序exe下载 源码下载 其他 C# 人像卡通化 Onnx photo2cartoon-CSDN博客 C# AnimeGAN 漫画风格迁移 动漫风格迁移 图像卡通化 图像动漫化_天天代码码天天的博客-CSDN博客

复数的三角形式与指数形式

See https://blog.csdn.net/u011089570/article/details/102685877

C++ wpf自制软件打包安装更新源码实例

程序示例精选 C wpf自制软件打包安装更新源码实例 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《C wpf自制软件打包安装更新源码实例》编写代码,代码整洁,规则&…

JAVA设计模式-工厂模式(Factory Pattern)

一.概念 我们在创建对象时不会对客户端直接暴露创建逻辑,而是 通过使用一个共同的接口根据不同的条件来指向具体想要创建的对象。 二.工厂模式优点 1.解耦 :把对象的创建和使用的过程分开 2.降低代码重复: 如果创建某个对象的过程都很复杂…

HTML基础入门02

目录 1.格式化标签 2.图片标签: img 3.超链接标签: a 4.综合案例: 展示博客2 5.表格标签 5.1基本使用 5.2合并单元格 6.列表标签 1.格式化标签 加粗:strong标签和b标签 倾斜:em标签和i标签 删除线:del标签和s标签 下划线:i…

结构体,位段!

目录 1.什么是位段? 别急!在下面第二点我和大家介绍。 2.位段的内存怎么分配? 还有一种情况就是两种类型夹杂在一起的位段 3.位段的跨平台问题 4.位段能干嘛?(应用) 5.位段的注意事项 1.什么是位段&…

MySQL 进阶笔记

😀😀😀创作不易,各位看官点赞收藏,在这里隆重感谢尚硅谷宋红康老师。, 文章目录 MySQL 进阶笔记1、Centos 环境安装 MySQL2、MySQL常用设置2.1、字符集设置2.2、SQL 大小写2.3、sql_mode 模式2.4、MySQL 数…

【OJ比赛日历】快周末了,不来一场比赛吗? #10.14-10.20 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-10-14(周六) #7场比赛2023-10-15…