LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org。 LVS是Linux内核标准的一部分。LVS是一个实现负载均衡集群的开源软件项目,通过 LVS 的负载均衡技术和 Linux操作系统可以实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。LVS架构从逻辑上可分为调度层、Server集群层和共享存储。LVS实际上相当于基于IP地址的虚拟化应用。
二、LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
- ipvs(ip virtual server):工作在内核空间,是真正生效实现调度的代码。
- ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
三、LVS相关术语
- DS:Director Server, 指的是前端负载均衡器节点。
- RS:Real Server, 后端真实的工作服务器。
- VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
- DIP:Director Server IP, 前端负载均衡器IP地址,主要用于和内部主机通信。
- RIP:Real Server IP, 后端服务器的IP地址。
- CIP:Client IP, 访问客户端的IP地址
四、LVS的工作模式介绍
LVS负载均衡常见的有三种工作模式,分别是地址转换(简称NAT模式)、IP隧道(简称TUN模式)和直接路由(简称DR模式),其实企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便,下面总结 DR 和 NAT 原理和特点:
1. LVS-NAT模式
(1) LVS-NAT原理
类似于防火墙的私有网络结构,Director Server作为所有服务器节点的网关,,即作为客户端的访问入口,也是各节点回应客户端的访问出口,其外网地址作为整个群集的VIP地址,其内网地址与后端服务器Real Server在同一个物理网络,Real Server必须使用私有IP地址。
数据包流向分析
用户发送请求到Director Server,请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
内核空间判断数据包的目标IP是本机,此时IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,重新封装数据包(源IP为CIP,目标IP为RIP),然后选路将数据包发送给Real Server。
Real Server比对发现目标IP是本机的IP,重新封装报文(源IP为RIP,目标IP为CIP)发回给Director Server。
- Director Server重新封装数据包,将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
(2) LVS-NAT模型的特点
RS必须使用私有IP地址,网关指向DIP。
DIP与RIP必须在同一网段内。
DS作为所有服务器节点的网关,也就是说请求和响应报文都需要经过Director Server。
支持端口映射
- 高负载场景中,Director Server压力比较大,易成为性能瓶颈。
2. ?LVS-DR模式
(1) LVS-DR原理
Director Server作为群集的访问入口,但不作为网关使用,后端服务器池中的Real Server与Director Server在同一个物理网络中,发送给客户机的数据包不需要经过Director Server。为了响应对整个群集的访问,DS与RS都需要配置有VIP地址。
数据包流向分析
用户发送请求到Director Server,请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
- 由于DS和RS在同一个网络中,所以是通过二层数据链路层来传输。
- 内核空间判断数据包的目标IP是本机IP,此时IPVS比对数据包请求的服务是否为集群服务,若是,重新封装数据包,修改源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server.
- RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文,重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过lo接口传送给eth0网卡然后向外发出。
- RS直接将响应报文传送到客户端。
(2) LVS-DR模型的特点
- RS和DS必须在同一个物理网络中。
- RS可以使用私有地址,也可以使用公网地址,如果使用公网地址,可以通过互联网对RIP进行直接访问。
- 所有的请求报文经由Director。 Server,但响应报文必须不能经过Director Server。
- RS的网关绝不允许指向DIP(不允许数据包经过director)。
- RS上的lo接口配置VIP的IP地址。
LVS-DR模式需要注意的是:
保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS。
解决方案是:修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
arp_ignore=1表示系统只响应目的IP为本地IP的ARP请求。
- arp_announce=2表示系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址。
五、LVS的负载调度算法
最常用的有四种;轮询(rr)、加权轮询(wrr)、最少连接(lc)和加权最少连接(wlc)。
- 轮询(rr):将收到的访问请求按照顺序轮流调度到不同的服务器上,不管后端真实服务器的实际连接数和系统负载。
- 加权轮询(wrr):给RS设置权重,权重越高,那么分发的请求数越多,权重的取值范围0–100。根据每台服务器的性能,给每台服务器添加权值,如果RS1的权值为1,RS2的权值为2,那么调度到RS2的请求会是RS1的2倍。权值越高的服务器,处理的请求越多。这种算法是对rr算法的一种优化和补充。
- 最少连接(lc):根据后端RS的连接数来决定把请求分发给谁,比RS1连接数比RS2连接数少,那么请求就优先发给RS1。
- 加权最少连接(wlc):根据后端RS的权重和连接数来决定把请求分发给谁,权重较高,连接数少的RS会优先处理请求。
六、LVS的共享存储服务器
为后端真实服务器提供稳定、一致的文件存取服务,在Linux/Unix环境中,共享存储可以使用NAS设备或者提供NFS(网络文件系统)共享服务的专用服务器。一般放在私有网络中。
七、实现LVS的NAT模式
1.实验环境
IP地址规划
客户端访问服务的请求IP地址:VIP 12.0.0.1
Server | IP | 系统 |
---|---|---|
Director Server | DIP 192.168.10.1 | CentOS7 |
NFS Server | 192.168.10.50 | RedHat6 |
Real Server1 | RIP 192.168.10.51 | CentOS7 |
Real Server2 | RIP 192.168.10.52 | CentOS7 |
在配置的Director的服务器上添加两块网卡,详细步骤可参考DNS分离解析这篇博文有介绍,设置外网ens37为VIP,内网ens33为DIP,把两个 real server 的网关设置为 Director 的内网 iP即DIP。
在虚拟机的配置中DIP网络连接方式设置为仅主机模式,Real Server也配置为仅主机模式。
2.安装和配置
yum安装软件
方法一:如果虚拟机网络是仅主机模式,没有网络,可以本地创建yum仓库,然后进行yum安装。
方法二:如果虚拟机网络是NAT模式,有网络,可以在线yum安装。
(1) 配置NFS服务器
yum install nfs-utils -y ???#7系统版本需要安装nfs工具包service rpcbind start ?service nfs restart
#创建共享目录mkdir /opt/wwwroot1mkdir /opt/wwwroot2#给共享目录写入权限chmod 777 /opt/wwwroot1chmod 777 /opt/wwwroot2#编辑配置文件vim /etc/exports/opt/wwwroot1 192.168.10.0/24(rw,sync) /opt/wwwroot2 192.168.10.0/24(rw,sync)
#发布共享exportfs -rv
#关闭防火墙service iptables stop
(2) 配置两个real server服务器
#安装nfs客户端yum install nfs-utils -y systemctl start rpcbind.service ?systemctl start nfs.service
#查看nfs挂载showmount -e 192.168.10.50
#挂载nfs#Real Server1挂载nfs#法一:直接挂载mount.nfs 192.168.10.50:/opt/wwwroot1 /var/www/html#法二:修改fatab文件挂载vim /etc/fstab ?192.168.10.50:/opt/wwwroot1 /var/www/html nfs defaults,_netdev ?0 0#Real Server2挂载nfs方法同Real Server1,将挂载目录/opt/wwwroot1改成/opt/wwwroot2,其余一样。
#安装httpdyum install httpd -y
#real server1创建测试网页echo "Server 192.168.10.51" > /var/www/html/index.html#real server2创建测试网页echo "Server 192.168.10.52" > /var/www/html/index.html
#启动httpd服务systemctl start httpd.service systemctl enable httpd.service
#关闭防火墙和安全性策略systemctl stop ?firewalld.service systemctl disable firewalld.servicesetenforce 0
#测试网页打开是否正常firefox http://127.0.0.1/
(3) 配置Director server服务器
#安装ipvsadm管理工具yum install ipvsadm -y
#加载LVS内核模块modprobe ip_vs#查看ip_vs版本信息cat /proc/net/ip_vs ?
#开启路由转发#法一:编辑sysctl.conf文件,永久路由转发vim /etc/sysctl.conf ?net.ipv4.ip_forward=1sysctl -p#法二:直接编辑,临时路由转发echo "1" > /proc/sys/net/ipv4/ip_forward
#配置SNAT转发规则,设置nat防火墙iptables -F -t nat ?????#清空nat防火墙iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens37 -j SNAT --to-source 12.0.0.1
#Director 上编辑 nat 实现负载分配脚本# 设置 ipvsadmvim nat.sh #!/bin/bash ipvsadm-save ?> /etc/sysconfig/ipvsadm ??#保存策略 service ipvsadm start ?ipvsadm -C ????#清除内核虚拟服务器表中的所有记录 ipvsadm -A -t 12.0.0.1:80 -s rr ?#创建虚拟服务器 ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.51:80 -m ?ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.52:80 -m ?ipvsadm
ipvsadm管理工具的选项用法:
- -A: 表示添加虚拟服务器
- -t: 用来指定VIP地址及TCP端口
- -s: 用来指定负载均衡调度算法
- -a: 表示添加真实服务器
- -r: 用来指定RIP地址及TCP端口
- -m: 表示使用NAT群集模式
- -g: 表示使用DR群集模式
- -i: 表示使用TUN群集模式
- -w: 用来设置权重
#保存nat脚本后直接运行chmod +x nat.sh./nat.sh
#查看ipvsadm设置的规则ipvsadm -ln
3.测试LVS群集
用Windows客户端直接访问http://12.0.0.1, 将能够看到由真实服务器提供的网页内容。
第一次访问:
Real Server连接次数查看:
刷新一次:
Real Server连接次数查看:
八、实现LVS的DR模式
1.实验环境
四台机器:
Director节点: ?(ens33 192.168.10.53 ?vip ens33:0 192.168.10.80)
Real server1: (ens33 192.168.10.51 vip lo:0 192.168.10.80)
Real server2: (ens33 192.168.10.52 vip lo:0 192.168.10.80)
NFS Server: 192.168.10.50
2.安装和配置
(1) 配置NFS server服务器
步骤如上
(2) 配置两个real server服务器
#配置虚拟IP地址cd /etc/sysconfig/network-scripts/cp ifcfg-lo ifcfg-lo:0vim ifcfg-lo:0 DEVICE=lo:0 IPADDR=192.168.10.80 NETMASK=255.255.255.255 ?#子网掩码必须全为1 ONBOOT=yes ifup lo:0
#安装nfs客户端yum install nfs-utils -y service rpcbind start ?service nfs restart
#查看nfs挂载showmount -e 192.168.10.50
#挂载nfs#Real Server1挂载nfs#法一:直接挂载mount.nfs 192.168.10.50:/opt/wwwroot1 /var/www/html#法二:修改fatab文件挂载vim /etc/fstab ?192.168.10.50:/opt/wwwroot1 /var/www/html nfs defaults,_netdev ?0 0#Real Server2挂载nfs方法同Real Server1,将挂载目录/opt/wwwroot1改成/opt/wwwroot2,其余一样。
#安装httpdyum install httpd -y
#real server1创建测试网页echo "Server 192.168.10.51" > /var/www/html/index.html#real server2创建测试网页echo "Server 192.168.10.52" > /var/www/html/index.html
#启动httpd服务systemctl start httpd.service systemctl enable httpd.service
#关闭防火墙和安全性策略systemctl stop ?firewalld.service systemctl disable firewalld.servicesetenforce 0
#在两台real server上配置启动脚本vim /etc/init.d/rs.sh ?#!/bin/bash ?VIP=192.168.10.80 ???????case "$1" in ???????start) ???????????????ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP ???????????????/sbin/route add -host $VIP dev lo:0 ?????#为本机添加一条路由记录 ???????????????echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore ???????????????echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce ???????????????echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore ???????????????echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ???????????????sysctl -p >/dev/null 2>&1 ???????????????echo "RealServer Start OK " ???????????????;; ???????stop) ???????????????ifconfig lo:0 down ???????????????route del $VIP /dev/null 2>&1 ???????????????echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore ???????????????echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce ???????????????echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore ???????????????echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ???????????????echo "RealServer Stopd" ???????????????;; ???????*) ???????????????echo "Usage: $0 {start|stop}" ???????????????exit 1 ???????esac ???????exit 0#保存后直接运行脚本chmod +x rs.shservice rs.sh start
先在本机上自测一下访问网页:
(2) 配置Director server服务器
#配置虚拟IP地址cd /etc/sysconfig/network-scripts/cp ifcfg-ens33 ifcfg-ens33:0vim ifcfg-ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.10.80 NETMASK=255.255.255.0ifup ens33:0
#安装ipvsadmyum install ipvsadm -y ?
vim /etc/sysctl.conf#开启路由功能 ?net.ipv4.ip_forward=1#调整/proc响应参数,关闭Linux内核重定向参数响应 ?net.ipv4.conf.all.send_redirects = 0 ???net.ipv4.conf.default.send_redirects = 0 ?net.ipv4.conf.ens33.send_redirects = 0sysctl -p
配置启动脚本vim /etc/init.d/dr.sh #!/bin/bash GW=192.168.10.1 VIP=192.168.10.80 RIP1=192.168.10.51 RIP2=192.168.10.52 case "$1" in ???????start) ???????/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm ???????systemctl start ipvsadm ???????????/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up ???????/sbin/route add -host $VIP dev ens33:0 ???????/sbin/ipvsadm -A -t $VIP:80 -s rr ???????/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g ???????/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g ???????echo "ipvsadm starting --------------------[ok]" ???????;; ???????stop) ???????/sbin/ipvsadm -C ???????systemctl stop ipvsadm ???????ifconfig ens33:0 down ???????route del $VIP ???????echo "ipvsamd stoped----------------------[ok]" ????????;; ???????status) ???????if [ ! -e /var/lock/subsys/ipvsadm ];then ???????echo "ipvsadm stoped---------------" ???????exit 1 ???????????????else ???????????????echo "ipvsamd Runing ---------[ok]" ???????fi ???????;; ???????*) ???????echo "Usage: $0 {start|stop|status}" ???????exit 1esacexit 0chmod +x /etc/init.d/dr.shservice dr.sh start
#关闭防火墙和安全策略systemctl stop firewalld.servicesystemctl disable firewalld.servicesetenforce 0
3.测试LVS群集
用Windows客户端直接访问 http://192.168.10.80/, 将能够看到由真实服务器提供的网页内容。
第一次访问:
Real Server连接次数查看:
刷新一次:
Real Server连接次数查看:
九、LVS结合keepalive
LVS可以实现负载均衡,但是不能够故障切换和健康检查,也就是当一个rs服务器出现故障时,LVS仍然会把请求转发给故障的rs服务器,这样就会导致请求无效。keepalive软件可以解决 LVS 单点故障的问题,能同时实现 LVS 的高可用性。这里以LVS-DR模式为例。
1.实验环境
五台机器:
- Keepalived1 + lvs1(Director1):192.168.10.53 (主)
- Keepalived2 + lvs2(Director2):192.168.10.54 ?(从)
- Real server1:192.168.10.51
- Real server2:192.168.10.52
- NFS Server: 192.168.10.55
- VIP: 192.168.10.80
2.安装配置
在实现LVS的DR模式前提下,在两个Director Server 节点服务器部署keepalived服务。
#安装keepalive软件yum install keepalived -y
主keepalived节点配置(lvs1)
#主节点( MASTER )配置文件vim /etc/keepalived/keepalived.conf global_defs { ?... ???#省略部分 ?smtp_server 127.0.0.1 ??????????#指向本地 ?router_id LVS_01 ??????????????#指定名称,备份服务器不同名称 ?... ???#省略部分 ?????????} vrrp_instance VI_1 { ???????#定义VRRP热备实例 ???state MASTER ???????????#MASTER表示主调度器 ???interface ens33 ????????#承载VIP地址的物理接口 ???virtual_router_id 51 ???#虚拟路由器的ID号,每个热备组保持一致 ???priority 100 ???????????#主调度器优先级 ???advert_int 1 ???????????#通告间隔秒数 ???authentication { ???????#认证信息 ???????auth_type PASS ?????#认证类型 ???????auth_pass 1111 ?????#字码密串 ???} ???virtual_ipaddress { ????#指定群集VIP地址,也就是漂移地址 ???????192.168.10.80 ???}}virtual_server 192.168.10.80 80 { ?#虚拟服务器VIP地址 ???delay_loop 6 ??????????????????#健康检查的间隔时间 ???lb_algo rr ????????????????????#轮询rr的调度算法 ???lb_kind DR ????????????????????#直接路由工作模式 ???persistence_timeout 0 ?????????#连接保持时间 ???protocol TCP ??????????????????#应用服务采用的是TCP协议 ???real_server 192.168.10.51 80 { ?????????????????????????#第一个web节点的服务器地址、端口 ???????weight 1 ???????TCP_CHECK { ???????????connect_timeout 10 ???????????nb_get_retry 3 ???????????delay_before_retry 3 ???????????connect_port 80 ??????????????} ???} ???real_server 192.168.10.52 80 { ????????????????????????#第二个web节点的服务器地址、端口 router_id LVS_01 ????????weight 1 ???????TCP_CHECK { ???????????connect_timeout 10 ???????????nb_get_retry 3 ???????????delay_before_retry 3 ???????????connect_port 80 ???????} ???}}
从keepalived节点配置(lvs2)
拷贝主节点的配置文件keepalived.conf,然后修改如下内容:
router_id LV -> ?router_id LVS_02 #从调度器名称state MASTER -> state BACKUP ?#从调度器priority 100 -> priority 90 ??#从调度器优先级
启动keepalive
#先主后从分别启动keepalivesystemctl start keepalived.servicesystemctl status keepalived.service
3.测试 keepalived 的HA特性
(1)虚拟IP地址漂移
首先在master(lvs1)上执行命令 ip addr ,可以看到vip在master节点上的;
这时如果在master上执行 systemctl stop keepalived.service命令,这时vip已经不在master上,在slave节点上执行 ip addr 命令可以看到 vip 已经正确漂到slave节点。这时客户端去访问http://192.168.10.80 ?访问依然正常。
systemctl stop keepalived.service ????#在lvs1主调度器上停止keepalived服务
(2)连通性
在客户机执行“ping 192.168.10.80 -t”,能够正常ping通。
禁用master(lvs1)的ens33网卡,发现还是能正常ping通的。
(3)web访问测试
禁用master(lvs1)的ens33网卡,再次访问上述web服务,网页文档显示正常。
使用LVS负载均衡搭建web群集的原理及安装配置详解
原文地址:http://blog.51cto.com/11134648/2133850