Nginx合集-高可用(LVS-DR)
LVS介绍
LVS 是 Linux Virtual Server 的简写,即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。此项目在 1998 年 5 月由章文嵩博士成立,是国内最早出现的自由软件项目之一,是根据 iptables 的实现来开发的,所以使用的时候会和 iptables 相类似
官网:The Linux Virtual Server Project
中文站点: LVS中文站点
LVS三种模式介绍
- NAT模式(网络地址映射)
- IP TUN模式(IP Tunneling IP隧道)
- DR模式(Direct Routing 直接路由)
不同的转发模式决定了不同的的网络结构
NAT模式
NAT 模式(即:网络地址映射)其工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程
- DNAT:目标地址转换,改变的是目标地址
- SNAT:源地址转换,改变的是源地址
NAT 模式就是使用 SNAT 和 DNAT 技术完成报的转发,NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,非常节省成本,但是整个系统的性能受到限制。因为执行 NAT 每次需要重写数据包,有一定的延迟,另外,大部分应用有 80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对LVS形成很大压力,容易成为瓶颈
IP TUN模式
IP TUN(IP Tunneling 即 IP隧道)当 LVS 分配请求到不同的 real server,real server 处理请求后直接回应给用户,这样 LVS 仅处理客户机与服务器的一半连接。IP TUN 技术极大地提高了 LVS 的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过 100 个节点。real server 可以在任何 LAN 或 WAN 上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。但此模式要求所有服务器必须支持 IP 隧道协议,因此只能在 linux 下使用,在 windows 无法使用
DR模式
DR(即 Direct Routing 直接路由)与 IP TUN 类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性,DR 与 IP TUN 相比,没有 IP 封装的开销,但由于采用物理层(修改 MAC地址)技术,所有服务器都必须在同一个局域网
DR 和 IP TUN 的区别:
DR 与 IP TUN 相比,没有 IP 封装的开销,但由于采用数据链路层(修改 MAC地址)技术,所有服务器都必须在一个物理网段
三种模式对比
NAT模式 | IP TUN模式 | DR模式 | |
对服务器要求 | 任何操作系统均支持 | 必须支持IP隧道协议,目前只有Linux支持 | 支持虚拟网卡,且可以禁用ARP响应 |
网络要求 | 局域网 | 局域网或广域网 | 局域网 |
支持的节点数 | 10~20个,视Director处理能力而定 | 可以支持到100个节点 | 可以支持到100个节点 |
安全性 | 较高,可隐藏real server | 较差,real server 容易暴露 | 较差,real server 容易暴露 |
IP要求 | 仅需要一个合法IP地址作为VIP | 除VIP外,每个服务器需要拥有合法IP地址可以直接路由至客户端 | 除VIP外,每个服务器需要拥有合法IP地址可以直接路由至客户端 |
拓展性 | 差 | 很好 | 好 |
特点 | 地址转换 | 封装IP | 修改MAC地址 |
LVS配置实践
LVS-DR(直接路由)+ NGINX ——负载均衡集群部署及测试案例
环境准备
操作系统 | IP | 角色 | 备注 |
centos7 7.9.2009 | 10.0.53.77 | vip虚拟ip | |
10.0.53.75 | lvs | ||
10.0.53.81 | nignx-1 | ||
10.0.53.82 | nignx-2 | ||
10.0.53.83 | nignx-3 |
LVS服务器配置(10.0.53.75)
从Linux2.4内核及以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能
uname -r
find /lib/modules/$(uname -r)/ -iname "**.ko*" | cut -d/ -f5- | grep ip_vs
安装LVS管理工具:ipvsadm
yum -y install ipvsadm
ipvsadm -v
虚拟ip配置
在ens192设备上绑定了一个虚拟设备ens192:0,同时设置了一个虚拟IP是10.0.53.77,然后指定广播地址也为10.0.53.77
虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255;因为有若干机器要使用同一个ip地址,用本身做广播地址和把子网掩码设成4个255就不会造成ip地址冲突了,否则lvs将不能正常转发访问请求。
ifconfig ens192:0 10.0.53.77 broadcast 10.0.53.77 netmask 255.255.255.255 up
#需要安装net-tools工具
服务器添加路由规则
route add -host 10.0.53.77 dev ens192:0
启用内核系统的包转发功能
echo "1" >/proc/sys/net/ipv4/ip_forward
清除原有lvs转发规则
ipvsadm --clear
添加虚拟IP规则(-s rr表示采用轮询策略, :80表示负载转发的端口是80)
ipvsadm -A -t 10.0.53.77:80 -s rr
在虚拟IP中添加服务规则
在新加虚拟IP记录中添加三条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式;
注意: lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口一致,这里都使用了80端口
ipvsadm -a -t 10.0.53.77:80 -r 10.0.53.81:80 -g
ipvsadm -a -t 10.0.53.77:80 -r 10.0.53.82:80 -g
ipvsadm -a -t 10.0.53.77:80 -r 10.0.53.83:80 -g
重启LVS
ipvsadm
nginx服务器配置(10.0.53.81、82、83)
nginx安装配置(略)
额外配置
在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。
在每个回环设备上绑定了一个虚拟IP地址
ifconfig lo:0 10.0.53.77 broadcast 10.0.53.77 netmask 255.255.255.255 up
添加路由规则
route add -host 10.0.53.77 dev lo:0
关闭arp解析
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
启动nginx
测试
IP轮询验证
浏览器访问虚拟ip:10.0.53.77,观察响应的后端nginx的ip
编辑
编辑
编辑
健康检查验证
停掉一个nginx服务测试:LVS具有健康检测机制,不会丢请求
关停10.0.53.81
编辑
不再访问10.0.53.81
编辑
编辑
重启10.0.53.81
编辑
重新访问10.0.53.81
编辑
参考文档
https://zhuanlan.zhihu.com/p/445202915