Loading... <blockquote>在本博客中,”LVS”是一个系列文章,LVS系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/lvs/" target="_blank" rel="noopener">LVS专题系列</a> 这篇文章中的知识点是建立在前文的基础上的,如果你还没有掌握前文中的知识,请先参考之前的文章,否则在阅读时 有可能会遇到障碍。</blockquote> 话接上文,LVS由两部分组成,ipvs与ipvsadm,ipvs是LVS的核心实现,但是我们不能直接操作ipvs,我们需要借助管理工具ipvsadm定义LVS集群规则,ipvs再根据我们定义好的规则进行工作。 所以,如果想要定义LVS,则必须先学会怎样使用ipvsadm命令。 但是如果在没有任何应用场景的情况下,直接解释ipvsadm命令,反而不太具象化,所以此处假设,我们想要配置一个LVS-NAT集群,在我们想要配置LVS-NAT集群的情况下,我们应该怎样使用ipvsadm命令呢?此处给出一个使用示例,根据这个命令示例来解释ipvsadm。 如果我们想要配置一个LVS-NAT集群,可以在角色为调度器的主机上执行如下ipvsadm命令。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ipvsadm -A -t VIP:port -s rr</span></div> </div> <div class=""> <div><span class="enlighter-text">ipvsadm -a -t VIP:port -r RIP1 -m</span></div> </div> <div class=""> <div><span class="enlighter-text">ipvsadm -a -t VIP:port -r RIP2 -m</span></div> </div> <div class=""> <div><span class="enlighter-text">ipvsadm -a -t VIP:port -r RIPN -m</span></div> </div> </div> </div> 如上例所示,我们执行了多条ipvsadm命令。 第一条命令为”ipvsadm -A -t VIP:port -s rr”,这条命令什么意思呢? 这条命令表示,创建一个LVS集群服务,这个服务为tcp协议的服务,集群服务的IP为VIP,端口号为port,使用rr算法(轮询算法)分发请求到后端的RealServer中。 -A选项表示添加一条虚拟服务器记录,即创建一个LVS集群。 -t选项表示创建LVS集群服务为tcp服务,”VIP:port”表示集群服务于的IP与端口号。 -s选项为Scheduling(调度)之意,用于指定具体的调度算法,可用算法有 rr 、wrr 、lc 、wlc 、lblc 、lblcr 、dh 、sh 、sed 、nq ,而rr算法就是Round-Robin的缩写,表示轮询算法。 好了,我觉得你应该理解了,其实上述命令就是创建了一个LVS集群服务,并且设置了服务的具体IP与端口号以及调度算法等属性。 但是只完成上述工作还不行,我们还需要为LVS集群添加后端主机,添加后端主机的命令如下: ipvsadm -a -t VIP:port -r RIP1 -m 上述命令表示为集群添加一个RealServer。 因为我们已经使用第一条命令创建了一个服务于”VIP:port”的tcp服务集群,所以,我们在添加RealServer时,要指定将RealServer到哪个集群中。 -a选项表示添加一个RealServer到集群中。 -t选项表示LVS集群服务为tcp服务,”VIP:port”表示集群服务于的IP与端口号。 -r选项用于指定将要添加的Realserver的IP地址。 -m选项表示LVS集群的工作模式为LVS-NAT模式,当然,如果想要LVS工作于其他模式,那么在添加Realserver时,则不能使用-m选项,而需使用其他对应选项。 如果有多台RealServer需要添加到LVS-NAT模型中,那么只要将命令中的RIP替换为具体的RealserverIP即可。 使用上述命令与选项,即可简单的配置出一个LVS-NAT集群。 当然,上述选项并不是常用选项的全部,但是本着”用到再说”的原则,我们先了解到这里,以方便我们入门。 规则配置完成了,如果我们想要查看当前的LVS配置,应该怎样办呢? ipvsadm命令与iptables命令非常相似,使用-L选项即可查看LVS规则,-L为List之意,使用-L与使用-l(小写L)等效,示例如下。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ipvsadm -L</span></div> </div> <div class=""> <div><span class="enlighter-text">ipvsadm -l</span></div> </div> </div> </div> 与iptables命令相同,当查看规则时,ipvsadm默认会对IP地址与端口号进行解析,如果不想对IP与端口进行解析,可以使用-n选项,所以说,如果你已经对iptables命令非常熟悉,那么搞定ipvsadm命令简直不要太简单,但是需要注意,当使用ipvsadm命令查看规则定义并且使用-n选项时,-n选项要放在-L选项的后面,示例如下。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ipvsadm -l -n</span></div> </div> <div class=""> <div><span class="enlighter-text">ipvsadm -Ln</span></div> </div> </div> </div> 好了,站在前文的基础上,理解上述命令,应该不难,如果正确的设置了环境,并且正确的配置了LVS规则,那么LVS集群应该就能正常工作了,但是,需要注意是,当服务器重启时,如果没有将提前设置好的LVS集群规则保存,那么在服务器重启以后,LVS集群设置将会消失,所以,我们需要将定义好的ipvs规则保存,以便重启后能够重载这些规则。 在centos6中,可以使用service ipvsadm save命令保存LVS规则,此命令会将LVS规则保存在/etc/sysconfig/ipvsadm文件中。 当重启后,可以使用service ipvsadm reload命令重新载入LVS规则。 除了使用上述方法,还能够使用如下方法,将LVS规则保存于指定的文件中,比如保存LVS规则到 /testdir/lvsrules文件中。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ipvsadm -S </span><span class="enlighter-g1">></span><span class="enlighter-text"> /testdir/lvsrules</span></div> </div> </div> </div> -S选项为Save之意,即保存LVS规则,当使用ipvsadm -S命令时,会输出LVS规则到标准输出中,所以利用重定向,可以将LVS规则保存于指定文件。 同理,我们可以从指定的文件中重新载入对应的LVS规则,以便重启后能够正常使用之前定义的LVS集群,对应重载规则命令如下。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ipvsadm -R </span><span class="enlighter-g1"><</span><span class="enlighter-text"> /testdir/lvsrules</span></div> </div> </div> </div> -R选项为Reload之意,即重载LVS规则,重载规则时需要利用重定向,将规则载入。 centos7中,可以使用-S选项或者-R选项进行LVS规则保存或重载。 说了这么多,我觉得我们应该动动手了,有了前文中LVS-NAT的知识作为基础 <h2>环境准备</h2> 首先,我们准备了4台虚拟机,分别扮演客户端、LVS服务器、RealServer1、RealServer2 LVS服务器上配置了两块网卡,分别配置VIP与DIP RealServer1与RealServer2的IP分别为RIP1与RIP2,同时,需要将两个RealServer的网关指向DIP。 为了尽量的模拟内部网络,我们在vmware虚拟机中创建了一个仅主机模式的虚拟网络,虚拟网络的网段为10.1.0.0/16,而DIP、RIP1、RIP2都属于这个网段。 由于我们没有真正的外网IP,所以此处使用192.168.1.198这个私网IP地址模拟公网VIP。 DIP为10.1.0.8 RIP1为10.1.0.11 RIP2为10.1.0.12 如果想要组建LVS集群,则需要保证集群内的主机的时间是同步的,通常需要配置时间服务器,此处省略此步骤。 首先,我们创建一个虚拟网络,尽量模拟内网环境。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS1.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS1.png" style=""> 下图中的vmnet6是我创建的一个”仅主机模式”的虚拟网络 ,我们用此网络模拟内网环境,你也可以点击”更改设置”按钮,创建一个新的仅主机模式的虚拟网络 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS2.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS2.png" style=""> 扮演调度器的服务器上配置了两块网卡,网卡1为桥接模式,为VIP所在网卡,网卡2为仅主机模式(VMnet6),为DIP所在网卡。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS3.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS3.png" style=""> 如下图所示,VIP为192.168.1.198,DIP为10.1.0.8 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS4.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS4.png" style=""> 同时,将两个RealServer的网卡设置在这个”仅主机模式”的虚拟网络中。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS5.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS5.png" style=""> RealServer1的IP为10.1.0.11,RealServer1的网关为LVS调度器的DIP,也就是10.1.0.8,如下图所示 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS6.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS6.png" style=""> RealServer2的配置同RealServer1,只是RIP2为10.1.0.12 ,如下图所示 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS7.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS7.png" style=""> 假设我们的LVS集群提供的是Http服务,此处,为两台RealServer安装httpd,同时设置默认访问页面index.html <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS8.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS8.png" style=""> 为了使负载效果更加明显,此处故意将RealServer1与RealServer2的默认主页的内容设置为不同内容,以显示负载效果,但是在实际场景中,所有RealServer中的资源应该完全相同,以便不管任何RealServer响应客户端,客户端得到的内容都是相同的,因为LVS集群对于客户端来说,应该是透明的。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS9.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS9.png" style=""> 同时,为了让客户端、调度器、Realserver之间能够正常通讯,此刻清空各个测试机中的防火墙规则,以便在实验过程中排除干扰因素。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS10.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS10.png" style=""> 好了,完成 上述配置后,基本环境已经配置完毕,剩下的操作就需要在调度器上进行了。 <h2>LVS-NAT配置</h2> 其实,只要基础环境准备完毕,配置LVS-NAT还是很简单的,因为我们在介绍ipvsadm命令时,已经将基本的配置描述的差不多了,现在我们来实践一下。 首先,我们如果想要在调度器上配置LVS集群规则,则需要先安装ipvsadm命令。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS11.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS11.png" style=""> ipvsadm安装完成后,即可开始配置LVS集群规则,但是,如果想要LVS集群能够正常工作,则需要为调度器开启内核的核心转发功能,因为调度器主要负责分发请求到后端主机,所以它需要转发报文,没错,如果你看过本博客中iptables系列的相关文章,你一定知道,我们需要将ip_foward的值设置为1,才能够转发报文到别的主机,此处为了演示方便,使用”临时生效”的方法,开启调度器主机的核心转发功能,实际应用中最好使用”永久生效”的方法进行设置。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS12.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS12.png" style=""> 关于ip_forward的相关设置,此处不再赘述,如果你对ip_forward的相关设置还不太了解,可以参考如下文章。 <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/archives/1663" target="_blank"><i data-feather="external-link"></i>https://www.zsythink.net/archives/1663</a></span> 开启调度器主机的核心转发功能之后,即可在调度器主机上定义集群规则了,根据实验环境配置如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS13.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS13.png" style=""> 上述命令我们已经解释过,上述命令表示: 定义一个tcp服务的LVS集群,集群服务的IP为192.168.1.198,端口为80,使用轮询算法将请求发往后端主机。 我们在刚才定义的LVS集群中添加了两个后端主机,两个RealServer的IP分别为10.1.0.11与10.1.0.12,在定义后端主机的同时,定义了LVS集群的工作模式为LVS-NAT模式。 完成上述配置后,我们可以查看一下刚才配置的集群服务,LVS-NAT集群已经配置完毕。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS14.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS14.png" style=""> 为了能够在重启后,继续使用刚才定义的LVS-NAT规则,此处对LVS集群定义进行保存。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS15.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS15.png" style=""> 集群规则配置完毕后,我们就可以进行测试了,看看LVS-NAT集群是否能够按照我们所想,分发请求到后端主机。 我们通过客户端主机,访问VIP的80端口。 如下图所示,每次访问的响应内容都是由不同的RealServer返回的,因为我们使用了rr轮询算法,所以后端主机轮流对客户端进行响应。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS16.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS16.png" style=""> 注意,在测试LVS-NAT集群效果时,我们使用了curl命令,如果你使用浏览器进行测试,可能会受缓存的影响,从而不能直观的看到轮询算法的效果,如果你使用浏览器进行效果测试,可以在每次测试时打开新的浏览器页签进行访问,以便更加明显的看到效果。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS17.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/071517_0819_LVS2LVS17.png" style=""> 可见,我们配置的LVS-NAT集群已经可有正常工作了。 但是,聪明如你肯定想到了一些潜在的问题,比如,如果我们提供的服务中需要用到Session,那么当来自同一个客户端的请求被发往不同的后端主机时,跟Session有关的操作就会出现问题,同理,如果客户端可以上传图片,删除图片,那么,后端主机是否需要实时同步这些资源或者使用共享存储呢?这些问题是所有负载均衡架构都要考虑的问题,我们暂时先不考虑那么多,此处我们的重点是先初步的了解LVS-NAT模型,我们已经做到了。 好了,这篇文章就暂时写到这里,希望能够对你有所帮助~常来捧场呦~~帮忙推荐呦~~亲~~~ 转载自朱双印日志https://www.zsythink.net/archives/2185 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