前言:    

   LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是http://www.linuxvirtualserver.org现在LVS已经是Linux内核标准的一部分。

   使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。


   使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),它就是我们图中的Director;中间的服务器群组层,这里是用apache来实现;最底层的数据共享存储层,用Shared Storage表示,这里是数据库和NFS在同一台虚拟机上。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。


LVS的各个层次的详细介绍:CentOS 6.5 LVS原理详解及DR的初步实现_集群工作原理


   Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给apache层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,(这里我们不做什么监控,大至实现LVS的过程而),此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。

  Apache层:由一组实际运行应用服务的机器组成,Real Server是WEB服务器(也可以是MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个),每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。

   Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数 据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,从整个LVS结构可以看出,Director Server是整个LVS的核心。


IP负载均衡

   负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。

   LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。

   当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR。

  VS/NAT: 即(Virtual Server via Network Address Translation)
也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器核压力将非常大,此时就会影响调度器的性能。

   NAT:特性及要求,iptables中dnat的工作机制:当用户请求到达本机的一刹那,进来的这个请求可能是访问本机的,一但访问的是本机,经过路由之后就会经过INPUT的链,但是dnat的工作机制是当请求一到达本机之后,在PREROUTING就马上把地址转换成内部主机了,不再访问本机,由POSTROUTING转发出去了,整个过程也没有进入用户空间。


   NAT是直接工作在INPUT的链上的,其实ipvs结合了netfilter的代码工作在INPUT的链上的一个能够根据用户定义的规则进行转发的一种应用,当用户请求到达时,的确是访问本机的,就交由INPUT的链,但我们在INPUT的链上定义了ipvs集群规则,这个请求将通过ipvs集群规则进行处理,通过算法确定将请求分配到各主机处理用户请求;但是ipvs也只是个框架,需要依赖于规则来完成转发,一旦定义了ipvs规则,它就可以直接在INPUT的链上工作起来,所以到达本机经过INPUT的链上的请求时,一旦匹配ipvs集群规则,直接转发到POSTROUTING转到别的主机上去,在INPUT的链上被强行转发出去,所以一般来讲ipvs跟iptables的过滤(natfilter)不应该同时使用,

  VS/TUN :即(Virtual Server via IP Tunneling)也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。

   VS/DR:即(Virtual Server via Direct Routing)也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。


   ipvs的规则是什么呢:简单来讲它就是用来定义集群服务的,就是把监听在哪个套接字上的请求或者应用定义成集群服务,比如172.16.100.1:80定义成集群服务,而ipvs又会在这个集群服务定义一个或多个正真响应后端的服务器,因此当请求在INPUT的链上被匹配到之后被强行的转发。


根据上图LVS-DR实现过程及步骤:

   这里我们准备了4台虚拟机,实现一个phpwind的论坛的运行过程,虚拟机分别是数据库+NFS虚拟机(IP为:172.16.249.61)、Director调度器虚拟器(IP为:172.16.249.62,VIP也是172.16.249.62)、web1服务器的虚拟机(IP为:192.168.0.125,RIP:192.168.0.125)、web2服务器的虚拟机(IP为:192.168.0.124,RIP:192.168.0.124)。

   CentOS 6.5 LVS原理详解及DR的初步实现_集群_02

准备工作:
   1、为每台虚拟机上安装所需要的程序
   mariadb-5.5.36(mysql也可以)
   httpd-2.4.9(这个也要安装php以及相应的开发包)
   ipvsadm-1.26-2.el6.x86_64
   nfs-utils.x86_64
   ipvsadm-1.26-2.el6.x86_64


   在NFS+MySQL虚拟机上的配置如下:
   2、这里也可以直接都用yum来安装就可以了,需要安装的程序比较多,安装完成之后我们先来配置NFS,让NFS导出共享文件系统;
   安装NFS,服务器端需要安装的是nfs-utils,utils就是各工具组件的意思,一般系统本身自带有了,如果系统没有安装有就yum安装一下就可以了;    

