集群方式
负载均衡 LB load balance
高可用 HA high avavilable
高性能计算
负载均衡集群
一般用于请求负载分发,也就是按一定的算法把不同的请求调度给不同的节点,
这些节点提供的都是相同的服务。解决单台服务器压力过大的问题。
调度器
node1 node2 node3
常用的负载均衡方式
1。手动选择 如:下载网站很多镜像站点
2。DNS轮询方式 对同一个域名加多条A记录
dig www.sina.com
可靠性低
负载分配不均衡
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 = 1
sysctl -p 使之生效
安装ipvsadm
yum install ipvsadm
ipvsadm - 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.135
2,安装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 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.1
4./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地址条目
=================================
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com