负载均衡集群介绍、 LVS介绍、 LVS调度算法、 LVS NAT模式搭建

阅读:433 2019-03-19 14:43:58 来源:新网

负载均衡集群介绍1.1负载均衡介绍主流开源软件有lvs、keepalived、haproxy、nginx等.前面讲到keepalived是实现高可用,其实keepalived还可以实现负载均衡.其中lvs属于4层,指的是(网络osi7层模型),nginx属于7层,所以说这两种负载均衡有本质的区别.haproxy既可以认为是4层,也可以当做是7层使用.keepalived的负载均衡功能其实就是lvs,keepalived负载均衡是内置的。通常有人说keepalived+lvs,实际上仅仅就一个keepalived而已.至于4层和7层有这样本质的区别,比如lvs这种四层,它可以分发tcp的这种协议,还可以分发除了80端口外的其他端口通信.如果做mysql的负载均衡,是可以使用lvs去实现的,nginx就不支持了.而nginx仅仅支持http、https、mail、haproxy(haproxy也支持mysql负载均衡nginx7层有一定的限制,但有更高级的功能,比如说nginx可以根据目录,一个网站下面可以去访问二级目录&三级目录,可以根据目录去区分后端真正的服务器,那么nginx可以做到.但是lvs呢就不做到,lvs没有那么智能,它仅仅是一个4层,4层的话是一个tcpip的一个数据包分发和转发,对于数据包里面有什么域名或者是主机头之类的,它不关心.相比较来说,lvs这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求.lvs介绍1.1lvs介绍lvs是由国人章文嵩开发,章文嵩是一位博士,lvs是世界知名的一个软件,流行度不亚于apache的httpd,基于tcp/ip做的路由器和转发,稳定性和效率很高lvs最新版本基于linux内核2.6,有好多年不更新了.lvs有三种常见的模式:nat、dr、iptunnellvs架构中有一个核心角色叫做分发器(loadbalancer);它用来分发用户的请求,hia有诸多处理用户请求的服务器(realserver,简称rs)1.2lvsnat模式

这种模式借助iptables的nat表来实现,用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的realserver(真正的服务器),这些服务器接收到了请求之后呢,处理用户请求,再吐给loadbalancer(分发器),这个分发器再返回给用户.那可想而知loadbalancer(分发器)这个角色其实它成为了一种瓶颈,当访问量非常大的时候,loadbalancer(分发器)请求量也非常大,请求量大,那分发器分发出去的请求,等rs处理完再吐回来的请求,分发器将吐回来的结果继续给用户,那loadbalancer(分发器)严重影响了效率.使用nat模式,请求量不能太大,realserver(真正的服务器)十来台,超过十台,分发器就会有点力不从心,除非说分发器这个机器配置很高,使用的是千兆网卡,使用的网线也是千兆网线,这样的话可以大大提升效率.

nat模式,用户请过来到loadbalance(分发器),分发器分发到后端的rs,rs处理完请求再返回给分发器,其实只是内网通信,实际上只用了一个公网ip配置在loadbalance(分发器)上,这样可以节省很多公网ip资源.

在我们看来好像是在loadbalancer和rs之间建立了虚拟的隧道,我们把它叫做iptunnel.它实现原理上,实际是更改了数据包的ip(目的ip),比如用户请求过来肯定是到loadbalancer上,loadbalancer和rs有一个特殊的配置叫做vip,也就是loadbalancer和rs角色需要配置一个公共的ip,这个公共的ip的目的是为了给用户提供服务的.用户访问过来,肯定是知道一个公网ip进行通信,通信的时候这个数据包里面就包含了目的ip,数据包到了loadbalancer上就需要做一个设置,把目的ip做一个更改,更改到具体的rs上,要不然loadbalancer上的数据包如何到rs上呢?把目的ip改成rs,当然每次改的都不一样,它根据自己的算法,有可能这次是rs1,下一次是rs2.目的ip变成rs,那数据包到rs上,rs会解包,肯定会把数据包传输回去,那rs是如何传输回去呢?因为每个rs都设置了公网ip,可以和用户直接通信,可以通过公网ip将结果返回给客户端,也就不再需要通过loadbalancer再返回给用户,那loadbalancer就不存在瓶颈,loadbalancer只负责把请求分发到各个rs上去,rs处理完的结果自己返回给客户端.

1.4lvsdr模式

这种模式和前面iptunnel模式很像,但dr模式的director(分发器)和rs之间有一个intemalnetwork(也就是内网).和iptunnel模式不同是,它会把数据包的mac地址修改为rs.mac地址就涉及到arp的通信了,若内部两台机器之间通信,它们是需要通过mac进行通信的,更改了mac地址,最终也会把分发器的数据包转移到realserver上去,转移到realserver上后,直接把结果返回给客户端上去,对于分发器来讲也是没有瓶颈了.也就意味需要配置一个vip在所有的机器上.

1.nat模式搭建--准备工作

1.1准备三台机器目前有192.168.2.179和192.168.2.180,还需再克隆一台,可以在192.168.2.180上克隆一台出来,克隆的机器ip地址为192.168.2.181.

其中一台作为分发器,也叫调度器(简写为dir)另外两台就是realserver,用来处理用户请求的服务器

添加一块网卡:点击虚拟机--设置--添加--网络适配器--添加--仅主机模式--完成查看网段:点击编辑--虚拟网络编辑器--仅主机模式网段是192.168.18.0--设置网卡ip为192.168.18.128--windows上测试一下能否拼通(能拼通说明就可以通信)

[root@root-01~]#systemctlstopfirewalld[root@root-01~]#iptables-nvlchaininput(policyaccept5886packets,523kbytes)pktsbytestargetprotoptinoutsourcedestinationchainforward(policyaccept0packets,0bytes)pktsbytestargetprotoptinoutsourcedestinationchainoutput(policyaccept4981packets,414kbytes)pktsbytestargetprotoptinoutsourcedestination[root@root-02~]#systemctlstopfirewalld[root@root-02~]#iptables-nvlchaininput(policyaccept5886packets,523kbytes)pktsbytestargetprotoptinoutsourcedestinationchainforward(policyaccept0packets,0bytes)pktsbytestargetprotoptinoutsourcedestinationchainoutput(policyaccept4981packets,414kbytes)pktsbytestargetprotoptinoutsourcedestination[root@root-03~]#systemctlstopfirewalld[root@root-03~]#iptables-nvlchaininput(policyaccept5886packets,523kbytes)pktsbytestargetprotoptinoutsourcedestinationchainforward(policyaccept0packets,0bytes)pktsbytestargetprotoptinoutsourcedestinationchainoutput(policyaccept4981packets,414kbytes)pktsbytestargetprotoptinoutsourcedestination

说明:设置网关为分发器的内网ip,若网关不设置分发器的ip,将会无法通信一旦设置成分发器的ip,这台机器就无法网上了.

#原本gateway=192.168.2.1现在更改为gateway=192.168.2.179[root@root-02~]#vim/etc/sysconfig/network-scripts/ifcfg-eno16777736type="ethernet"bootproto="static"defroute="yes"peerdns="yes"peerroutes="yes"ipv4_failure_fatal="no"ipv6init="yes"ipv6_autoconf="yes"ipv6_defroute="yes"ipv6_peerdns="yes"ipv6_peerroutes="yes"ipv6_failure_fatal="no"name="eno16777736"uuid="b82b23b3-06a7-4752-b2e6-05fef87d4917"device="eno16777736"onboot="yes"ipaddr=192.168.2.180netmask=255.255.255.0gateway=192.168.2.179dns1=119.29.29.29[root@root-02~]#systemctlrestartnetwork

说明:设置网关为分发器的内网ip,若网关不设置分发器的ip,将会无法通信一旦设置成分发器的ip,这台机器就无法网上了.

#原本gateway=192.168.2.1现在更改为gateway=192.168.2.179[root@root-03~]#vim/etc/sysconfig/network-scripts/ifcfg-ens33type="ethernet"bootproto="static"defroute="yes"peerdns="yes"peerroutes="yes"ipv4_failure_fatal="no"ipv6init="yes"ipv6_autoconf="yes"ipv6_defroute="yes"ipv6_peerdns="yes"ipv6_peerroutes="yes"ipv6_failure_fatal="no"name="ens33"uuid="b82b23b3-06a7-4752-b2e6-05fef87d4917"device="ens33"onboot="yes"ipaddr=192.168.2.181netmask=255.255.255.0gateway=192.168.2.179dns1=119.29.29.29[root@root-03~]#systemctlrestartnetwork1.6在分发器上ipvsadm工具

说明:ipvsadm工具是实现lvs的重要工具,若没有这个工具是无法实现lvs的功能.ipvsadm工具只需要在分发器上安装即可.

[root@root-01~]#yuminstall-yipvsadm1.7在分发器上写一个执行脚本

[root@root-01~]#vim/usr/local/sbin/lvs.nat.sh#!/bin/bash#director服务器上开启路由转发功能echo1>/proc/sys/net/ipv4/ip_forward#关闭icmp的重定向echo0>/proc/sys/net/ipv4/conf/all/send_redirectsecho0>/proc/sys/net/ipv4/conf/default/send_redirects#注意区分网卡名字echo0>/proc/sys/net/ipv4/conf/eno16777736/send_redirectsecho0>/proc/sys/net/ipv4/conf/ens37/send_redirects#director设置nat防火墙iptables-tnat-fiptables-tnat-xiptables-tnat-apostrouting-s192.168.2.0/24-jmasquerade#director设置ipvsadmipvsadm='/usr/sbin/ipvsadm'$ipvsadm-c$ipvsadm-a-t192.168.18.128:80-srr$ipvsadm-a-t192.168.18.128:80-r192.168.2.180:80-m-w1$ipvsadm-a-t192.168.18.128:80-r192.168.2.181:80-m-w1注:echo1>/proc/sys/net/ipv4/ip_forward--更改内核参数,实现内核转发iptables-tnat-apostrouting-s192.168.2.0/24-jmasquerade--这条规则是为了同网段的内网实现上网ipvsadm='/usr/sbin/ipvsadm'--把ipvsadm变量$ipvsadm-a--增加规则-t跟的是分发器的ip(即是外网ip)-s是指定算法-m是nat的模式-w是设置权重-r后面跟的realserver的iprr把用户的请求均衡的分发到每个rs上执行脚本:[root@root-01~]#sh/usr/local/sbin/lvs.nat.sh1.8设置realserver的主页,以便区分

#设置第1台realserver主页面(即是默认虚拟主机)[root@root-02~]#vim/data/www/default/index.htmlroot-02#设置第2台realserver主页面(即是默认虚拟主机)[root@root-03~]#vim/data/www/default/index.htmlroot-031.9测试

说明:使用公网ip测试访问

第一次访问的第1台realserver第二次访问的第2台realserver依次轮流,

[root@root-01~]#curl192.168.18.128root-02[root@root-01~]#curl192.168.18.128root-03[root@root-01~]#curl192.168.18.128root-02[root@root-01~]#curl192.168.18.128root-03说明这样就成功了

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服