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

说在前面

在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网关接入层,LVS+Keepalived(DR模式)如何搭建?_第1张图片

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

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

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

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第2张图片

方案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相似,也是集群;

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第3张图片

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模式类似,不适用超大并发场景)

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第4张图片

TUN ip隧道模式

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

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第5张图片

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

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

DR 直接路由模式

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

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第6张图片

高并发负载均衡—LVS DR

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

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

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

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第7张图片

客户机发起请求,经过调度服务器(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拓补图

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第8张图片

  • 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实操

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第9张图片

主机 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工具

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

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

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第11张图片

重启网络服务、启动网卡

调整/proc响应参数

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第12张图片

刷新配置

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第13张图片

加载模块

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第14张图片

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

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第15张图片

清空ipvsadm,并做策略

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第16张图片

保存设置

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第17张图片

第一台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、开启服务

创建一个站点文件

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第18张图片

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

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第19张图片

设置路由

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第20张图片

开机执行命令

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第21张图片

调整 proc 响应参数

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第22张图片

基础知识: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地址,子网掩码

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第23张图片

设置路由

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第24张图片

开机执行命令

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第25张图片

调整 proc 响应参数

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第26张图片

客户机测试(192.168.61.55)

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第27张图片

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第28张图片

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第29张图片

故障隔离: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        #虚拟服务器的名称,随便指定

案例图:

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第30张图片

前期规则设置(参考: 实践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会及时切换到备份服务器;

10Wqps网关接入层,LVS+Keepalived(DR模式)如何搭建?_第31张图片

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,请到下面公号【技术自由圈】取↓↓↓

你可能感兴趣的:(面试,lvs,后端,面试,架构,云原生,gateway,java)