LB集群(LVS)-NAT模式
实验目的:
了解LB集群NAT模式的理论和配置
实验理论:
LB负载均衡集群的诞生:
我们都知道,一台服务器是有着并发指数的(同时访问的数量),在淘宝双11节日的那一天,会有无数的客户来访问淘宝网站,显然一台服务器是接收不了如此多的客户,为了避免丧失大量的客户,可以使用提高服务器的并发处理的技术来解决,这种技术叫负载均衡集群(LB)
LB集群分为硬件和软件:
基于硬件层面:F5(企业用的最多)、A10(思杰)
基于软件层面:Lvs(linux VM system国人开发的)、nginx、Haproxy(红帽7主推)
Lvs基于TCP-UDP第四层,nginx和Haproxy基于TCP-UDP第7层
LB集群类型:
LVS-NAT
LVS-DR
LVS-TUN
我们现在使用的是LVS这款软件来做负载均衡
LVS-NAT模式:(小型公司内部来的最快)
Cip(客户端IP地址) Vip(公网网卡) Dip(私有网卡)
RIP1:192.168.0.11 RIP2:192.168.0.12 RIP3:192.168.0.13
Director(调度器):接收来自客户端的请求,然后通过算法把请求转发给Realserver1、2、3,Realserver接收到了请求后,会把信息转发给Director,Director再把信息传给客户端
注意一:Ipvsadm是一个调用IPVS模块的一款工具,和iptables一个概念
使用LVS软件要看是否有IPVS模块,红帽系统自动安装了IPVS模块
如果是其它操作系统,你需要把IPVS编译到模块中去才能使用LVS功能
注意二:玩LVS,要把iptables给关掉,两者不能共存,如果非要共存,那就需要在Director的前面(路由器)做一个防火墙
注意三:集群节点(Realserver)跟Director必须在同一个IP网络中(私有IP网络),改网络仅用于各集群节点间的通讯
注意四:Director位于client和realserver之间,并负责处理进出的所有通信,realserver必须将网关指向Dip,Director支持端口映射,realserver可以使用任意OS,
较大规模应用场景中,Director易成为系统瓶颈
实验步骤:
RealServer1:
服务器:关闭防火墙,安装httpd服务器,配置好IP地址192.168.0.11,指定网关192.168.0.100
[root@localhost~]#iptables -F
[root@localhost~]#service iptables save
Savingfirewallrulesto/etc/sysconfig/iptables:[OK]
[root@localhost~]#iptables -L
ChainINPUT(policyACCEPT)
targetprotoptsourcedestination
ChainFORWARD(policyACCEPT)
targetprotoptsourcedestination
ChainOUTPUT(policyACCEPT)
targetprotoptsourcedestination
ChainRH-Firewall-1-INPUT(0references)
targetprotoptsourcedestination
[root@localhost~]#cat /etc/yum.repos.d/boy.repo
[base]
name=RedHat
baseurl=file:///mnt/Server
enabled=1
gpgcheck=0
[Cluster]
name=RedHat
baseurl=file:///mnt/Cluster
enabled=1
gpgcheck=0
[root@localhost~]#mount /dev/cdrom/mnt
mount:blockdevice/dev/cdromiswrite-protected,mountingread-only
[root@localhost~]#yum -y install httpd
[root@localhost~]#cd /var/www/html
[root@localhosthtml]#vim index.html
[root@localhosthtml]#cat index.html
Rsa1.example.com
[root@localhosthtml]#service httpd restart
Stoppinghttpd:[FAILED]
Startinghttpd:[OK]
[root@localhosthtml]#chkconfig httpd on
[root@localhost~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:0c:29:3b:ad:61
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=192.168.0.11
TYPE=Ethernet
GATEWAY=192.168.0.100
[root@localhosthtml]#service network restart
Shuttingdowninterfaceeth0:[OK]
Shuttingdownloopbackinterface:[OK]
Bringinguploopbackinterface:[OK]
Bringingupinterfaceeth0:[OK]
RealServer2:
服务器:关闭防火墙,安装httpd服务器,配置好IP地址192.168.0.12,指定网关192.168.0.100
[root@localhost~]#iptables -F
[root@localhost~]#service iptables save
Savingfirewallrulesto/etc/sysconfig/iptables:[OK]
[root@localhost~]#iptables -L
ChainINPUT(policyACCEPT)
targetprotoptsourcedestination
ChainFORWARD(policyACCEPT)
targetprotoptsourcedestination
ChainOUTPUT(policyACCEPT)
targetprotoptsourcedestination
ChainRH-Firewall-1-INPUT(0references)
targetprotoptsourcedestination
[root@localhost~]#cat /etc/yum.repos.d/boy.repo
[base]
name=RedHat
baseurl=file:///mnt/Server
enabled=1
gpgcheck=0
[Cluster]
name=RedHat
baseurl=file:///mnt/Cluster
enabled=1
gpgcheck=0
[root@localhost~]#mount /dev/cdrom/mnt
mount:blockdevice/dev/cdromiswrite-protected,mountingread-only
[root@localhost~]#yum -y installhttpd
[root@localhost~]#cd /var/www/html
[root@localhosthtml]#vim index.html
[root@localhosthtml]#cat index.html
Rsa2.example.com
[root@localhosthtml]#service httpd restart
Stoppinghttpd:[FAILED]
Startinghttpd:[OK]
[root@localhosthtml]#chkconfig httpd on
[root@localhost~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:0c:29:3b:ad:61
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=192.168.0.12
TYPE=Ethernet
GATEWAY=192.168.0.100
[root@localhosthtml]#service network restart
Shuttingdowninterfaceeth0:[OK]
Shuttingdownloopbackinterface:[OK]
Bringinguploopbackinterface:[OK]
Bringingupinterfaceeth0:[OK]
Director:
配置两个网卡,一个网卡作为公网网卡(192.168.1.156),一个网卡作为私有网卡(192.168.0.100),私有网卡作为Realserver1、2的网关,开启IP转发
关闭防火墙,安装Ipvsadm软件。
[root@localhost~]#iptables -F
[root@localhost~]#service iptables save
Savingfirewallrulesto/etc/sysconfig/iptables:[OK]
[root@localhost~]#iptables -L
ChainINPUT(policyACCEPT)
targetprotoptsourcedestination
ChainFORWARD(policyACCEPT)
targetprotoptsourcedestination
ChainOUTPUT(policyACCEPT)
targetprotoptsourcedestination
ChainRH-Firewall-1-INPUT(0references)
targetprotoptsourcedestination
eth0在Vmnet1上,作为RealServer1和RealServer2的网关,eth1在桥接上
[root@localhost~]#ifconfig
eth0Linkencap:EthernetHWaddr00:0C:29:CA:37:AE
inetaddr:192.168.0.100Bcast:192.168.0.255Mask:255.255.255.0
eth1Linkencap:EthernetHWaddr00:0C:29:CA:37:B8
inetaddr:192.168.1.156Bcast:192.168.1.255Mask:255.255.255.0
[root@localhost~]#vim /etc/sysctl.conf开启IP转发让eth0和eth1能相互通信
[root@localhost~]#sysctl -p
net.ipv4.ip_forward=1
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
kernel.msgmnb=65536
kernel.msgmax=65536
kernel.shmmax=4294967295
kernel.shmall=268435456
[root@localhost~]#cat /etc/yum.repos.d/boy.repo
[base]
name=RedHat
baseurl=file:///mnt/Server
enabled=1
gpgcheck=0
[Cluster]
name=RedHat
baseurl=file:///mnt/Cluster
enabled=1
gpgcheck=0
[root@localhost~]#mount /dev/cdrom/mnt
mount:blockdevice/dev/cdromiswrite-protected,mountingread-only
[root@localhost~]#yum -y install ipvsadm
[root@localhost~]#ipvsadm -A -t 192.168.1.156:80 -s rr
[root@localhost~]#ipvsadm -a -t 192.168.1.156:80 -r 192.168.0.11 -m
[root@localhost~]#ipvsadm -a -t 192.168.1.156:80 -r 192.168.0.12 -m
当客户端访问请求为192.168.1.156:80时,根据调度算法rr,把请求丢给192.168.0.11还是丢给192.168.0.12.
-s:调度算法 -r:realserver的IP地址 -m:表示NAT模式 -i:表示TUN模式 -g :表示DR模式 -g参数后面要跟 加权参数-w
ipvsadm -a -t 192.168.1.156:80 -r 192.168.0.12 -g -m 2
[root@localhost~]#ipvsadm -L
IPVirtualServerversion1.2.1(size=4096)
ProtLocalAddress:PortSchedulerFlags
->RemoteAddress:PortForwardWeightActiveConnInActConn
TCP192.168.1.156:httprr
->192.168.0.12:httpMasq100
->192.168.0.11:httpMasq100
[root@localhost~]#service ipvsadm save
SavingIPVStableto/etc/sysconfig/ipvsadm:[OK]
[root@localhost~]#cat /etc/sysconfig/ipvsadm
-A-t192.168.1.156:80-srr
-a-t192.168.1.156:80-r192.168.0.12:80-m-w1
-a-t192.168.1.156:80-r192.168.0.11:80-m-w1
客户端访问:
Director的eth1接口是桥接的,把我的真机当做客户端来访问网页
刷新一下
再刷新一下
LVS算法类型:
1.静态算法:
rr 轮询:不管后台机器性能的好与坏,将客户端请求轮流、均衡的分配到每一台服务器上
wrr 加权:以权重作为比列进行轮询
sh 源地址:hash session affinity,调度算法根据请求的源地址IP,作为散列键(hashkey)从静态分配的算列表中找出相应的服务器,若该服务器是可用的且未超载,就将请求发送到该服务器,否则返回空
dh目标地址:hash调度算法根据请求的目标地址IP,作为散列键(hash key)从静态分配的散列表中找出对应的服务器,若该服务器是可用的且未超载,就将请求发送到该服务器,否则返回空。
2.动态算法:
Lc 最少连接:active*256+inactive,谁小,挑谁
Wlc 加权最少连接: (active*256+inactive)/weight 谁小,挑谁
Sed 最短期望延迟
Nq 永不排队,和Sed一样,不考虑非活动连接状况
Lblc 基于本地的最少连接
Lblcr 基于本地带复制功能的最少连接
默认方法:Wlc
实验总结:
NAT模式缺点:
第一:由于是NAT模式,外界无法访问具体的某一个集群节点,假如说某个集群节点坏了,我们不能远程连接那个坏的节点,不能系统管理集群节点。
第二:由于客户端所有的请求和所有的集群节点发给客户端的信息都会被Director接收,在小规模场景中,没有什么问题,但在大规模场景中,Director是承受不住了,所以在企业中用的最多的LB还是DR模式。