duang!duang!duang!今天开始写服务高可用之lvs。
回顾一下,我们一般服务集群可分为以下三种:
1.负载均衡集群,如lvs,nginx(7层负载),haproxy(4层,7层都可以)等
2.高可用集群,如keepalive,heartbeat组成的高可用,数据自身的主从高可用,主主高可用
3.高性能集群,如某些运算工作站
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。lvs是根据TCP/IP4层协议,依赖内核的netfilter,工作在INPUT链上,实现4层负载,突破了套接字的限制,具有强大的并发能力。由于它不关心服务是否可用,在轮询等算法中,前端访问服务时,会出现固定比例的访问不可达,没有冗余功能。
lvs工作模式可分为:
1.nat,多目标DNAT,顾名思义,目标地址转换,修改请求报文的目标地址(有时也会修改端口),转发给后端服务器。
2.dr,直接路由,修改请求报文的目标mac地址,转发给同网段服务器。
3.tun,隧道,不修改请求报文的IP首部,在原有的IP首部上,再封装一个IP首部,有可能会突破mut的限制,可能有一些手段限制请求包的大小。
lvs支持的算法:
1.rr,轮询,根据ipvsadm管理表里面的次序,依次循环分配请求,绝对公平
2.wrr,加权轮询,根据服务性能设置权重,根据权重比例分配请求,手握权重,我优先
3.sh,源地址hash,把来自同一IP的请求始终分配同一RS主机,可以实现类似session会话保持功能
4.dh,目标地址hash,对同一目标请求始终分配给同一RS主机,实现类似提高缓存命中功能
上面4种为静态算法。何为静态呢?是指,前端负载,不管后端服务的性能差异,始终我行我素的按照规则分配,根据现实社会规律,当人数太多,而每个人的能力强弱不一样,平均分配会使能力差的人不太公平,古人云,能者多劳。于是有了下面的算法;
5.lc,最少链接,最少的家伙优先分配,公式:活动链接数*256+非活动链接数之和
6.wlc,加权最少链接,lc升级版,权重大的优先分配,公式:(活动链接数*256+非活动链接数)/权重
7.sed,最短期望延迟,公式:(活动链接数+1)*256/权重
8.nq,按照权重大小一次分配,再按照sed算法
9.lblc,基于本地最小链接的目标地址hash,即为动态DH算法,先LC,再DH,目前主要用于Cache集群系统
10.lblcr,带复制功能的LBLC
ipvs管理工具:ipvsadm
常用命令:
添加服务:ipvsadm -A -t 192.168.0.50:80 -s rr
修改服务:ipvsadm -E -t
192.168.0.50:80 -s wrr
保存服务:ipvsadm-save = ipvsadm -S
载入服务:ipvsadm-restore =ipvsadm -R
添加RS:ipvsadm -a -t 192.168.0.50:80 -r 172.16.1.90 -m -w 1 (-m为nat工作模式)
修改RS:ipvsadm -e -t 192.168.0.50:80 -r 172.16.1.90 -g -w 1 (-g为dr工作模式)
显示链接报文数: ipvsadm -L -n --stats
由于ipvs是工作在内核上的,我们只需要安装ipvsadm,往ipvs上面写规则就是了。
yum install -y ipvsadm
基于nat工作模式的lvs
在lvs服务端,清空iptables规则,准备2台httpd服务器
在服务端添加
iptables -F
ipvsadm -A -t
172.16.2.10:80 -s rr
ipvsadm -a -t
172.16.2.10:80 -r 172.16.1.90 -g -w 1
ipvsadm -a -t
172.16.2.10:80 -r 172.16.1.91 -g -w 1
基于dr工作模式lvs
服务端配置:
iptables
-F
ifconfig
eth0:0 172.16.2.10 up
route add
-host 172.16.2.10 dev eth0:0
添加ipvs命令
ipvsadm -A -t
172.16.2.10:80 -s rr
ipvsadm -a -t
172.16.2.10:80 -r 172.16.1.90 -g -w 1
ipvsadm -a -t
172.16.2.10:80 -r 172.16.1.91 -g -w 1
所有客户端配置:
先定义参数:
echo 2 >
/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >
/proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 >
/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >
/proc/sys/net/ipv4/conf/eth0/arp_ignore
在lo上配置ip别名
ifconfiglo:0 172.16.2.10/32 broadcast 172.16.2.10 up
添加lo到网卡的路由
route add
-host 172.16.2.10 dev lo:0