龙空技术网

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

架构师尼恩 1009

前言:

现在我们对“centos7nat绑定”大概比较关怀,姐妹们都需要了解一些“centos7nat绑定”的相关知识。那么小编同时在网上汇集了一些关于“centos7nat绑定””的相关知识,希望兄弟们能喜欢,看官们一起来了解一下吧!

说在前面:

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

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

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

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

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》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实现高可用性cluster  - keepalived+LVS-DR实现高可用  - keepalive故障自动切换  - 抢占与非抢占  - keepalive+LVS  - LVS集中节点的健康检查  - 部署LVS + keeplived 高可用cluster    - 1)部署DR模式的负载均衡cluster    - 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,这个尼恩的在视频里边,是做过了实操演示的。

接入层的架构目标:

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

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

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

什么是LVS:

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

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

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

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

补充一下名称:

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

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

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

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 作为cluster的访问入口,不作为网关使用节点 Director Server 与 Real Server 需要在同一个网络中,返回给客户端的数据不需要经过 Director Server。

为了响应对整个cluster的访问,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 比对数据包请求的服务是否是cluster服务,是cluster服务就重新封装数据包。修改源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负载均衡cluster中,负载均衡器 DS与节点服务器 RS 都要配置相同的VIP地址,在局域网中具有相同的IP地址。势必会造成各服务器ARP通信的紊乱

当ARP广播发送到LVS-DR cluster时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到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请求时的相应级别

两个级别:

只要本地有相应地址就给予响应

仅在请求的目标(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:定义将自己的地址向外通告的级别

将本地任何接口上的地址向外通告

试图仅向目标网络通告与其网络匹配的地址

仅向与本地接口上地址匹配的网络进行通告

配置重点

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

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

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

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 cluster模式来说,由于 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.servicesetenforce 0 2. #安装httpd、开启服务yum install httpd -ysystemctl start httpd 3. #创建一个站点文件vim /var/www/html/index.htmlthis is 192.168.61.22 3. #添加回环网卡,修改回环网卡名,IP地址,子网掩码cd /etc/sysconfig/network-scripts/cp ifcfg-lo ifcfg-lo:0vim ifcfg-lo:0DEVICE=lo:0IPADDR=192.168.61.45NETMASK=255.255.255.255NETWORK=127.0.0.0 systemctl restart network  4. #设置路由route add -host 192.168.61.45 dev lo:0route -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地址上的IPvim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.lo.arp_announce = 2 sysctl -p

关闭防火墙

安装httpd、开启服务

创建一个站点文件

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

设置路由

开机执行命令

调整 proc 响应参数

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

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

cd /etc/sysconfig/network-scripts/cp ifcfg-lo ifcfg-lo:0vim ifcfg-lo:0DEVICE=lo:0IPADDR=192.168.61.45NETMASK=255.255.255.255NETWORK=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.servicesetenforce 0 2. #安装httpd、开启服务yum install httpd -ysystemctl start httpd 3. #创建一个站点文件vim /var/www/html/index.htmlthis is 192.168.61.33 3. #添加回环网卡,修改回环网卡名,IP地址,子网掩码cd /etc/sysconfig/network-scripts/cp ifcfg-lo ifcfg-lo:0vim ifcfg-lo:0DEVICE=lo:0IPADDR=192.168.61.45NETMASK=255.255.255.255NETWORK=127.0.0.0 systemctl restart network  4. #设置路由route add -host 192.168.59.188 dev lo:0route -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地址上的IPvim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.lo.arp_announce = 2 sysctl -p

关闭防火墙

安装httpd、开启服务

创建一个站点文件

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

设置路由

开机执行命令

调整 proc 响应参数

客户机测试(192.168.61.55)

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

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

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

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

解决方案:高可用

keepalived heartbeat/corosync

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

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

keepalived heartbeat/corosync ldirectord

检测方式

(a) 网络层检测,icmp

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

(c) 应用层检测,请求某关键资源

RS全不用时:backup server, sorry server

ldirectord

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

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

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

ldirectord守护进程通过向每台真实服务器真实IP(RIP)上的cluster资源发送访问请求来实现对真实服务器的监控,这对所有类型的LVS cluster都是成立的: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下载:安装: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:PORTvirtual=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=        #虚拟服务器的名称,随便指定

案例图:

LVS_DR lvs 与 rs 不同网段

前期规则设置(参考: 实践LVS的DR模式,lvs与rs不同网段)CIP:192.168.10.50      gateway:192.168.10.60Route: 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绑定在loRS2: 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  ;sleep 1; done    systemectl stop httpd 测试192.168.80.120192.168.80.110192.168.80.120192.168.80.110192.168.80.120192.168.80.120sorry servicessorry services

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

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

keepalived+LVS-DR实现高可用

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

keepalived+LVS实现高可用性cluster_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 高可用cluster

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

禁用网卡发送重定向

#0 表示禁用发送重定向,禁用发送重定向可以防止ARP欺骗和IP欺骗vim /etc/sysctl.confnet.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 = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.lo.arp_announce = 2

3)添加路由

route add -host 10.10.10.100 dev lo:0   #DR模式下,后端的真实服务器必须添加此路由,否则无法与客户端通信

4)配置keepalived

下载keepalived源码包

解压文件:

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*#安装keepalivedyum 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        #此处填写cluster IP地址    }}#配置cluster的IP端口,算法与部署模式virtual_server 10.10.10.100 80 {    delay_loop 6    #检测循环的次数以及时间    lb_algo rr       #设置当前cluster使用的算法    lb_kind DR      #设置当前cluster的模式      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 keepalivedglobal_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架构师+大数据架构师。

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

尼恩技术圣经系列 PDF:

标签: #centos7nat绑定