Linux系统——LVS-DR群集部署及拓展
���录
引言
1.LVS的工作模式及其工作过程
2.列举出LVS调度算法
3.LVS调度常见算法(均衡策略)
3.1固定调度算法:rr,wrr,dh,sh
3.2动态调度算法:wlc,lc,lblc
4.LVS三种工作模式区别
一、IP隧道
二、直接路由
1.DR——直接路由概述
2.DR模式特点
3.LVS工作模式总结和比较
4.直接路由原理
三、搭建LVS-DR模式
1.准备环境
2.配置LVS-DR代理服务器
3.配置后端真实服务器
Centos7-2
Centos7-3
4.测试
引言
1.LVS的工作模式及其工作过程
LVS有三种负载均衡的模式,分别是VS/NAT(NAT模式)、VS/DR(路由模式)、VS/TUN(隧道模式)
1.NAT模式(VS-NAT)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(R)。然后负载均衡器就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP)。,真实服务器响应完诘求后,查看默认路由,把响应后的数据包发送给负载均衡器,负载均衡器在接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端,
- 优点:集样中的服务器可以使用任何支持TCP/IP的操作系统,只要负载均衡器有一个合法的IP地址。
- 缺点;扩展性有限,当服务器节点增长过多时,由于所有的请求和应答都需要经过负我均衡器,因此负我均衡器将成为整个系统的瓶颈。
2.直接路由模式(VS-DR)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求数据包的目标MC地址改成后端真实服务器的MAC地址(R-MAC)。真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负均器。
- 优点:负载均衡器只负责将请求包分发给后端节点服务器,而Rs将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
- 缺点:需要负载均衡器与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
3.IP隧道模式(VS-TUN)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求报文封装一层IP隧道(T-IP)转发到真实服务器(RS)。真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均器。
- 优点:负载均衡器只负责将请求包分发给后端节点服务器,而Rs将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
- 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持"IP Tunneling"
IP隧道模式——VPN技术,开通VPN,架设一条专属线路,通过公司内网和互联网进行互联
2.列举出LVS调度算法
- 轮询(Round Robin)
- 加权轮询(weighted Round Robin)
- 最少连接(Least Connections)
- 加权最少连接(weighted east Connections)
- 源地址哈希值(source hash)
3.LVS调度常见算法(均衡策略)
LVS常用的调度算法基本分为两类:固定调度算法、动态调度算法
3.1固定调度算法:rr,wrr,dh,sh
- rr:轮询算法,将请求依次分配给不同的rs节点,即RS节点中均摊分配。适合于RS所有节点处理性能接近的情况。
- wrr:加权轮训调度,依据不同RS的权值分配任务。权值较高的Rs将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。
- dh:目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得所需RS。
- sh:源地址哈看调度(source basbing)以源地址为关键字查找一个静态basb表来获得需要的RS
3.2动态调度算法:wlc,lc,lblc
- wlc:加权最小连接数调度,假设各台R的权值依次为Wi,当前tcp连接数依次为?1,依次去Ti/mi为最小的RS作为下一个分配的RS。
- lc:最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS
- 1blc:基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑
4.LVS三种工作模式区别
- NAT:通过网络地址转换实现的虚拟服务器,大并发访问时,调度器的性能成为瓶颈
- DR:使用路由技术实现虚拟服务器,节点服务器需要配置VIP,注意MAC地址广播
- TUN:通过隧道方式实现虚拟服务器。
一、IP隧道
- RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是说集群节点可以跨互联网实现。DIP, VIP, RIP可以是公网地址。
- RealServer的通道接口上需要配置VIP地址,以便接收DIP转发过来的数据包,以及作为响应的报文源IP。
- DIP转发给RealServer时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而RealServer响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP
- 请求报文要经由Director,但响应不经由Director,响应由RealServer自己完成
- 不支持端口映射
- RS的OS须支持隧道功能
一般来说,隧道模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。
二、直接路由
1.DR——直接路由概述
直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。
负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道直接路由,LVS默认模式,应用最广泛,通过请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
直接路由(DR)实际上是客户端访问虚拟地址 代理服务器和真实服务器都使用虚接口,把lo回环口 配虚接口 可以让用户访问同一个IP(也就是代理服务器和真实服务器的局域网)
2.DR模式特点
- Director和各RS都配置有VIP
- 确保前端路由器将目标IP为VIP的请求报文发往Director
- RS和Director要在同一个物理网络
- 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
- 不支持端口映射(端口不能修改)
- 无需开启 ip_forward
- RS可使用大多数OS系统
- 在前端网关做静态绑定VIP和Director的MAC地址
- 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
在RS上修改内核参数以限制arp通告及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore #忽略ARP广播 /proc/sys/net/ipv4/conf/all/arp_announce #无故ARP 不检测ARP
ARP(Address Resolution Protocol)地址解析协议,在封装报文的时候解决封装mac的问题;
RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
3.LVS工作模式总结和比较
NAT TUN DR 优点 端口转换 WAN 性能最好 缺点 性能瓶颈 服务器支持隧道模式 不支持跨网段 真实服务器要求 any Tunneling Non-arp device 支持网络 private(私网) LAN/WAN(私网/公网) LAN(私网) 真实服务器数量 low (10~20) High (100) High (100) 真实服务器网关 lvs内网地址 Own router(网工定义) Own router(网工定义) 4.直接路由原理
客户端访问外网地址12.0.0.100 12.0.0.100反馈数据给客户端
如果12.0.0.7直接反馈给客户端,客户端会丢弃数据报文
三、搭建LVS-DR模式
1.准备环境
Centos7-1作为LVS-DR代理服务器;Centos7-2和Centos7-3作为后端真实服务器;Centos7-4作为客户端
[root@localhost ~]#systemctl stop firewalld [root@localhost ~]#setenforce 0 setenforce: SELinux is disabled
[root@node2 ~]#systemctl stop firewalld [root@node2 ~]#setenforce 0
[root@node3 ~]#systemctl stop firewalld [root@node3 ~]#setenforce 0
[root@G ~]#systemctl stop firewalld [root@G ~]#setenforce 0
2.配置LVS-DR代理服务器
[root@localhost ~]#ifconfig ens33:0 192.168.241.111/32 #配置虚拟IP地址 [root@localhost ~]#ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:51:4b:b5 brd ff:ff:ff:ff:ff:ff inet 192.168.241.11/24 brd 192.168.241.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.241.111/0 brd 255.255.255.255 scope global ens33:0 valid_lft forever preferred_lft forever inet6 fe80::de6f:32c8:5a64:a6b2/64 scope link valid_lft forever preferred_lft forever 3: virbr0: mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:53:c1:45 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000 link/ether 52:54:00:53:c1:45 brd ff:ff:ff:ff:ff:ff [root@localhost ~]#vim /etc/sysctl.conf #调整/proc响应参数 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 [root@localhost ~]#sysctl -p #刷新配置 #调整/proc响应参数 对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能 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 [root@localhost ~]#modprobe ip_vs #加载ip_VS内核模块 ip_vs是内核模块的一个配置 是操作系统的一部分 modprobe是把ip_vs配置加载到进程中 [root@localhost ~]#cat /proc/net/ip_vs IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@localhost ~]#yum install ipvsadm.x86_64 -y [root@localhost ~]#ipvsadm-save > /etc/sysconfig/ipvsadm #保存设置 [root@localhost ~]#systemctl start ipvsadm.service [root@localhost ~]#systemctl status ipvsadm.service ● ipvsadm.service - Initialise the Linux Virtual Server Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; vendor preset: disabled) Active: active (exited) since 三 2024-03-06 14:32:38 CST; 5s ago Process: 6369 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.241.111:80 rr -> 192.168.241.22:80 Route 1 0 0 -> 192.168.241.23:80 Route 1 0 0 #添加真实服务器-a 指定VIP地址及TCP端口 -t 指定RIP地址及TCP端口 -r 指定DR模式 -g
ipvsadm不支持端口映射;如果是ipvsadm -a -t 192.168.241.111:80 -r 192.168.241.22:8080 -g最终还是显示80端口。
3.配置后端真实服务器
Centos7-2
[root@node2 ~]#yum install httpd -y [root@node2 ~]#ifconfig lo:0 192.168.241.111/32 [root@node2 ~]#ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 192.168.241.111/0 scope global lo:0 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:3e:a0:08 brd ff:ff:ff:ff:ff:ff inet 192.168.241.22/24 brd 192.168.241.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::d9cd:6857:3bdc:7454/64 scope link valid_lft forever preferred_lft forever 3: virbr0: mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:fe:22:f2 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000 link/ether 52:54:00:fe:22:f2 brd ff:ff:ff:ff:ff:ff [root@node2 ~]#systemctl start httpd [root@node2 ~]#systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2024-03-06 01:44:08 EST; 6s ago Docs: man:httpd(8) man:apachectl(8) Main PID: 6418 (httpd) Status: "Processing requests..." CGroup: /system.slice/httpd.service ├─6418 /usr/sbin/httpd -DFOREGROUND ├─6420 /usr/sbin/httpd -DFOREGROUND ├─6421 /usr/sbin/httpd -DFOREGROUND ├─6422 /usr/sbin/httpd -DFOREGROUND ├─6423 /usr/sbin/httpd -DFOREGROUND └─6424 /usr/sbin/httpd -DFOREGROUND Mar 06 01:43:38 node2.localdomain systemd[1]: Starting The Apache HTTP Se.... Mar 06 01:43:38 node2.localdomain httpd[6418]: AH00558: httpd: Could not r... Mar 06 01:44:08 node2.localdomain systemd[1]: Started The Apache HTTP Server. Hint: Some lines were ellipsized, use -l to show in full. [root@node2 ~]#vim /etc/sysctl.conf #添加系统只响应目的IP为本地IP的ARP请求 #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP [root@node2 ~]#sysctl -p 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 [root@node2 ~]#echo cxk > /var/www/html/index.html [root@node2 ~]#cat /var/www/html/index.html cxk
Centos7-3
[root@node3 ~]#yum install httpd -y [root@node3 ~]#ifconfig lo:0 192.168.241.111/32 [root@node3 ~]#ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 192.168.241.111/0 scope global lo:0 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:6b:71:15 brd ff:ff:ff:ff:ff:ff inet 192.168.241.23/24 brd 192.168.241.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::f11e:5019:be57:47b8/64 scope link valid_lft forever preferred_lft forever 3: virbr0: mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:9d:e9:ac brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000 link/ether 52:54:00:9d:e9:ac brd ff:ff:ff:ff:ff:ff [root@node3 ~]#systemctl start httpd [root@node3 ~]#systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since 三 2024-03-06 14:44:03 CST; 10s ago Docs: man:httpd(8) man:apachectl(8) Main PID: 2913 (httpd) Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec" CGroup: /system.slice/httpd.service ├─2913 /usr/sbin/httpd -DFOREGROUND ├─2923 /usr/sbin/httpd -DFOREGROUND ├─2924 /usr/sbin/httpd -DFOREGROUND ├─2925 /usr/sbin/httpd -DFOREGROUND ├─2926 /usr/sbin/httpd -DFOREGROUND └─2927 /usr/sbin/httpd -DFOREGROUND 3月 06 14:43:37 node3.node3 systemd[1]: Starting The Apache HTTP Server... 3月 06 14:44:03 node3.node3 systemd[1]: Started The Apache HTTP Server. [root@node3 ~]#vim /etc/sysctl.conf #添加系统只响应目的IP为本地IP的ARP请求 #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP [root@node3 ~]#sysctl -p 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 [root@node3 ~]#echo wyb > /var/www/html/index.html [root@node3 ~]#cat /var/www/html/index.html wyb
4.测试