1.LVS
1.1LVS 简介
Linux Virtual Server(Linux虚拟服务器,简写:LVS)是一个虚拟的服务器集群系统。由章文嵩博士在1998年5月成立的一个开源项目,是国内最早出现的自由软件项目之一。现在已经是Linux标准内核的一部分。 LVS是一种基于TCP/IP的负载均衡技术,采用IP负载均衡技术和基于内容请求分发技术,工作于OSI七层网络模型的第四层(传输层),是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,且转发效率极高,具有处理百万级并发连接请求能力。由于其仅分发请求且自身不会产生流量,对内存和CPU资源消耗比较低。 LVS具有高性能、高可用、可伸缩、可靠和可管理等特点,且简单易用。可以低廉的成本实现最优的服务性能。
目前,LVS提供了一个实现可伸缩网络服务的Linux Virtual Server框架,在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS、基于内容请求分发的内核Layer-7交换机如下图
LVS主要由两部分组成: ● IPVS,为LVS提供服务的内核模块,工作于内核空间。主要用于使用户定义的策略生效。 ● ipvsadm,用于管理集群服务的命令行工具,工作于用户空间。主要用于用户定义和管理集群服务。 同时,LVS集群采用三层结构,主要分为: ● 负载调度器,是整个集群对外面的前端机,负责将客户端的请求分发到后端的一组真实服务器上执行,而客户端认为服务是来自一个IP地址(虚拟IP地址)。 ● 服务器池,一组真正执行客户端请求的服务器(真实服务器),执行的服务有WEB、MAIL、FTP和DNS等。 ● 共享存储,为服务器池提供一个共享的存储区。使服务器池能较容易地拥有相同的内容,便于提供相同的服务。
1.2LVS 工作原理
LVS的工作原理,依据不同的IP负载均衡技术,存在一定的区别,下面将分别进行说明。整体上可以概括为:当客户端发起请求时,调度器根据预先设置的调度算法及配置的后端真实服务器,将数据转发到选出的后端服务器进行处理,当处理完成后再次根据所使用的IP负载均衡技术判断数据直接返回客户端或再次转发给调度器处理。
1.3LVS 负均衡技术
1.3.1通过NAT实现虚拟服务器(VS/NAT)
客户端发起访问请求时,调度器根据预先设定的调度算法从一组真实服务器中选出一台服务器,将请求报文中的目标地址及端口重写为选定的服务器地址和端口,并将请求分发给选定的服务器——调度器在连接Hash表中记录这个连接,方便下一个报文处理——真实服务器的响应报文通过调度器时,调度器将报文的源地址和端口修改为虚拟IP地址和相应的端口,再发回给客户端
1.3.2通过IP隧道实现虚拟服务器(VS/TUN)
客户端发起访问请求时,调度器从一组真实服务器中动态地选择一台服务器并且在原报文基础上再封装一层,然后将数据包转发到选出的真实服务器; 真实服务器的响应报文直接返回给客户端
1.3.3通过直接路由实现虚拟服务器(VS/DR)
客户端发起访问请求时,调度器从一组真实服务器中动态地选择一台服务器(调度器与真实服务器必需在同一个内网),不修改也不封装报文,而是直接将数据帧的MAC地址改为选出的真实服务器的MAC地址,再将修改后的数据帧分发给选定的服务器;
真实服务器的响应报文直接返回给客户端。 针对不同的网络服务需求和服务器配置,IPVS调度器实现了十种调度算法,主要分为静态方法和动态方法:
静态方法:仅依据算法本身进行调度,不考虑后端真实服务器的负载情况。 1)RR(Round Robin):轮询。将请求轮流分配给后端真实服务器,计数器从1开始,直到N(真实服务器的个数),然后再重新开始循环。 2)WRR(Weighted Round Robin):加权轮询。根据每个真实服务器所分配到的的一个权重值(表示处理能力的整数值。数值越大,权重越高),为权重高的真实服务器分配更多的连接。 3)SH(Source Hashing):源地址散列。根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表中找出对应的服务器,若该服务器是可用的且未超载,则将请求发送到该服务器,否则返回空。 4)DH(Destination Hashing):目标地址散列。根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,则将请求发送到该服务器,否则返回空。
动态方法:依据算法及后端各个真实服务器的负载状况进行调度。
1.4LVS 基于DR技术配置
以VS/DR(LVS-DR)模式为例,演示如何配置一个简单的LVS集群。在操作之前,请确保所有服务器均设置好路由转发功能且处于同一个局域网内,同时服务器已完成了一些常用的初始化内容,如设置主机名、关闭SELinux等,后续不再进行说明。 LVS集群的搭建,主要分为两部分:后端的真实服务器(Real Server)和前端的负载调度节点(Load Balancer),演示所需的服务器信息
HOSTNAME | IP ADDRESS | ROLES |
lvs-manager | VIP: 192.168.122.200 DIP: 192.168.122.159 | Load Balancer,Manager Node |
lvs-rs1 | VIP: 192.168.122.200 RIP: 192.168.122.162 | Real Server1,WEB(Nginx) |
lvs-rs2 | VIP: 192.168.122.200 RIP: 192.168.122.138 | Real Server2,WEB(Nginx) |
Real Server1(Nginx) VIP:192.168.122.200 DIP:192.168.122.162
Real Server2(Nginx) VIP:192.168.122.200 DIP:192.168.122.138
1.4.1LVS 基于DR技术实例
1. 配置后端真实服务器Real Server 对Real Server1服务器配置如下:
1)登录lvs-rs1,安装Nginx服务,命令如下所示。
[root@lvs-rs1 ~]# yum install -y nginx
安装完成后,执行以下命令验证Nginx服务版本号并启动服务,如下所示。
[root@lvs-rs1 ~]# nginx -v
[root@lvs-rs1 ~]# systemctl enable nginx.service
[root@lvs-rs1 ~]# systemctl start nginx.service
[root@lvs-rs1 ~]# netstat -lanput | grep :80
则表示Nginx服务安装并启动成功。
若使用浏览器访问,出现如下图所示的内容,同样表示Nginx服务安装成功(注:下图所示的内容,需要将80端口添加到防火墙才能访问,详见第5步骤)。
2)登录lvs-rs1,在确定Nginx服务安装成功后,同时还需要对Nginx服务进行配置,以便后续测试使用。此处使用Nginx服务默认配置即可,但是需要对默认的页面做出修改,以便能快速的识别出访问到的服务器,执行命令如下所示。
[root@lvs-rs1 ~]# echo "lvs-rs1 192.168.122.162" > /usr/share/nginx/html/index.html
此时,通过浏览器访问,若出现如下图所示的内容,则表示修改成功。
3)登录lvs-rs1,配置虚拟IP地址(VIP)及路由规则,执行以下命令即可。
[root@lvs-rs1 ~]# ifconfig lo:0 192.168.122.200 broadcast 192.168.122.200 netmask 255.255.255.255 up
[root@lvs-rs1 ~]# route add -host 192.168.122.200 dev lo:0
以上命令完成后,若出现如下图所示的内容(lo网卡上出现了虚拟IP地址),则表示配置成功。
4)登录lvs-rs1,执行以下命令,抑制ARP。
[root@lvs-rs1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@lvs-rs1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@lvs-rs1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@lvs-rs1 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
5)登录lvs-rs1,配置永久生效的防火墙规则,将80端口加入到防火墙中,允许Nginx服务持续对外提供服务。命令如下。
[root@lvs-rs1 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@lvs-rs1 ~]# firewall-cmd --reload
若通过“firewall-cmd --list-all”命令可以查看到如图所示的内容(注意“ports” 一列中的内容是否存在“80/tcp”),则表示端口添加成功并已经生效。
对Real Server2服务器配置如下: 1)登录lvs-rs2,安装Nginx服务,命令如下所示。
[root@lvs-rs2 ~]# yum install -y nginx
安装完成后,执行以下命令验证Nginx服务版本号并启动服务,
[root@lvs-rs1 ~]# nginx -v
[root@lvs-rs1 ~]# systemctl enable nginx.service
[root@lvs-rs1 ~]# systemctl start nginx.service
[root@lvs-rs1 ~]# netstat -lanput | grep :80
若能查看到如下图所示的内容,则表示Nginx服务安装并启
若使用浏览器访问,出现如下图所示的内容,同样表示Nginx服务安装成功(注:下图所示的内容,需要将80端口添加到防火墙才能访问)。
2)登录lvs-rs2,确定Nginx服务安装成功后,执行命令如下所示,对默认站点的页面进行修改,以便后续测试使用。
[root@lvs-rs2 ~]# echo "lvs-rs2 192.168.122.138" > /usr/share/nginx/html/index.html
此时,通过浏览器访问,若出现如下图所示的内容,则表示修改成功。
3)登录lvs-rs2,配置虚拟IP地址(VIP)及路由规则,执行如下命令即可,若配置成功,则同样会出现如图9-1所示的内容。
[root@lvs-rs2 ~]# ifconfig lo:0 192.168.122.200 broadcast 192.168.122.200 netmask 255.255.255.255 up
[root@lvs-rs2 ~]# route add -host 192.168.122.200 dev lo:0
4)登录lvs-rs2,执行以下命令,抑制ARP。
[root@lvs-rs2 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@lvs-rs2 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@lvs-rs2 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@lvs-rs2 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
5)登录lvs-rs2,配置永久生效的防火墙规则,将80端口加入到防火墙中,允许Nginx服务持续对外提供服务。命令如下(若通过“firewall-cmd --list-all”命令,同样会查看到图9-2所示的内容)。
[root@lvs-rs2 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@lvs-rs2 ~]# firewall-cmd –reload
2.配置 Load Balancer 1)登录lvs-manager,部署ipvsadm管理工具,执行以下命令即可。
[root@lvs-manager ~]# yum install -y ipvsadm
安装完成后,使用以下命令,可以查看到如下图所示的内容,则表示已经安装成并可以正常使用。
2)登录lvs-manager,执行与配置Real Server相似的命令,配置虚拟IP地址(VIP)及路由规则,命令如下。
[root@lvs-manager ~]# ifconfig eth0:0 192.168.122.200 broadcast 192.168.122.200 netmask 255.255.255.255 up
[root@lvs-manager ~]# route add -host 192.168.122.200 dev eth0:0
配置完成后,可以通过“ip a”或“ifconfig”命令查看网卡信息,若出现如下图所示的内容(此时虚拟IP地址位于eth0网卡之上),则表示配置成功。
3)登录lvs-manager,配置IPVS规则,将配置好的两台Real Server加入到管理中,如下所示。
[root@lvs-manager ~]# ipvsadm -A -t 192.168.122.200:80 -s rr
[root@lvs-manager~]# ipvsadm -a -t 192.168.122.200:80 -r 192.168.122.162:80 -g
[root@lvs-manager~]# ipvsadm -a -t 192.168.122.200:80 -r 192.168.122.138:80 -g
执行成功后,通过“ipvsadm -L n”命令可以查看到如下图所示的内容,此时与下图所示的内容存在区别,添加的Real Server等信息会出现。
4)登录lvs-manager,配置永久生效的防火墙规则。默认情况下,80端口是没有对外开放的,同时也没有安装任何WEB服务,但是此处需要使用虚拟IP地址通过80端口来访问后端的Nginx服务,所以需要将80端口加入到防火墙,以便持续对外提供服务。命令如下。
[root@lvs-manager ~]# firewall-cmd --permanent --add-port=80/tcp
[root@lvs-manager ~]# firewall-cmd --reload
防火墙配置完成并生效后,同样可以通过“firewall-cmd –list-all”命令,查看到与下图所示相同的内容。通过浏览器访问,会发现页面在刷新之后会显示不同的内容,如下图所示(必要的情况下,需要设置禁用浏览器缓存)。
若使用“curl”命令进行访问,则可以查看到如下图所示的内容。