说在前面
在40岁老架构师 尼恩的读者交流群(50+)中,很多小伙伴拿高薪,完成架构的升级,进入架构师赛道,打开薪酬天花板。
最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架构师,遇到一些很重要的面试题:
- 你的项目达到10Wqps,这么高的吞吐量,你是怎么实现的?
此文,40岁老架构师尼恩,结合《10Wqps Netty API网关架构与实操》 的业务场景,给大家提供一份比较全面的参考答案。使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让你的面试官爱到 “不能自已、口水直流”。
也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V116版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的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:
- 高伸缩性,高可用的服务;
- 已被集成到Linux中;
- 整体架构和Nginx相似,也是集群;
lvs基于四层,处理能力是Nginx的几十倍,负载能力更高。lvs可以只接受不响应,nginx接收并相应
思考: LVS 和 Nginx 很像,为什么还要使用LVS?
- LVS基于四层,工作效率高
- LVS基于四层,请求接收到直接转发
- Nginx接收到请求后,还需要对请求做一定处理(会有一定性能损耗)
- 假如Nginx能支持的并发能达到几万,那么LVS能支持的负载可以达到Nginx的几十倍
- 单个Nginx承受不了压力,需要集群
- 当使用Nginx集群的时候,Nginx前置的调度者不能再由Nginx充当了,因为这样还是相当于Nginx承担了所有的压力,所以我们用LVS充当Nginx集群前置调度者;
- 备注: LVS+Nginx 相当于 LVS就是Nginx,Nginx就是上游服务器;
- 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拓补图
- 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请求时的相应级别
两个级别:
- 只要本地有相应地址就给予响应
- 仅在请求的目标(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修改为1
- arp_announce修改为2
- arp_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 群集模式来说,由于 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失效时,把它从虚拟服务器列表中删除,恢复时重新添加到列表。
- LVS不可用,整个系统将不可用;SPoF Single Point of Failure
解决方案:高可用
keepalived heartbeat/corosync
- 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不同网段)
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会及时切换到备份服务器;
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,请到下面公号【技术自由圈】取↓↓↓