【干货】lvs+keepalived集群架构服务
点击上方蓝字发现更多精彩
一,LVS功能详解
1.1 LVS(Linux Virtual Server)介绍
LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。
1.2 企业网站LVS集群架构图
1.3 IPVS软件工作层次图
从上图我们看出,LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(Linux Virtual Server)。我们使用该软件配置LVS时候,不能直接配置内核中的ipbs,而需要使用ipvs管理工具ipvsadm进行管理,或者通过Keepalived软件直接管理ipvs。
1.4 LVS体系结构与工作原理简单描述
LVS集群负载均衡器接受服务的所有入站客户端计算机请求,并根据调度算法决定哪个集群节点应该处理回复请求。负载均衡器(简称LB)有时也被称为LVS Director(简称Director)。
LVS虚拟服务器的体系结构如下图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在他们的前端有一个负载调度器(Load Balancer)。负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能,高可用的服务器一样。客户程序不受服务器集群的影响不需要作任何修改。系统的伸缩性通过在服务集群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。
1.5 LVS 基本工作过程图
LVS基本工作过程如下图所示:
为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表:
| 名称 | 缩写 | 说明 |
|---|---|---|
| 虚拟IP | VIP | VIP为Director用于向客户端计算机提供服务的IP地址。比如:www.yunjisuan.com域名就要解析到vip上提供服务 |
| 真实IP地址 | RIP | 在集群下面节点上使用的IP地址,物理IP地址 |
| Dirctor的IP地址 | DIP | Director用于连接内外网络的IP地址,物理网卡上的IP地址。是负载均衡器上的IP |
| 客户端主机IP地址 | CIP | 客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址 |
1.6 LVS集群的3种常见工作模式介绍与原理讲解
IP虚拟服务器软件IPVS
在分析VS/NAT 的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN(Virtual Server via IP Tunneling)和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),他们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术。淘宝开源的模式FULLNAT.
LVS的四种工作模式
NAT(Network Address Translation)
TUN(Tunneling)
DR(Direct Routing)
FULLNAT(Full Network Address Translation)
1.6.1 NAT模式-网络地址转换<==收费站模式(了解即可)
Virtual Server via Network Address Translation(VS/NAT)
调度时:目的IP改成RIP(DNAT)
返回时:源IP改成VIP(SNAT)
NAT模式特点小结:
只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信。
由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。
NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到RS节点的10.0.0.2:8080(DR和TUN模式不具备的)
所有NAT内部RS节点只需要配置私有LAN IP即可。
由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward=1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)。
1.6.2 TUN模式-(了解即可)
增加一个IP头部。通过IP隧道进行通信(可以跨网段找到RS节点)
TUN模式特点小结:
负载均衡器通过把请求的报文通过IP隧道的方式转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户。
由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定得系统开销。TUN模式适合LAN/WAN。
TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
所有的RS服务器都要绑定VIP,抑制ARP,配置复杂。
LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
1.6.3 DR模式-直接路由模式(重点)
Virtual Server via Direct Routing(VS/DR)
DR模式特点小结:
请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式相比)
当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单,易用,高效。日2000W PV或并发请求1万以下都可以考虑用haproxy/nginx(LVS NAT模式)
1.6.4 FULLNAT模式-(了解即可)
淘宝的LVS应用模式
FULLANT特点:
1,源IP改成不同的VIP和目的IP改成RIP
2,RS处理完毕返回时,返回给不同的LVS调度器
3,所有LVS调度器之间通过session表进行Client Address的共享
1.7 LVS的调度算法
LVS的调度算法决定了如何在集群节点之间分布工作负荷。
当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪个集群节点应该处理请求。Director调度器可用于做出该决定的调度方法分成两个基本类别:
固定调度方法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr,SED,NQ
10种调度算法见如下表格(rr,wrr,wlc重点):
| 算法 | 说明 |
|---|---|
| rr | 轮循调度,它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法简单,但是只适合于RS节点处理性能相差不大的情况 |
| wrr | 权重轮循,它将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数 |
| dh | 目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS |
| sh | 源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS |
| wlc | 加权最小连接数调度,实际连接数除以权值,最小的RS作为分配的RS |
| lc | 最小连接数调度,连接数最小的RS作为分配的RS |
| lblc | 基于地址的最小连接数调度,将来自同一目的地址的请求分配给同一台RS节点 |
| lblcr | 基于地址带重复最小连接数调度。(略) |
| SED | 最短的期望的延迟(不成熟) |
| NQ | 最小队列调度(不成熟) |
1.8 LVS的调度算法的生产环境选型
基本轮叫调度rr算法
加权最小连接调度wlc
加权轮叫调度wrr算法
实际使用中,这些算法的适用范围不限于这些。我们最好参考内核中的连接调度算法的实现原理,根据具体业务需求合理的选型。
1.9 LVS集群的特点
LVS集群的特点可以归结如下:
(1)功能:
实现三种IP负载均衡技术和10种连接调度算法的IPVS软件。在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相关的ICMP消息(有些商品化的系统反而不能)。虚拟服务的设置数目没有限制,每个虚拟服务都有自己的服务器集。它支持持久的虚拟服务(如HTTP Cookie 和HTTPS等需要该功能的支持),并提供详尽的统计数据,如连接的处理速率和报文的流量等。针对大规模拒绝服务(Deny of service)攻击,实现了三种防卫策略:有基于内容请求分发的应用层交换软件KTCPVS,它也是在Linux内核中实现。有相关的集群管理软件对资源进行检测,能及时将故障屏蔽,实现系统的高可用性。主,从调度器能周期性地进行状态同步,从而实现更高的可用性。
(2)适用性
1)后端真实服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix(如FreeBSD,Sun Solaris,HP Unix等),Mac/OS和windows NT/2000等。
2)负载均衡调度器LB能够支持绝大多数的TCP和UDP协议:
| 协议 | 内容 |
|---|---|
| TCP | HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等 |
| UDP | DNS,NTP,TCP,视频,音频流播放协议等 |
无需对客户机和服务作任何修改,可适用大多数Internet服务。
3)调度器本身当前不支持windows系统。支持大多数的Linux和UINIX系统。
(3)性能
LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s
(4)可靠性
LVS服务器集群软件已经在很多大型的,关键性的站点得到很好的应用,所以它的可靠性在真实应用得到很好的证实。
(5)软件许可证
LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,这意味着你可以得到软件的源代码,有权对其进行修改,但必须保证你的修改也是以GPL方式发行。
1.10 LVS的官方中文阅读资料
| 标题 | 地址 |
|---|---|
| LVS项目介绍 | http://www.linuxvirtualserver.org/zh/lvs1.html |
| LVS集群的体系结构 | http://www.linuxvirtualserver.org/zh/lvs2.html |
| LVS集群中的IP负载均衡技术 | http://www.linuxvirtualserver.org/zh/lvs3.html |
| LVS集群的负载调度 | http://www.linuxvirtualserver.org/zh/lvs4.html |
二,手动实现LVS的负载均衡功能(DR模式)
2.1 安装LVS软件
2.1.1 LVS应用场景说明
1)数据库及memcache等对内业务的负载均衡环境
| 管理IP地址 | 角色 | 备注 |
|---|---|---|
| 192.168.0.210 | LVS调度器(Director) | 对外提供服务的VIP为192.168.0.240 |
| 192.168.0.223 | RS1(真实服务器) | |
| 192.168.0.224 | RS2(真实服务器) |
特别提示:上面的环境为内部环境的负载均衡模式,即LVS服务是对内部业务的,如数据库及memcache等的负载均衡
2)web服务或web cache等负载均衡环境
| 外部IP地址 | 内部IP地址 | 角色 | 备注 |
|---|---|---|---|
| 192.168.200.210 | 192.168.0.210 | LVS调度器(Director) | 对外提供服务的VIP为192.168.0.240 |
| 192.168.200.223 | 192.168.0.223 | RS1(真实服务器) | |
| 192.168.200.224 | 192.168.0.224 | RS2(真实服务器) |
提示:
这个表格一般是提供Web或Web cache负载均衡的情况,此种情况特点为双网卡环境。这里把192.168.0.0/24假设为内网卡,192.168.200.0/24假设为外网卡。
2.1.2 实验一概述(同学们开始做)
| 内部IP(eth0) | 外部IP(eth1) | 角色 | 备注 |
|---|---|---|---|
| 192.168.0.210 | 无 | LVS负载均衡器 | VIP:192.168.0.240网关为:192.168.0.100 |
| 192.168.0.223 | 无 | Web01节点 | 网关为:192.168.0.100 |
| 192.168.0.224 | 无 | Web02节点 | 网关为:192.168.0.100 |
| 192.168.0.220 | 无 | 内网客户端 | 网关为:192.168.0.100 |
| 无 | 192.168.200.200 | 外网客户端 | 不配网关 |
| 192.168.0.100 | 192.168.200.100 | 网关型防火墙 | 双网卡均无网关 |
2.1.3 两台Web配置简单的http服务
为了方便,我们可以用yum简单装一个apache提供httpd服务进行测试,过程略。
2.1.4 开始安装LVS
以下的安装都是在LVS LB 192.168.0.210上
1)下载相关软件包
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz # <===适合5.x系统wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz # <===适合6.x系统
2)安装准备命令
[][]2.6.32-431.el6.x86_64[]CentOS release 6.5 (Final)[][]drwxr-xr-x. 2 root root 4096 Aug 9 19:28 /usr/src/kernels/2.6.32-431.el6.x86_64/[][]drwxr-xr-x. 2 root root 4096 Aug 9 19:28 /usr/src/linux/[]total 8drwxr-xr-x. 2 root root 4096 Sep 23 2011 debugdrwxr-xr-x. 3 root root 4096 Aug 9 19:28 kernelslrwxrwxrwx. 1 root root 39 Aug 9 19:28 linux -> /usr/src/kernels/2.6.32-431.el6.x86_64/[]
特别注意:
此ln命令的链接路径要和uname -r输出结果内核版本对应,工作中如果做安装虚拟化可能有多个内核路径
如果没有/usr/src/kernels/2.6.32-431.el6.x86_64/路径,很可能是因为缺少kernel-devel软件包。可通过yum进行安装
centos5.x版本不能用ipvs1.26
3)安装lvs命令:
[][][][][]/sbin/ipvsadm[]IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn[]ip_vs 125220 0libcrc32c 1246 1 ip_vsipv6 317340 270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
LVS安装小结:
1,CentOS5.X安装lvs,使用1.24版本。
2,CentOS6.X安装lvs,使用1.26版本。
3,安装lvs后,要执行ipvsadm把ip_vs模块加载到内核。
2.2 手动配置LVS负载均衡服务
2.2.1 手工添加lvs转发
(1)配置LVS虚拟IP(VIP)
[root@lvs01 ~]# ifconfig eth0:0 192.168.0.240 broadcast 192.168.0.240 netmask 255.255.255.0 up[root@lvs01 ~]# ifconfig eth0:0eth0:0 Link encap:Ethernet HWaddr 00:0C:29:D5:7F:9Dinet addr:192.168.0.240 Bcast:192.168.0.240 Mask:255.255.255.255UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
(2)手工执行配置添加LVS服务并增加两台RS
[root@lvs01 ~]# ipvsadm -C #清空ipvs历史设置[root@lvs01 ~]# ipvsadm --set 30 5 60 #设置超时时间(tcp tcpfin udp)[root@lvs01 ~]# ipvsadm -A -t 192.168.0.240:80 -s rr -p 20#说明:-A:添加一个虚拟路由主机(LB)-t:指定虚拟路由主机的VIP地址和监听端口-s:指定负载均衡算法-p:指定会话保持时间[root@lvs01 ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.223:80 -g -w 1[root@lvs01 ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.224:80 -g -w 1#说明:-a:添加RS节点-t:指定虚拟路由主机的VIP地址和监听端口-r:指定RS节点的RIP地址和监听端口-g:指定DR模式-w:指定权值(3)查看lvs配置结果[root@lvs01 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.0.240:80 rr persistent 20-> 192.168.0.223:80 Route 1 0 0-> 192.168.0.224:80 Route 1 0 0
(4)ipvs配置删除方法
[][]此时,可以打开浏览器访问http://192.168.0.240体验结果,如果没意外,是无法访问的。(RS将包丢弃了)
2.2.2 手工在RS端绑定
[][]lo:0 Link encap:Local Loopbackinet addr:192.168.0.240 Mask:0.0.0.0UP LOOPBACK RUNNING MTU:16436 Metric:1[][]lo:0 Link encap:Local Loopbackinet addr:192.168.0.240 Mask:0.0.0.0UP LOOPBACK RUNNING MTU:16436 Metric:1
2.2.3 浏览器测试LVS转发效果
注意:
在测试时候你会发现刷新看的都是同一个RS节点
这是因为浏览器的缓存问题
等一段时间以后,刷新就会重新负载均衡到新RS节点了
2.2.4 关于DR模式RS节点的ARP抑制的问题
因为在DR模式下,RS节点和LVS同处一个局域网网段内。
LVS和节点都会接收到ARP广播并且LVS和节点都绑定了192.168.0.240这个VIP,所以都会去响应网关的这个广播,导致冲突现象。
因此,我们需要对RS节点做抑制ARP广播的措施。
[root ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore[root ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce[root ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore[root ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
2.2.5 配置网关型防火墙
防火墙的双网卡都不要设置网关,因为自己的就网关
[root@localhost ~]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWNlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 #内网网卡link/ether 00:0c:29:ee:d3:15 brd ff:ff:ff:ff:ff:ffinet 192.168.0.100/24 brd 192.168.0.255 scope global eth0inet6 fe80::20c:29ff:feee:d315/64 scope linkvalid_lft forever preferred_lft forever3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 #外网网卡link/ether 00:0c:29:ee:d3:1f brd ff:ff:ff:ff:ff:ffinet 192.168.200.100/24 brd 192.168.200.255 scope global eth1inet6 fe80::20c:29ff:feee:d31f/64 scope linkvalid_lft forever preferred_lft forever[root@localhost ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1#防火墙不需要配置网关,因此没有默认路由信息[root@localhost ~]# head /etc/sysctl.conf #开启网卡路由转发# Kernel sysctl configuration file for Red Hat Linux## For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and# sysctl.conf(5) for more details.# Controls IP packet forwardingnet.ipv4.ip_forward = 1 #修改为1# Controls source route verificationnet.ipv4.conf.default.rp_filter = 1[root@localhost ~]# sysctl -p #让配置即刻生效net.ipv4.ip_forward = 1net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.default.accept_source_route = 0kernel.sysrq = 0kernel.core_uses_pid = 1net.ipv4.tcp_syncookies = 1error: "net.bridge.bridge-nf-call-ip6tables" is an unknown keyerror: "net.bridge.bridge-nf-call-iptables" is an unknown keyerror: "net.bridge.bridge-nf-call-arptables" is an unknown keykernel.msgmnb = 65536kernel.msgmax = 65536kernel.shmmax = 68719476736kernel.shmall = 4294967296
特别提示:
Web01,Web02,LVS负载均衡器,以及内网客户端均将网关设置成网关型防火墙的eth0:192.168.0.100
2.2.6 配置内网客户端
内网客户端用于模拟lvs应用于内网的负载均衡情况
比如lvs数据库读负载均衡,比如lvs memcached缓存组负载均衡
由于这类型的负载均衡请求都是由内网服务器发起,因此用内网客户端来模拟
#内网客户端访问测试root@LanClient ~]# hostname -I192.168.0.220 #内网客户端IP[root@LanClient ~]# route -n #默认路由为网关防火墙Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth00.0.0.0 192.168.0.100 0.0.0.0 UG 0 0 0 eth0[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs#从上面可以看出,内网客户端模拟访问lvs负载均衡器,成功!
2.2.7 配置外网客户端
外网客户端模拟的是lvs转发外网用户访问需求给RS节点处理的情况
模拟外网客户端,要求客户端不能配置任何网关
由于外网客户端要访问内网的LVS需要经过网关防火墙的跳转,因此需要在防火墙服务器上做iptables的DNAT和SNAT,配置如下:
[root@GATEWAY ~]# hostname -I192.168.0.100(内网网卡) 192.168.200.100(外网网卡)[root@GATEWAY ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1[root@GATEWAY ~]# iptables -t nat -A PREROUTING -i eth1 -d 192.168.200.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.240[root@GATEWAY ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 192.168.200.100[root@GATEWAY ~]# iptables -t nat -L -nvChain PREROUTING (policy ACCEPT 25 packets, 5251 bytes)pkts bytes target prot opt in out source destination32 1920 DNAT tcp -- eth1 * 0.0.0.0/0 192.168.200.100 tcp dpt:80 to:192.168.0.240Chain POSTROUTING (policy ACCEPT 53 packets, 3208 bytes)pkts bytes target prot opt in out source destination0 0 SNAT all -- * eth1 192.168.0.0/24 0.0.0.0/0 to:192.168.200.100Chain OUTPUT (policy ACCEPT 22 packets, 1348 bytes)pkts bytes target prot opt in out source destination[root@GATEWAY ~]#
进行外网客户端访问LVS负载均衡器测试
特别提示:
由于浏览器缓存及LVS默认会话保持等影响,个人简单的测试切换RS的几率要很多次并且间隔一定时间访问才行。尽可能关闭浏览器换不同的客户端IP来测试,效果更明显一些。用单机测试是有这种情况(负载均衡的算法倾向于一个客户端IP定向到一个后端服务器,以保持会话连贯性),如果用两三台机器去测试也许就不一样。
在测试访问的同时可以通过ipvsadm -Lnc来查看访问结果,如下所示:
[root@lvs01 network-scripts]# ipvsadm -lncIPVS connection entriespro expire state source virtual destinationTCP 01:41 FIN_WAIT 192.168.0.220:59805 192.168.0.240:80 192.168.0.224:80TCP 01:40 FIN_WAIT 192.168.0.220:59803 192.168.0.240:80 192.168.0.224:80TCP 01:50 FIN_WAIT 192.168.200.200:34926 192.168.0.240:80 192.168.0.223:80TCP 01:41 FIN_WAIT 192.168.0.220:59804 192.168.0.240:80 192.168.0.223:80TCP 01:50 FIN_WAIT 192.168.200.200:34925 192.168.0.240:80 192.168.0.224:80TCP 01:41 FIN_WAIT 192.168.0.220:59806 192.168.0.240:80 192.168.0.223:80TCP 01:40 FIN_WAIT 192.168.0.220:59802 192.168.0.240:80 192.168.0.223:80TCP 01:51 FIN_WAIT 192.168.200.200:34927 192.168.0.240:80 192.168.0.224:80
2.3 arp抑制技术参数说明
4-7:保留未使用
2.4 开发脚本配置LVS负载均衡器端
2.4.1 LVS负载均衡器端自动配置脚本:
[root@lvs01 scripts]# cat ipvs_server.sh# author:Mr.chen#LVS scripts. /etc/init.d/functionsVIP=192.168.0.240SUBNET="eth0:`echo $VIP | awk -F "." '{print $4}'`"PORT=80RIP=(192.168.0.223192.168.0.224)function start(){if [ `ifconfig | grep $VIP | wc -l` -ne 0 ];thenstopfiifconfig $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 upipvsadm -Cipvsadm --set 30 5 60ipvsadm -A -t $VIP:$PORT -s rr -p 20for ((i=0;i<${#RIP[*]};i++))doipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1done}function stop(){ipvsadm -Cif [ `ifconfig | grep $VIP | wc -l` -ne 0 ];thenifconfig $SUBNET downfiroute del -host $VIP dev eth0 &>/dev/null}case "$1" instart)startecho "ipvs is started";;stop)stopecho "ipvs is stopped";;restart)stopecho "ipvs is stopped"startecho "ipvs is started";;*)echo "USAGE:$0 {start | stop | restart}"esac
2.4.2 RS节点Web服务器端自动配置脚本
[root@web01 scripts]# cat rs_server.sh# author:Mr.chen# RS_sever scripts. /etc/rc.d/init.d/functionsVIP=192.168.0.240case "$1" instart)echo "start LVS of REALServer IP"interface="lo:`echo $VIP | awk -F "." '{print $4}'`"/sbin/ifconfig $interface $VIP broadcast $VIP netmask 255.255.255.255 uproute add -host $VIP dev $interfaceecho "1" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/lo/arp_announceecho "1" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/all/arp_announce;;stop)interface="lo:`echo $VIP | awk -F "." '{print $4}'`"/sbin/ifconfig $interface downecho "STOP LVS of REALServer IP"echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" > /proc/sys/net/ipv4/conf/lo/arp_announceecho "0" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" > /proc/sys/net/ipv4/conf/all/arp_announce;;*)echo "Usage: $0 {start|stop}"exit 1esac
三,企业LVS负载均衡高可用最优方案(LVS+Keepalived)
3.1 实验二概述(同学们开始做)
| 内部IP(eth0) | 外部IP(eth1) | 角色 | 备注 |
|---|---|---|---|
| 192.168.0.210 | 无 | LVS负载均衡器(主) | VIP:192.168.0.240 |
| 192.168.0.211 | 无 | LVS负载均衡器(备) | VIP:192.168.0.240 |
| 192.168.0.223 | 无 | Web01节点 | |
| 192.168.0.224 | 无 | Web02节点 | |
| 192.168.0.220 | 无 | 内网客户端 |
3.2 LVS负载均衡器主和备安装LVS软件
过程略
3.3 两台Web服务器安装Web服务
过程略
3.4 LVS负载均衡器主和备安装Keepalived软件
[]
3.5 仅实现LVS负载均衡器主和备的keepalived高可用功能
LVS负载均衡器主的keepalived配置文件内容如下
~]# sed -n '1,30p' /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {[email protected]}notification_email_from yunjisuansmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS01}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 55priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {dev eth0 label eth0:240}}
LVS负载均衡器主的keepalived配置文件内容如下
~]# sed -n '1,30p' /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {[email protected]}notification_email_from yunjisuansmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS02}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 55priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {dev eth0 label eth0:240}}
3.6 添加LVS的负载均衡规则
以下操作过程,在LVS主和备上完全一样
[root@localhost ~]# ipvsadm -C[root@localhost ~]# ipvsadm -A -t 192.168.0.240:80 -s rr[root@localhost ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.223:80 -g -w 1[root@localhost ~]# ipvsadm -a -t 192.168.0.240:80 -r 192.168.0.224:80 -g -w 1[root@localhost ~]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.0.240:80 rr persistent 20-> 192.168.0.223:80 Route 1 0 0-> 192.168.0.224:80 Route 1 0 03.7 启动LVS主和备的keepalived服务#在LVS主上[root@lvs01 ~]# /etc/init.d/keepalived start[root@lvs01 ~]# ifconfigeth0 Link encap:Ethernet HWaddr 00:0C:29:D5:7F:9Dinet addr:192.168.0.210 Bcast:192.168.0.255 Mask:255.255.255.0inet6 addr: fe80::20c:29ff:fed5:7f9d/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:23567 errors:0 dropped:0 overruns:0 frame:0TX packets:14635 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:2008524 (1.9 MiB) TX bytes:1746298 (1.6 MiB)eth0:240 Link encap:Ethernet HWaddr 00:0C:29:D5:7F:9Dinet addr:192.168.0.240 Bcast:0.0.0.0 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:16436 Metric:1RX packets:769 errors:0 dropped:0 overruns:0 frame:0TX packets:769 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:56636 (55.3 KiB) TX bytes:56636 (55.3 KiB)#在LVS副上[root@localhost ~]# /etc/init.d/keepalived start[root@localhost ~]# ifconfigeth0 Link encap:Ethernet HWaddr 00:0C:29:E7:06:1Dinet addr:192.168.0.211 Bcast:192.168.0.255 Mask:255.255.255.0inet6 addr: fe80::20c:29ff:fee7:61d/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:14109 errors:0 dropped:0 overruns:0 frame:0TX packets:4902 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:12683754 (12.0 MiB) TX bytes:553207 (540.2 KiB)lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:16436 Metric:1RX packets:155 errors:0 dropped:0 overruns:0 frame:0TX packets:155 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:11283 (11.0 KiB) TX bytes:11283 (11.0 KiB)#如果LVS副上没有VIP就对了。如果主副都有,那么请检查防火墙是否开启状态3.8 内网客户端进行访问测试#在内网客户端上进行访问测试[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs#在LVS主上进行访问连接查询[root@lvs01 ~]# ipvsadm -LncIPVS connection entriespro expire state source virtual destinationTCP 00:01 FIN_WAIT 192.168.0.220:59887 192.168.0.240:80 192.168.0.223:80TCP 00:01 FIN_WAIT 192.168.0.220:59889 192.168.0.240:80 192.168.0.223:80TCP 00:01 FIN_WAIT 192.168.0.220:59888 192.168.0.240:80 192.168.0.224:80TCP 00:00 FIN_WAIT 192.168.0.220:59886 192.168.0.240:80 192.168.0.224:80#在LVS主上停掉keepalived服务[root@lvs01 ~]# /etc/init.d/keepalived stopStopping keepalived: [ OK ][root@lvs01 ~]# ifconfig | grep eth0:240#在LVS副上查看VIP[root@localhost ~]# ip a | grep eth0:240inet 192.168.0.240/24 scope global secondary eth0:240#再次在内网客户端上进行访问测试[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.224 bbs[root@LanClient ~]# curl 192.168.0.240192.168.0.223 bbs#在LVS副上进行访问连接查询[root@localhost ~]# ipvsadm -LncIPVS connection entriespro expire state source virtual destinationTCP 01:47 FIN_WAIT 192.168.0.220:59900 192.168.0.240:80 192.168.0.223:80TCP 01:09 FIN_WAIT 192.168.0.220:59891 192.168.0.240:80 192.168.0.224:80TCP 01:48 FIN_WAIT 192.168.0.220:59902 192.168.0.240:80 192.168.0.223:80TCP 01:09 FIN_WAIT 192.168.0.220:59892 192.168.0.240:80 192.168.0.224:80TCP 01:14 FIN_WAIT 192.168.0.220:59896 192.168.0.240:80 192.168.0.224:80TCP 01:10 FIN_WAIT 192.168.0.220:59894 192.168.0.240:80 192.168.0.224:80#开启LVS主上的keepalived服务[root@lvs01 ~]# /etc/init.d/keepalived start[root@lvs01 ~]# ip a | grep eth0:240inet 192.168.0.240/24 scope global secondary eth0:240#查看LVS副上VIP资源是否释放[root@localhost ~]# ip a | grep eth0:240[root@localhost ~]#
综上,至此基于LVS的keepalived高可用功能实验完毕
3.9 通过Keepalived对LVS进行管理的功能实现
~]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {[email protected]}notification_email_from yunjisuansmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS01}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 55priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {dev eth0 label eth0:240}}virtual_server 192.168.0.240 80 { #虚拟主机VIPdelay_loop 6 #lb_algo rr #算法lb_kind DR #模式nat_mask 255.255.255.0 #掩码# persistence_timeout 50 #会话保持protocol TCP #协议real_server 192.168.0.223 80 { #RS节点weight 1 #权重TCP_CHECK { #节点健康检查connect_timeout 8 #延迟超时时间nb_get_retry 3 #重试次数delay_before_retry 3 #延迟重试次数connect_port 80 #利用80端口检查}}real_server 192.168.0.224 80 { #RS节点weight 1TCP_CHECK {connect_timeout 8nb_get_retry 3delay_before_retry 3connect_port 80}}}以上keepalived配置文件在LVS主和备上都进行修改。-C清除之前设置的规则重新启动keepalived服务进行测试,操作过程如下:~]# /etc/init.d/keepalived stop #关闭主LVS的keepalived服务Stopping keepalived: [ OK ]~]# ipvsadm -Ln #没有ipvs规则IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler FlagsRemoteAddress:Port Forward Weight ActiveConn InActConn~]# ip a | grep 240 #没有VIP~]# /etc/init.d/keepalived start #启动keepalived服务Starting keepalived: [ OK ]~]# ipvsadm -Ln #出现ipvs规则IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler FlagsRemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.0.240:80 rr192.168.0.223:80 Route 1 0 0192.168.0.224:80 Route 1 0 0~]# ip a | grep 240 #出现VIPinet 192.168.0.240/24 scope global secondary eth0:240附录:LVS集群分发请求RS不均衡生产环境实战解决-L -n 发现两台RS的负载不均衡,一台有很多请求,一台没有。并且没有请求的那台RS经测试服务正常,lo:VIP也有。但是就是没有请求。IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler FlagsRemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.0.240:80 rr persistent 10192.168.0.223:80 Route 1 0 0192.168.0.224:80 Route 1 8 12758
问题原因:
persistent 10的原因,persistent会话保持,当clientA访问网站的时候,LVS把请求分发给了52,那么以后clientA再点击的其他操作其他请求,也会发送给52这台机器。
解决办法:
到keepalived中注释掉persistent 10 然后/etc/init.d/keepalived reload,然后可以看到以后负载均衡两边都均衡了。
其他导致负载不均衡的原因可能有:
LVS自身的会话保持参数设置(-p 300,persistent 300)。优化:大公司尽量用cookies替代session
LVS调度算法设置,例如:rr,wrr,wlc,lc算法
后端RS节点的会话保持参数,例如:apache的keepalive参数
访问量较少的情况,不均衡的现象更加明显
用户发送得请求时间长短,和请求资源多少大小。
--End--
推荐阅读
https://www.cnblogs.com/chensiqiqi/p/9162943.html
