前言:
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是http://www.linuxvirtualserver.org现在LVS已经是Linux内核标准的一部分。
使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。
使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),它就是我们图中的Director;中间的服务器群组层,这里是用apache来实现;最底层的数据共享存储层,用Shared Storage表示,这里是数据库和NFS在同一台虚拟机上。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS的各个层次的详细介绍:
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)。
准备工作:
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 查看是否已经挂载了文件系统了
在客户端使用一个命令可以查看用户有没有导出有文件系统:
# showmount -e 172.16.249.61
-e:在nfs客户端执行,探查某主机所有导出的nfs文件系统,“showmount -e server_ip”
-d:在nfs服务器端执行,显示哪个导出的文件系统已经被至少一个客户端挂载使用
-a:在nfs服务器端显示所有挂载会话
在客户端挂载,这步要在两台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回应的网络接口来进行发送。
接下来就操作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、到这里基本上已经配置完了,接下来我们就来访问页面安装论坛吧;
结束:
OK、配置过程中如果存在什么不妥或做得不到之处还万望大神指点指点,在此先谢谢你的关注了,简单的实现了这个LVS的初步过程,后续还会慢完善起来,比如加监控,出现故障时自动踢掉服务或服务上线时自动加入服务等。