集群方式
负载均衡 LB load balance
高可用 HA high avavilable
高性能计算
负载均衡集群 一般用于请求负载分发,也就是按一定的算法把不同的请求调度给不同的节点, 这些节点提供的都是相同的服务。解决单台服务器压力过大的问题。 调度器 node1 node2 node3
常用的负载均衡方式
1。手动选择 如:下载网站很多镜像站点2。DNS轮询方式 对同一个域名加多条A记录
dig 可靠性低 负载分配不均衡3。四层/七层负载均衡
负载均衡集群 LVS linux virtual server (linux虚拟主机) 开源
章文嵩 1998
lvs 在linux内核中实现的,linux内核要支持它
cd /usr/src/kernel/`uname -r`/make menuconfig
Networking --->
Networking options --->
IP virtual server configuation --->M> IP virtual server support(EXPERIMENTAL) │ │
[ ] IP virtual server debugging │ │ │ │ (12) IPVS connection table size (the Nth power of 2) │ │ │ │ --- IPVS transport protocol load balancing support │ │ │ │ [*] TCP load balancing support │ │ │ │ [*] UDP load balancing support │ │ │ │ [*] ESP load balancing support │ │ │ │ [*] AH load balancing support │ │ ................................................
一个有十种调度算法:(这里只实现8种)
1,rr round-robin 轮循 均等地对待每台真实服务器 2,wrr weighted round-robin 加权轮循 根据真实服务器的不同处理能力来调度访问请求,并可以动态地调整权值 3,lc least-connection 最少连接 根据连接数来分配,连接数少的服务器会多分配。 4,wlc weighted least-connection 加权最少连接 同时考量服务器的处理能力和连接数来进行分配 5,lblc 基于局部性的最少连接 主要用于cache集群 6,lblcwr 带复制的基于局部性的最少连接 主要用于cache集群 7,dh destionation hashing 目标地址散列8,sh source hashing 源地址散列
关于加权和quiesce 例如:假设在真实服务器池中有三个服务器,服务器 A 和 B 为加权 1 和 3,服务器 C 为加权 2。如果服务器 C 由于某种原因当机,服务器 A 和 B 就会平级分配被丢弃的负载。但服务器 C 重新上线后,LVS 路 由器会视其为没有连接的服务器,并且将所有进入请求都一股脑发送到这台服务器中,直到和服务器 A 和 B 持平。 要防止此现象出现,管理员可将虚拟服务器设为 quiesce 服务器 — 无论何时当有新的服务器节点上线 时,都将最小连接表重新设为 0,且 LVS 路由器象所有真实服务器都是刚刚添加到群集中一样路由请求。三种负载均衡技术:
NAT
通过网络地址转换,调度器重定请求报文的目标地址。,将请求分发给下端的真实服务器,真实服务器响应,再通过调度器返回给客户端。 这种架构,调度器容易成为整个架构的瓶颈。 一般处理10台以下 TUNNEL 调度器直接把请求通过IP隧道转发给后端的真实服务器,而真实服务器返回时,直接返回给客户端,而不经过调度器。 所以效率比NAT高 一般处理50台以内 DIRECTING 类似tunnel技术 这种方式没有隧道的开锁,对于后台真实服务器也没有必须支持IP隧道协议的要求; 但是要求调度器必须有一块网卡和真实服务器在同一物理网段。 一般处理100台以内
[root@li 2.6.18-164.el5-i686]# ls /lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/
ip_vs_dh.ko ip_vs_lblc.ko ip_vs_nq.ko ip_vs_sh.ko ip_vs_ftp.ko ip_vs_lblcr.ko ip_vs_rr.ko ip_vs_wlc.ko ip_vs.ko ip_vs_lc.ko ip_vs_sed.ko ip_vs_wrr.ko
浮动IP
一般来说,LVS集群采用三层结构
负载调度器 整个集群架构对外的前端,负载请求的转发 服务器池 一组真正执行客户请求的服务器组,如web,ftp,mail等 共享存储 为服务器池提供一个共享的存储区域,使服务器池比较方便的拥有相同的内容,也方便维护还有加上数据库的话,存放动态网页的数据,其锁机制保证了访问时不冲突
========================================================== -------------------------------------------------------------------------------LVS-NAT
客户端 172.16.43.1 | | | | 外网 172.16.43.128 [directer] | | 内网 172.16.232.135 | | | | | | WEB1 WEB2 gateway指向172.16.232.135 172.16.232.129 172.16.232.133
实验前准备:
主机名 时间同步 yum 关闭iptables,selinux--第一大步: DR上的操作:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1sysctl -p 使之生效
安装ipvsadm yum install ipvsadmipvsadm - Linux Virtual Server administration
ipvsadm -A -t 172.16.43.128:80 -s rr --A参数增加服务,s参数后接调度算法,这里先使用rr ipvsadm -a -t 172.16.43.128:80 -r 172.16.232.129 -m --a参数增加真实服务器,-m代表NAT架构 ipvsadm -a -t 172.16.43.128:80 -r 172.16.232.133 -m [root@localhost ~]# ipvsadm -ln --查看ipvsadm调度规则,清空是用ipvsadm -C IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.43.128:80 rr -> 172.16.232.133:80 Masq 1 0 0 -> 172.16.232.129:80 Masq 1 0 0 [root@localhost ~]# /etc/init.d/ipvsadm save --保存规则 Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ] # vim /etc/sysconfig/ipvsadm --保存的规则 -A -t 172.16.43.128:80 -s rr -a -t 172.16.43.128:80 -r 172.16.232.133:80 -m -w 1 -a -t 172.16.43.128:80 -r 172.16.232.129:80 -m -w 1 --默认-w 1表示权重为1 --如果要修改规则,可以直接修改这个文件,再/etc/init.d/ipvsadm restart就可以了
第二大步:
真实服务器的配置(web1和web2都要配置) 1,把默认路由指向调度器的同一网段IP route add default gw 172.16.232.1352,安装httpd ,yum install httpd ,并在不同的web服务器上建立不同的主页文件,并启动httpd
# echo 'web1'> /var/www/html/index.html --在web1服务器上做 # /etc/init.d/httpd restart # echo 'web2'> /var/www/html/index.html --在web2服务器上做 # /etc/init.d/httpd restart
第三大步:
在clinet端进行访问验证 elinks 172.16.43.128 --访问调度器上的外网IP 在调度器上使用watch ipvsadm -ln 查看调度的动态信息 elinks的结果:一次显示web1,一次显示web2,这样去轮循的方式
-----------------------------------------------------------------
做完上面架构后,可以换一种算法尝试
wlc
sh 第一次访问上去是被调到哪一个web,后面再访问还是会被调到这个web
wrr 再把weight权重一个改为2,会发现它被调两次,另一个才被调一次
还可以使用ab或者webbench去压力测试一下,测试的同时,在DR使用watch ipvsadm -ln 查看调度的分配
=========================================================== 路由架构
下面的架构中
客户端 172.16.232.1 | | 172.16.232.137 [firewall] 81.1.1.1 <<--------------- | 71.1.1.1 | | | | 71.1.1.2 | [director] | | 81.1.1.2 | | | |--------------------------------|| | web1 web2 | 81.1.1.3 81.1.1.4 网关指向firewall的同网段IP 81.1.1.1 第一大步:
配置firewall
1,ipvsadm 确认没有打开
2,httpd 也就是80端口没有打开3,/etc/sysctl.conf --打开IP_FORWARD
4,使用防火墙做DNAT,把对firewall的80请求DNAT给Director
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 71.1.1.2 上面-i eth0表示从eth0进入的访问80的包; 因为我这里172.16.232.137为eth0,所以规则里写eth2
第二大步:
配置director调度器
1,/etc/sysctl.conf --打开ip_forward
2, yum install ipvsadm3,配置调度规则
# ipvsadm -A -t 71.1.1.2:80 -s rr
# ipvsadm -a -t 71.1.1.2:80 -r 81.1.1.3 -g # ipvsadm -a -t 71.1.1.2:80 -r 81.1.1.4 -g [root@localhost ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 71.1.1.2:80 rr -> 81.1.1.4:80 Route 1 0 0 -> 81.1.1.3:80 Route 1 0 0 第三大步:配置真实服务器(web1和web2都要配)
1,安装httpd监听80端口,并使用两个不同的主页方便后面的测试
2,ifconfig lo:0 71.1.1.2 netmask 255.255.255.255 --注意掩码为4个255
3.真实服务器把默认路由指向firewall同物理网段的IP route add default gw 81.1.1.14./etc/sysctl.conf --ip_forward也要打开
--现在去客户端elinks 172.16.232.137,每次都是得到web1# arp -a --去firewall上查看得到的71.1.1.2上的MAC为web1的
? (172.16.232.1) at 00:50:56:C0:00:01 [ether] on eth0 ? (71.1.1.2) at 00:0C:29:55:CC:D7 [ether] on eth1
5, yum install arptables_jf --安装arp防火墙对目录地址为71.1.1.2的包都drop掉
arptables -A IN -d 71.1.1.2 -j DROP --添加这条规则
6,因为ARP的问题会造成firewall的ARP表里过一段时间就没有缓存真实服务器(可以过一段时间在firewall上使用arp -a来查看),所以每台真实服务器都要一定时间ping一下firewall
可以写一个脚本10秒就ping -c 1 81.1.1.1 测试:OK ====================================== 2.6内核的可以不一定要用arptables来解决arp的问题 把上面的第三大步的5,6小步换一种做法 把上面第6小步脚本关闭 去掉第5小步 arptables -F 清掉规则清掉后,在每个real server都要加上下面的内核参数
# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2# sysctl -p使它生效
arp_ignore = 1 --表示系统只回答目的IP是本地的IP的包,也就是对广播包不做响应
arp_announce = 2 --表示系统忽略IP包的源地址,而根据目标主机选择地址 测试:OK 并且在firewall上,使用arp -a,不一定要用real server的MAC地址条目 =================================