# rpm -q nfs-utils 查看nfs是否已经安装有了
# yum -y install nfs-utils   
# service nfs start 启动nfs服务
安装好之后就可以导出文件系统了:
# vim /etc/exports  说明导出给哪个文件系统就可以了,这里我们导出给124和125这两台虚拟机使用,如果有多台可以用网段来表示也可以;
/nfsshared      192.168.0.124(rw,no_root_squash) 192.168.0.125(rw,no_root_squash)
挂载选项:ro,rw(读写),async(异步),sync(同步),root_squash(压缩root用户,基于imapd将root用户通过网络访问时转换为nfsnobody用户),no_root_squsah


   在本机创建一个共享目录,然后将这个共享目录导出让别的主机可以挂载使用:
   # mkdir /nfsshared
   # vim /etc/fstab
   /dev/sdc1     /nfsshared      ext4    defaults,acl    0 0
   然后再把这个nfsshared文件导出去让别的主机可以访问
   # mount -a
   # mount 查看是否已经挂载了文件系统了

   CentOS 6.5 LVS原理详解及DR的初步实现_LVS搭建_03


   在客户端使用一个命令可以查看用户有没有导出有文件系统:
   # showmount -e 172.16.249.61
   -e:在nfs客户端执行,探查某主机所有导出的nfs文件系统,“showmount -e server_ip”
   -d:在nfs服务器端执行,显示哪个导出的文件系统已经被至少一个客户端挂载使用
   -a:在nfs服务器端显示所有挂载会话

   CentOS 6.5 LVS原理详解及DR的初步实现_LVS-DR_04


   在客户端挂载,这步要在两台httpd虚拟上机操作,两台web虚拟机都挂载上去就可以了,直接挂载到httpd的工作目录下:
   # mount -t nfs 172.16.249.61:/nfsshared /var/www/html

   3、把下载好的phpwind_GBK_8.7.zip这个论坛程序解压,然后把upload这个文件夹移动到导出的文件系统/nfsshared这个目录不去;    

# unzip phpwind_GBK_8.7.zip
# cd phpwind_GBK_8.7
# mv upload /nfsshared/
# cd /nfsshared/
# chmod -R 777 upload  把upload目录下的所有文件包括upload自己的权限都改为777,安装论坛是要用到


   4、给安装论坛创建个数据库,并创建个用户来运行这个数据库使用;    

# mysql -uroot -hlocalhost -p
MariaDB [(none)]> CREATE DATABASE phpwind;
MariaDB [(none)]> GRANT ALL ON phpwind.* TO 'openstack'@'192.168.0.%' IDENTIFIED BY 'linux';
MariaDB [(none)]> FLUSH PRIVILEGES;



   接下来安装和配置两个web虚拟机,在这里我们的web虚拟机都是用httpd,它配置两个地址,一个是RIP的址,直接配置在eth0的网卡上,而VIP地址配置在lo的别名上;
   web上配置内核参数,两台web虚拟机基本上都可以这样配置,只需要改IP地址就可以配置好了:  

# route add default gw 192.168.0.254   :指向默认网关
# ifconfig eth0 192.168.0.125/16 up  :配置RIP地址
# ifconfig lo:0 172.16.249.62 netmask 255.255.255.255 broadcast 172.16.249.62 up  :配置VIP在lo的别名上,并给自己广播
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# route add -host 172.16.249.62 dev lo:0  :添加路由,指定报文必须经过lo:0


   #1:表示从哪个接口进来的,就用哪个接口响应,而如果这们接口上没有配有地址就不响应,如果是0的话,不管是不是这们接口,只要有这个地址就会响应。

   #2:表示限制通告级别的,只是限制了主动工作模式,对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送。    

   CentOS 6.5 LVS原理详解及DR的初步实现_LVS-DR_05

   CentOS 6.5 LVS原理详解及DR的初步实现_负载均衡_06


   接下来就操作Director这台虚拟机了,在这里操作的也比较少,根据我们上图中的规划,这里添加DIP,VIP,路由和网关;    

# yum -y install ipvsadm
# ifconfig eth0:0 192.168.0.122/24 up 这个配置在别名上
# ifconfig eth0 172.16.249.62/16 up 这个配置在eth0上
# route add default gw 192.168.1.254 这个网关要是连接在路由的网关
    接下来添加集群服务:
# ipvsadm -A -t 172.16.249.62:80 -s rr
# ipvsadm -a -t 172.16.249.62:80 -r 192.16.0.124 -g
# ipvsadm -a -t 172.16.249.62:80 -r 192.16.0.125 -g



   OK、到这里基本上已经配置完了,接下来我们就来访问页面安装论坛吧;    CentOS 6.5 LVS原理详解及DR的初步实现_集群工作原理_07

CentOS 6.5 LVS原理详解及DR的初步实现_负载均衡_08

CentOS 6.5 LVS原理详解及DR的初步实现_LVS-DR_09

CentOS 6.5 LVS原理详解及DR的初步实现_集群_10

CentOS 6.5 LVS原理详解及DR的初步实现_集群_11

CentOS 6.5 LVS原理详解及DR的初步实现_LVS搭建_12


结束:
   OK、配置过程中如果存在什么不妥或做得不到之处还万望大神指点指点,在此先谢谢你的关注了,简单的实现了这个LVS的初步过程,后续还会慢完善起来,比如加监控,出现故障时自动踢掉服务或服务上线时自动加入服务等。