LVS-NAT
一、架构平台环境
系统平台:CentOS 6.5 64bit vmw10.0 lvs01(RS),lvs02(RS),lvs03(Director)相关服务和专用名词定义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,然后再转发给RealServer13,此时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 0service iptables stop && chkconfig iptables off(2)HA中所有节点尽可能保证时间是一致的,方法是时间同步+任务计划同步时间;注意:对于LB来说时间的影响不是很大,但是对于HP来说各节点之间的时间偏差不应该超出一秒钟:ntpdate -u asia.pool.ntp.org
2、拓扑图地址规划
LVS Director 机器:公网地址:vip主机名:lvs03网卡:eth0 vip地址:10.19.166.169网络连接方式:vmw-bridge私网地址:dipdip地址:10.0.0.1/24网络连接方式:vmw-(not use[VMnet3])RealServer机器:私网地址:rip1主机名:lvs01rip地址:10.0.0.8/24网络连接方式:vmw-(not use[VMnet3])私网地址:rip2主机名:lvs01rip地址:10.0.0.9/24网络连接方式:vmw-(not use[VMnet3])
3、RealServer上部署httpd服务并测试
安装Apache httpd 创建测试页面,并启动httpd服务# yum install httpd -y# /etc/init.d/httpd start[root@lvs01]# echo "Node1.ssc.com
" > /var/www/html/index.html[root@lvs02]# echo "Node2
" > /var/www/html/index.html测试httpd服务器是否能正常打开页面[root@lvs01]# curl http://10.0.0.8[root@lvs02]# curl http://10.0.0.9
4、在Director上部署ipvs服务并测试
(1)确定本机ip_vs模块是否加载,也就是是否支持lvs,2.4.2后都支持了;然后安装ipvsadm 用户操作命令[root@lvs03 ~]# grep -i "ip_vs" /boot/config-2.6.32-431.el6.x86_64 CONFIG_IP_VS=mCONFIG_IP_VS_IPV6=y# CONFIG_IP_VS_DEBUG is not setCONFIG_IP_VS_TAB_BITS=12CONFIG_IP_VS_PROTO_TCP=y #IPVS支持哪些集群服务CONFIG_IP_VS_PROTO_UDP=yCONFIG_IP_VS_PROTO_AH_ESP=yCONFIG_IP_VS_PROTO_ESP=yCONFIG_IP_VS_PROTO_AH=yCONFIG_IP_VS_PROTO_SCTP=yCONFIG_IP_VS_RR=m #IPVS支持的十种调度算法CONFIG_IP_VS_WRR=mCONFIG_IP_VS_LC=mCONFIG_IP_VS_WLC=mCONFIG_IP_VS_LBLC=mCONFIG_IP_VS_LBLCR=mCONFIG_IP_VS_DH=mCONFIG_IP_VS_SH=mCONFIG_IP_VS_SED=mCONFIG_IP_VS_NQ=mCONFIG_IP_VS_FTP=m #支持代理FTP协议的CONFIG_IP_VS_PE_SIP=m(2)安装 ipvsadm[root@lvs03 ~]# yum install ipvsadm -y(3)添加集群服务[root@lvs03 ~]# ipvsadm -A -t 10.19.166.169:80 -s rr #定义一个集群服务[root@lvs03 ~]# ipvsadm -a -t 10.19.166.169:80 -r 10.0.0.8 -m #添加RealServer并指派调度[root@lvs03 ~]# ipvsadm -a -t 10.19.166.169:80 -r 10.0.0.9 -m #添加RealServer并指派调度[root@lvs03 ~]# ipvsadm -L -n #查看IPVS定义的规则列表IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.19.166.169:80 rr -> 10.0.0.8:80 Masq 2 0 0 -> 10.0.0.9:80 Masq 1 0 0 [root@lvs03 ~]# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否开启路由转发功能0[root@lvs03 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #启动Linux的路由转发功能[root@lvs03 ~]# cat /proc/sys/net/ipv4/ip_forward 1
(4)测试访问http页面
(5)永久保存LVS规则并恢复第一种方法:[root@lvs03 ~]# service ipvsadm saveipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]第二种方法:[root@lvs03 ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.s1 模拟清空ipvsadm规则来恢复[root@lvs03 ~]# ipvsadm -C[root@lvs03 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn[root@lvs03 ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.s1 [root@lvs03 ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.19.166.169:80 wrr -> 10.0.0.8:80 Masq 3 0 0 -> 10.0.0.9:80 Masq 1 0 0
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 --删除一个realserveripvsadm -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 源地址hash2.Dynamic Scheduling Method 动态调服方法(1).LC 最少连接(2).WLC 加权最少连接(3).SED 最少期望延迟(4).NQ 从不排队调度方法(5).LBLC 基于本地的最少连接(6).LBLCR 带复制的基于本地的最少连接
###########################################################
Real Server httpd 安装脚本
#!/bin/bash#install httpd#2015/03/23i='httpd'if [ `rpm -qa | grep $i | wc -l` -eq 0 ] then echo "$i is not installed" sleep 2 echo "### yum httpd ###" sleep 2 echo `yum install -y httpd` else echo "i was installed"fisleep 2echo `/etc/init.d/httpd start`sleep 3echo "### insert RS1 ###"echo `cat /etc/sysconfig/network` > /var/www/html/index.htmlsleep 3echo `curl http://localhost`
###########################################################
Director 安装脚本
#!/bin/bash# Director install# 2015/03/23vip=10.19.166.169dip=10.0.0.1rip1=10.0.0.8rip2=10.0.0.9case "$1" instart)echo `ifconfig eth1 $dip/24 up`echo "ipvsadm install"sleep 3echo `yum install ipvsadm -y`sleep 4echo `echo 1 > /proc/sys/net/ipv4/ip_forward`sleep 1echo `ipvsadm -A -t $vip:80 -s wrr`echo `ipvsadm -a -t $vip:80 -r $rip1 -m`echo `ipvsadm -a -t $vip:80 -r $rip2 -m`;;stop)echo `echo 0 > /proc/sys/net/ipv4/ip_forward`sleep 1echo `ipvsadm -C`sleep 1echo `ifconfig eth1 down`;;status)if [ `ipvsadm -L -n | wc -l` -eq 6 ];then echo "ipvsadm is running...." else echo "ipvsadm is stopped...."fi;;* ) echo "Usage: $0 {start|stop}";;esac