前言:
现在我们对“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拓补图
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不同网段)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会及时切换到备份服务器;
▌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绑定