linux virtual server简称LVS,Internet的快速增加使多媒体网络服务器面对的访问数量快速增长,服务器须要具有提供大量并发访问服务的能力,所以对于大负载的服务器来说, CPU、I/O处理能力很快会成为瓶颈。因为单台服务器的性能老是有限的,简单的提升硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能知足大量并发访问的须要。Linux 虚拟服务器(Linux Virtual Servers,LVS) 使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增加的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。lvs的负载能力特别强,优化空间特别大,lvs的变种DPVS听说是lvs性能的几倍,由爱奇艺开发,并普遍用于爱奇艺IDC。其余负载均衡服务器还有nginx,haproxy,F5,Netscale。html
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。前端
在路由器上明显说明vip对应的地址必定是Director上的MAC,只要绑定,之后再跟vip通讯也不用再请求了,这个绑定是静态的,因此它也不会失效,也不会再次发起请求,可是有个前提,咱们的路由设备必须有操做权限可以绑定MAC地址,万一这个路由器是运行商操做的,咱们无法操做怎么办?第一种方式当然很简便,但未必可行。linux
在给别主机上(例如:红帽)它们引进的有一种程序arptables,它有点相似于iptables,它确定是基于arp或基于MAC作访问控制的,很显然咱们只须要在每个real server上定义arptables规则,若是用户arp广播请求的目标地址是本机的vip则不予相应,或者说相应的报文不让出去,很显然网关(gateway)是接受不到的,也就是director相应的报文才能到达gateway,这个也行。第二种方式咱们能够基于arptables。nginx
在相对较新的版本中新增了两个内核参数(kernelparameter),第一个是arp_ignore定义接受到ARP请求时的相应级别;第二个是arp_announce定义将本身地址向外通告时的通告级别。【提示:很显然咱们如今的系统通常在内核中都是支持这些参数的,咱们用参数的方式进行调整更具备朴实性,它还不依赖于额外的条件,像arptables,也不依赖外在路由配置的设置,反而一般咱们使用的是第三种配置】算法
0: 只要本地配置的有相应地址,就给予响应。(默认)后端
1: 仅回应目标IP地址是本地的入网地址的arp请求。centos
2: 仅回应目标IP地址是本地的入网地址,并且源IP和目标IP在同一个子网的arp请 求。缓存
3: 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应bash
4-7:保留未使用服务器
8: 不回应全部的arp请求。
0: 将本地任何接口上的任何地址向外通告
1: 试图仅向目标网络通告与其网络匹配的地址
2: 仅向与本地接口上地址匹配的网络进行通告
补充:特色1的解决方法
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr
固定调度算法:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。
动态调度算法:调度器会去判断后端服务器的繁忙程度,而后依据调度算法动态得派发请求。
这种算法是最简单的,就是按依次循环的方式将请求调度到不一样的服务器上,该算法最大的特色就是简单。轮询算法假设全部的服务器处理请求的能力都是同样的,调度器会将全部的请求平均分配给每一个真实服务器,无论后端 RS 配置和处理能力,很是均衡地分发下去。这个调度的缺点是,无论后端服务器的繁忙程度是怎样的,调度器都会讲请求依次发下去。若是A服务器上的请求很快请求完了,而B服务器的请求一直持续着,将会致使B服务器一直很忙,而A很闲,这样便没起到均衡的左右。
这种算法比 rr 的算法多了一个权重的概念,能够给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,若是服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
简单的说,即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提升缓存的命中率。
即未来自同一个ip的请求发给后端的同一个服务器,若是后端服务器工做正常没有超负荷的话。这能够解决session共享的问题,可是这里有个问题,不少企业、社区、学校都是共用的一个IP,这将致使请求分配的不均衡。
这个算法会根据后端 RS 的链接数来决定把请求分发给谁,好比 RS1 链接数比 RS2 链接数少,那么请求就优先发给 RS1。这里问题是没法作到会话保持,即session共享。
这个比最少链接数多了一个加权的概念,即在最少链接数的基础上加一个权重值,当链接数相近,权重值越大,越优先被分派请求。
未来自同一目的地址的请求分配给同一台RS若是这台服务器还没有满负荷,不然分配给链接数最小的RS,并以它为下一次分配的首先考虑。
这个用得少,能够略过。
ipvsadm是ipvs的管理器,须要yum安装。
基本用法:
ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options]
ipvsadm COMMAND [protocol] service-address server-address [packet-forwarding-method] [weight options]
第一条命令用于向LVS系统中添加一个用于负载均衡的virtual server(VS);第二条命令用来修改已经存在的VS的配置,service address用来指定涉及的虚拟服务即虚拟地址,server-address指定涉及的真实地址。
命令参数:
-A, --add-service: 为ipvs虚拟服务器添加一个虚拟服务,即添加一个须要被负载均衡的虚拟地址。虚拟地址须要是ip地址,端口号,协议的形式。
-E, --edit-service: 修改一个虚拟服务。
-D, --delete-service: 删除一个虚拟服务。
-C, --clear: 清除全部虚拟服务。
-R, --restore: 从标准输入获取ipvsadm命令。通常结合下边的-S使用。
-S, --save: 从标准输出输出虚拟服务器的规则。能够将虚拟服务器的规则保存,在之后经过-R直接读入,以实现自动化配置。
-a, --add-server: 为虚拟服务添加一个real server(RS)
-e, --edit-server: 修改RS
-d, --delete-server: 删除
-L, -l, --list: 列出虚拟服务表中的全部虚拟服务。能够指定地址。添加-c显示链接表。
-Z, --zero: 将全部数据相关的记录清零。这些记录通常用于调度策略。
--set tcp tcpfin udp:修改协议的超时时间。
--start-daemon state:设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注:该功能只支持ipv4)
--stop-daemon: 中止备服务器。
-h, --help: 帮助。
参数:如下参数能够接在上边的命令后边。
-t, --tcp-service service-address:
指定虚拟服务为tcp服务。service-address要是host[:port]的形式。端口是0表示任意端口。若是须要将端口设置为0,还须要加上-p选项(持久链接)。
-u, --udp-service service-address:
使用udp服务,其余同上。
-f, --fwmark-service integer:
用firewall mark取代虚拟地址来指定要被负载均衡的数据包,能够经过这个命令实现把不一样址、端口的虚拟地址整合成一个虚拟服务,可让虚拟服务器同时截获处理去往多个不一样地址的数据包。fwmark能够经过iptables命令指定。若是用在ipv6须要加上-6。
-s, --scheduler scheduling-method:
指定调度算法。调度算法能够指定如下8种:rr(轮询),wrr(权重),lc(最后链接),wlc(权重),lblc(本地最后链接),lblcr(带复制的本地最后链接),dh(目的地址哈希),sh(源地址哈希),sed(最小指望延迟),nq(永不排队)
-p, --persistent [timeout]:
设置持久链接,这个模式可使来自客户的多个请求被送到同一个真实服务器,一般用于ftp或者ssl中。
-M, --netmask netmask:
指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器。
-r, --real-server server-address:
为虚拟服务指定数据能够转发到的真实服务器的地址。能够添加端口号。若是没有指定端口号,则等效于使用虚拟地址的端口号。
[packet-forwarding-method]:
此选项指定某个真实服务器所使用的数据转发模式。须要对每一个真实服务器分别指定模式。
-g, --gatewaying: 使用网关(即直接路由),此模式是默认模式。
-i, --ipip: 使用ipip隧道模式。
-m, --masquerading: 使用NAT模式。
-w, --weight weight:
设置权重。权重是0~65535的整数。若是将某个真实服务器的权重设置为0,那么它不会收到新的链接,可是已有链接还会继续维持(这点和直接把某个真实服务器删除时不一样的)。
-x, --u-threshold uthreshold:
设置一个服务器能够维持的链接上限。0~65535。设置为0表示没有上限。
-y, --l-threshold lthreshold:
设置一个服务器的链接下限。当服务器的链接数低于此值的时候服务器才能够从新接收链接。若是此值未设置,则当服务器的链接数连续三次低于uthreshold时服务器才能够接收到新的链接。(PS:笔者觉得此设定多是为了防止服务器在可否接收链接这两个状态上频繁变换)
--mcast-interface interface:
指定使用备服务器时候的广播接口。
--syncid syncid:
指定syncid,一样用于主备服务器的同步。
如下选项用于list命令:
-c, --connection:
列出当前的IPVS链接。
--timeout:
列出超时
--daemon:
--stats:
状态信息
--rate:
传输速率
--thresholds:
列出阈值
--persistent-conn:
坚持链接
--sor:
把列表排序。
--nosort:
不排序
-n, --numeric:
不对ip地址进行dns查询
--exact:
单位
-6:
若是fwmark用的是ipv6地址须要指定此选项。
其余注意事项:
Director: centos 6.8 VIP:192.168.1.111
DIP:192.168.229.133
RealServer1: centos6.8 RIP:192.168.229.132
RealServer2: centos6.8 RIP:192.168.229.134
安装ipvsadm:
[root@ShiYanLou LVS]# yum install ipvsadm –y
编辑脚本:/LVS/install.sh
#director设置 nat 防火墙 iptables -t nat -F #!/bin/bash VIP=192.168.1.111 DIP=192.168.229.133 RIP1=192.168.229.132 RIP2=192.168.229.134 # director服务器上开启路由转发功能: echo 1 > /proc/sys/net/ipv4/ip_forward # 关闭 icmp 的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects # director设置 ipvsadm IPVSADM='/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t $VIP:80 -s rr $IPVSADM -a -t $VIP:80 -r $RIP1:80 -m $IPVSADM -a -t $VIP:80 -r $RIP2:80 -m
vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR=00:0C:29:46:3B:8C TYPE=Ethernet UUID=e2fa0e51-7240-4ef9-8572-bf82ef8bb6a8 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.229.132 NETMASK=255.255.255.0 GATEWAY=192.168.229.133 #配置网关为DIP
yum –y install httpd 标记网页: RealServer1:echo ”I am RealServer1 192.168.229.132”>/var/www/html/index.html RealServer2:echo “I am RealServer2 192.168.229.134”>/var/www/html/index.html
会轮询获得“I am RealServer1 192.168.229.132”“I am RealServer2 192.168.229.134”
注意:关闭Director的防火墙iptables,否则访问不成功。
Director: centos 6.8 VIP:eth0:0:192.168.229.111
DIP:eth0:192.168.229.133
RealServer1: centos6.8 RIP:eth0:192.168.229.132
VIP:lo:0:192.168.229.111
RealServer2: centos6.8 RIP:eth0:192.168.229.134
VIP:lo:0:192.168.229.111
脚本以下:
#! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.229.111 rs1=192.168.229.132 rs2=192.168.229.134 ifconfig eth0:0 down ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 up route add -host $vip dev eth0:0 $ipv -C $ipv -A -t $vip:80 -s rr $ipv -a -t $vip:80 -r $rs1:80 -g $ipv -a -t $vip:80 -r $rs2:80 –g
脚本以下:
#!/bin/bash vip=192.168.229.111 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip 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
会轮询获得“I am RealServer1 192.168.229.132” “I am RealServer2 192.168.229.134”
注意:关闭Director的防火墙iptables,否则访问不成功。
Director: centos 6.8 VIP:eth0:0:192.168.299.111
DIP:eth0:192.168.229.133
RealServer1: centos6.8 RIP:eth0:192.168.229.132
VIP:tunl0:192.168.229.111
RealServer2: centos6.8 RIP:eth0:192.168.229.134
VIP:tunl0:192.168.229.111
脚本以下:
#! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.229.111 rs1=192.168.229.132 rs2=192.168.229.134 ifconfig eth0:0 down ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 up route add -host $vip dev eth0:0 iptables -t nat -F setenforce 0 $ipv -C $ipv -A -t $vip:80 -s rr $ipv -a -t $vip:80 -r $rs1:80 -i $ipv -a -t $vip:80 -r $rs2:80 -i
a、加载ipip模块
[root@ulife3test LVS]# modprobe ipip
b、配置VIP:
[root@ulife3test LVS]# cd /etc/sysconfig/network-scripts/ [root@ulife3test network-scripts]# cp ifcfg-lo ifcfg-tunl0 [root@ulife3test network-scripts]# vi ifcfg-tunl0 DEVICE=tunl0 IPADDR=192.168.229.111 NETMASK=255.255.255.0 ONBOOT=yes NAME=tunl0 [root@ulife3test network-scripts]# service network restart
c、关闭arp转发:
[root@ulife3test network-scripts]# echo '0'>/proc/sys/net/ipv4/ip_forward [root@ulife3test network-scripts]# vi /etc/sysctl.conf #加入如下行 net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 [root@ulife3test network-scripts]# sysctl -p #永久生效 net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.tunl0.arp_ignore = 1 net.ipv4.conf.tunl0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.tunl0.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0
d、关闭selinux
setenforce 0或者修改/etc/selinux/config 配置文件中SELINUX=disabled而后重启系统。
会轮询获得“I am RealServer1 192.168.229.132”“I am RealServer2 192.168.229.134”
注意:关闭Director的防火墙iptables,否则访问不成功。