LVS
一、LVS简介
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件之一。
二、LVS的分类
LVS-NAT:地址转换
LVS-DR: 直接路由
LVS-TUN:隧道
三、ipvsadm用法
其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分,第一部分是工作在内核空间的一个IPVS的模块,其实LVS的功能都是IPVS模块实现的,,第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块,下面来简单的介绍下ipvsadm命令的用法
ipvsadm组件定义规则的格式: 1.定义集群服务格式: (1).添加集群服务: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] -A: 表示添加一个新的集群服务 -E: 编辑一个集群服务 -t: 表示tcp协议 -u: 表示udp协议 -f: 表示firewall-Mark,防火墙标记 service-address: 集群服务的IP地址,即VIP -s 指定调度算法 -p 持久连接时长,如#ipvsadm -Lcn ,查看持久连接状态 -M 定义掩码 ipvsadm -D -t|u|f service-address 删除一个集群服务 ipvsadm -C 清空所有的规则 ipvsadm -R 重新载入规则 ipvsadm -S [-n] 保存规则 2.向集群服务添加RealServer规则: (1).添加RealServer规则 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] -a 添加一个新的realserver规则 -e 编辑realserver规则 -t tcp协议 -u udp协议 -f firewall-Mark,防火墙标记 service-address realserver的IP地址 -g 表示定义为LVS-DR模型 -i 表示定义为LVS-TUN模型 -m 表示定义为LVS-NAT模型 -w 定义权重,后面跟具体的权值 ipvsadm -d -t|u|f service-address -r server-address --删除一个realserver ipvsadm -L|l [options] --查看定义的规则 如:#ipvsadm -L -n ipvsadm -Z [-t|u|f service-address] --清空计数器
四、lvs的10种调度算法
可以分为两大类
LVS Scheduling Method LVS的调度方法: 1.Fixed Scheduling Method 静态调服方法 (1).RR 轮询 (2).WRR 加权轮询 (3).DH 目标地址hash (4).SH 源地址hash 2.Dynamic Scheduling Method 动态调服方法 (1).LC 最少连接 (2).WLC 加权最少连接 (3).SED 最少期望延迟 (4).NQ 从不排队调度方法 (5).LBLC 基于本地的最少连接 (6).LBLCR 带复制的基于本地的最少连接
LVS-NAT
一、架构平台环境
系统平台:CentOS 6.4 64bit 内核:2.6.32 相关服务和专有名词定义 Director:负责调度集群的主机;也简称调度器、分发器 VIP:Virtual IP 向外提供服务的IP;通常此IP绑定域名 DIP:与内部主机RIP通信的IP,在Director主机上 RIP:RealServer IP;内部真正提供服务的主机 CIP:客户端IP
二、LVS-NAT架构
三、LVS-NAT模型实现负载均衡的工作方式
NAT模型其实就是通过网络地址转换来实现负载均衡的,它的工作方式几乎跟DNAT一模一样的,目前的DNAT只能转发到一个目标地址,早期的DNAT是可以将请求转发到多个目标的,在LVS出现之后就将此功能从DNAT种去掉了,下面来说说NAT模型的工作方式或者说NAT模型是怎么实现负载均衡的,根据上图,
1.用户请求VIP(也可以说是CIP请求VIP)
2,Director Server 收到用户的请求后,发现源地址为CIP请求的目标地址为VIP,那么Director Server会认为用户请求的是一个集群服务,那么Director Server 会根据此前设定好的调度算法将用户请求负载给某台Real Server ;假如说此时Director Server 根据调度算法的结果会将请求分摊到RealServer1上去,那么Director Server 会将用户的请求报文中的目标地址,从原来的VIP改为RealServer1的IP,然后再转发给RealServer1
3,此时RealServer1收到一个源地址为CIP目标地址为自己的请求,那么RealServer1处理好请求后会将一个源地址为自己目标地址为CIP的数据包通过Director Server 发出去,
4.当Driector Server收到一个源地址为RealServer1 的IP 目标地址为CIP的数据包,此时Driector Server 会将源地址修改为VIP,然后再将数据包发送给用户,
四、LVS-NAT的性能瓶颈
在LVS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器(Director),当真实服务器(RealServer)的数目在10台和20台之间时,负载调度器(Director)将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器(Director)中只负责调度请求而响应直接(RealServer)返回给客户,将极大地提高整个集群系统的吞吐量。
五、部署环境
1、准备工作
(1)关闭所有节点的iptables和selinux服务 setenforce 0 service iptables stop && chkconfig iptables off (2)HA中所有节点尽可能保证时间是一致的,方法是时间同步+任务计划同步时间; 注意:对于LB来说时间的影响不是很大,但是对于HP来说各节点之间的时间偏差不应该超出一秒钟: ntpdate -u asia.pool.ntp.org
2、拓扑图地址规划
LVS Director机器: 公网地址:vip 主机名:lvs vip地址: 192.168.0.200 子网掩码:255.255.255.0 网关: 192.168.0.1 网络连接方式:Bridge 私网地址:dip 主机名:lvs dip地址: 172.16.100.1 子网掩码:255.255.0.0 网关: 不指定网关 网络连接方式:Host-Only RealServer机器: 私网地址:rip1 主机名:web1 rip1地址:172.16.100.10 子网掩码:255.255.0.0 网关: 172.16.100.1 网络连接方式:Host-Only 私网地址:rip2 主机名:web2 rip1地址:172.16.100.11 子网掩码:255.255.0.0 网关: 172.16.100.1 网络连接方式:Host-Only
3、在RealServer上部署httpd服务并测试
安装httpd服务,创建httpd测试页面,启动httpd服务 [root@web1 ~]# yum -y install httpd [root@web1 ~]# service httpd start [root@web1 ~]# echo "RS1-web1 Allentuns.com" > /var/www/html/index.html [root@web2 ~]# yum -y install httpd [root@web2 ~]# echo "RS2-web2 Allentuns.com" > /var/www/html/index.html [root@web2 ~]# service httpd start 测试httpd服务是否OK! [root@web1 ~]# curl http://localhost RS1-web1 Allentuns.com [root@web1 ~]# curl http://172.16.100.11 RS2-web2 Allentuns.com
4、在Director上部署ipvs服务并测试
(1)确定本机ip_vs模块是否加载,也就是是否支持lvs,2.4.2后都支持了;然后安装ipvsadm 用户操作命令 [root@LVS ~]# grep -i "ip_vs" /boot/config-2.6.32-358.el6.x86_64 CONFIG_IP_VS=m #将ipvs定义成模块 CONFIG_IP_VS_IPV6=y # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 CONFIG_IP_VS_PROTO_TCP=y #IPVS支持哪些集群服务 CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y CONFIG_IP_VS_PROTO_SCTP=y CONFIG_IP_VS_RR=m #ipvs支持的十种调度算法 CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m CONFIG_IP_VS_FTP=m #支持代理ftp协议的 (2)安装ipvsadm [root@LVS ~]# yum -y install ipvsadm (3)添加集群服务 [root@LVS ~]# ipvsadm -A -t 192.168.0.200:80 -s rr #定义一个集群服务 [root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.10 -m #添加RealServer并指派调度算法为NAT [root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.11 -m #添加RealServer并指派调度算法为NAT [root@LVS ~]# ipvsadm -L -n #查看ipvs定义的规则列表 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 rr -> 172.16.100.10:80 Masq 1 0 0 -> 172.16.100.11:80 Masq 1 0 0 [root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否开启路由转发功能 0 [root@LVS ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #启动Linux的路由转发功能 [root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward 1 (4)测试访问http页面 [root@LVS ~]# curl http://192.168.0.200/index.html RS2-web2 Allentuns.com #第一次是web2 [root@LVS ~]# curl http://192.168.0.200/index.html RS1-web1 Allentuns.com #第二次是web1 [root@LVS ~]# curl http://192.168.0.200/index.html RS2-web2 Allentuns.com #第三次是web1 [root@LVS ~]# curl http://192.168.0.200/index.html RS1-web1 Allentuns.com #第四次是web2 (5)更改LVS的调度算并压力测试,查看结果 [root@LVS ~]# ipvsadm -E -t 192.168.0.200:80 -s wrr [root@LVS ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.10 -m -w 3 [root@LVS ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.11 -m -w 1 [root@LVS ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 wrr -> 172.16.100.10:80 Masq 3 0 2 -> 172.16.100.11:80 Masq 1 0 2 [root@LVS ~]# curl http://192.168.0.200/index.html RS1-web1 Allentuns.com [root@LVS ~]# curl http://192.168.0.200/index.html RS1-web1 Allentuns.com [root@LVS ~]# curl http://192.168.0.200/index.html RS1-web1 Allentuns.com [root@LVS ~]# curl http://192.168.0.200/index.html RS2-web2 Allentuns.com [root@LVS ~]# curl http://192.168.0.200/index.html RS1-web1 Allentuns.com (6)永久保存LVS规则并恢复 第一种方法: [root@LVS ~]# service ipvsadm save ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定] 第二种方法: [root@LVS ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.s1 模拟清空ipvsadm规则来恢复 [root@LVS ~]# ipvsadm -C [root@LVS ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@LVS ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.s1 [root@LVS ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 wrr -> 172.16.100.10:80 Masq 3 0 0 -> 172.16.100.11:80 Masq 1 0 0
六、LVS-NAT服务控制脚本部署在Director上
#!/bin/bash # # chkconfig: - 88 12 # description: LVS script for VS/NAT # . /etc/rc.d/init.d/functions # VIP=192.168.0.200 DIP=172.16.100.1 RIP1=172.16.100.10 RIP2=172.16.100.11 # case "$1" in start) # /sbin/ifconfig eth1:0 $VIP netmask 255.255.255.0 up # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s rr # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m /bin/touch /var/lock/subsys/ipvsadm.lock ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface ifconfig eth1:0 down rm -rf /var/lock/subsys/ipvsadm.lock ;; status) [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..." ;; *) echo "Usage: $0 {start|stop}" ;; esac
七、分享LVS-NAT一键安装脚本
#!/bin/bash # # 一键安装lvs-nat脚本,需要注意的是主机名成和ip的变化稍作修改就可以了 HOSTNAME=`hostname` Director=‘LVS‘ VIP="192.168.0.200" RIP1="172.16.100.10" RIP2="172.16.100.11" RealServer1="web1" RealServer2="web2" Httpd_config="/etc/httpd/conf/httpd.conf" #Director Server Install configure ipvsadm if [ "$HOSTNAME" = "$Director" ];then ipvsadm -C yum -y remove ipvsadm yum -y install ipvsadm /sbin/ipvsadm -A -t $VIP:80 -s rr /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m echo 1 > /proc/sys/net/ipv4/ip_forward echo "========================================================" echo "Install $Director sucess Tel:13260071987 Qq:467754239" echo "========================================================" fi #RealServer Install htpd if [ "$HOSTNAME" = "$RealServer1" ];then yum -y remove httpd rm -rf /var/www/html/index.html yum -y install httpd echo "web1 Allentuns.com" > /var/www/html/index.html sed -i ‘/#ServerName www.example.com:80/a\ServerName localhost:80‘ $Httpd_config service httpd start echo "========================================================" echo "Install $RealServer1 success Tel:13260071987 Qq:467754239" echo "========================================================" fi if [ "$HOSTNAME" = "$RealServer2" ];then yum -y remove httpd rm -rf /var/www/html/index.html yum -y install httpd echo "web2 Allentuns.com" > /var/www/html/index.html sed -i ‘/#ServerName www.example.com:80/a\ServerName localhost:80‘ $Httpd_config service httpd start echo "Install $RealServer2" echo "=========================================================" echo "Install $RealServer1 success Tel:13260071987 Qq:467754239" echo "=========================================================" fi
LVS-DR
一、LVS-DR架构
二、DR模型实现负载均衡的工作方式,
上面说了NAT模型的实现方式,那么NAT模型有个缺陷,因为进出的每个数据包都要经过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈,那么DR模型就避免了这样的情况发生,DR模型在只有请求的时候才会经过Director Server, 回应的数据包由Real Server 直接响应用户不需要经过Director Server,其实三种模型中最常用的也就是DR模型了,下面来说DR模型具体是怎么实现负载均衡的,根据上图,
1, 首先用户用CIP请求VIP,
2, 根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servre,
3,当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台Real Server上去,假如说此时根据调度算法的结果,会将请求负载到Real Server 1上面去,此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去,
4,当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户
三、配置集群服务
1、在Real Server1 和Real Server2上做以下配置
# 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 以上命令需填加到/etc/rc.local文件中让其开机自动生效 # vim /etc/sysconfig/network-scripts/ifcfg-lo:0 内容如下 DEVICE=lo:0 IPADDR=172.16.100.100 NETMASK=255.255.255.255 BROADCAST=172.16.100.100 ONBOOT=yes NAME=loopback # ifdown lo:0 # ifup lo:0 # route add -host 172.16.100.100 dev lo:0 # echo "route add -host 172.16.100.100 dev lo:0" >> /etc/rc.local
2、在Director Server上做以下配置
# vim /etc/sysconfig/network-scripts/ifcfg-eth2:0 内容如下 DEVICE=eth2:0 IPADDR=172.16.100.100 NETMASK=255.255.255.255 BROADCAST=172.16.100.100 ONBOOT=yes # ifdown eth2:0 # ifup eth2:20 # route add -host 172.16.100.100 dev eth2:0 # echo "route add -host 172.16.100.100 dev eth2:0" >> /etc/rc.local # echo "1" > /proc/sys/net/ipv4/ip_forward # echo "echo "1" > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local # ipvsadm -A -t 172.16.100.100:80 -s wlc # ipvsadm -a -t 172.16.100.100:80 -r 172.16.100.10 -g -w 2 # ipvsadm -a -t 172.16.100.100:80 -r 172.16.100.11 -g -w 1
3、浏览器访问测试
四、分享脚本
Director脚本:
#!/bin/bash # # LVS script for VS/DR # . /etc/rc.d/init.d/functions # VIP=192.168.0.210 RIP1=192.168.0.221 RIP2=192.168.0.222 PORT=80 # case "$1" in start) /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev eth0:1 # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s wlc # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2 /bin/touch /var/lock/subsys/ipvsadm &> /dev/null ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface /sbin/ifconfig eth0:1 down /sbin/route del $VIP /bin/rm -f /var/lock/subsys/ipvsadm echo "ipvs is stopped..." ;; status) if [ ! -e /var/lock/subsys/ipvsadm ]; then echo "ipvsadm is stopped ..." else echo "ipvs is running ..." ipvsadm -L -n fi ;; *) echo "Usage: $0 {start|stop|status}" ;; esac
RealServer脚本:
#!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.0.219 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up 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 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down 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 ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac
本文出自 “郑彦生” 博客,请务必保留此出处http://467754239.blog.51cto.com/4878013/1549699
原文地址:http://467754239.blog.51cto.com/4878013/1549699