lvs: linux virtual server linux虚拟服务的缩写,通过一台调度服务器来调度收到的请求并分发给后端的real server,实现负载均衡集
群的作用
常见的调度算法
静态:
RR:round robin 轮询,逐个调度
WRR: weighted round robin 加权轮询,按照事先设置好的比例前提下的轮询
DH: destination hashing 目标地址哈希,对目标地址做hash,将对同一个资源的访问都指向同一台服务器
SH: source hashing 源地址哈希,对源地址做hash,将同一个来源ip的请求都发送到同一台服务器上,实现session绑定
动态:
LC: least connected 最小连接 inactive+active*256
WLC: weighted least connected 加权最少连接 (inactive+active*256)/weight
SED: shortest expected delay 最短期望延迟 (active+1)*256/weight
NQ: never queue 永不排队,第一次按照SED的算法来计算,之后的按照(inactive+active*256+1)*weight来计算
三种模型:
NAT:通过将请求报文的目标地址和目标端口修改为挑选出某RS的RIP和PORT来实现
(1) RIP和DIP应该使用私网地址,RS(real server)的网关应该指向DIP
(2) 请求和响应报文都要经过DIRECTOR转发,极高负载的场景中,DIRECTOR可能会成为性能瓶颈
(3) 支持端口映射
(4) DIRECTOR必须为linux,RS可以是任意的OS
(5) RS的RIP与DIRECTOR的DIP必须在同一IP网络,DIRECTOR必须有两块网卡,地址分别为VIP和DIP
NAT的示意图
lvs-dr: derect routing
通过修改请求报文的MAC地址进行转发,IP首部不会发生变化(因此不支持端口映射),在整个过程中源IP始终是CIP(client ip),目标地
址始终为VIP(virtual ip),VIP就是接受用户请求的公网地址
(1) 确保前端路由器将目标IP为VIP的请求报文一定会发送给Director
解决方法:修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应
(2) 在这种模型当中RS直接响应客户,而不需要经过Director,因此RS返回给客户端的源地址必须是客户端请求的VIP地址
(3) RS的RIP可以使用私有地址,也可以使用公网地址
(4) RS和Director必须是在同一物理网段中,因为调度是通过MAC地址进行转发的,director只需要一块网卡
(5) RS可以使用大多数的OS(因为前面提到了要修改内核参数)
DR的示意图:
一般用的是DR模型,还有两种模型此处不做介绍了
ipvs的集群服务:
四层交换(四层路由)
支持tcp,udp,sctp,ah,esp,ah_esp
(1) 一个ipvs主机可以同时定义多个cluster service
(2) 一个ipvs服务至少应该有一个RS
ipvsadm/ipvs ipvs在内核中,ipvsadm可以在命令行中使用
可以使用grep -i -C 3 "ip_?vs" /boot/config-2.6.32-573.el6.x86_64命令查看内核是否支持ipvs,centos5,6,7默认都支持
使用yum -y install ipvsadm命令安装ipvsadm
ipvsadm -L -n 显示集群服务
ipvsadm命令的用法,可以使用man ipvsadm查看
管理集群服务:ipvsadm -A|E -t|u|f service-address [-s scheduler]
ipvsadm -D -t|u|f service-address
-A:添加
-E:修改
-D:删除
service-address:
-t, tcp, ip:port
-u, udp, ip:port
-f, fwm, MARK
-s scheduler: 默认为wlc
管理集群上的RS:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
-a: 添加一个RS
-e: 修改一个RS
-d: 删除一个RS
server-address: ip[:port] 端口可省略
-g: GATEWAY(默认)
-i: IPIP
-m: MASQUERADE
查看:ipvsadm -L
-n: 数字格式显示地址和端口
-c: connection 显示ipvs连接
--stats: 显示统计数据
--rate: 速率
--exact: 精确值
保存和重载:
保存:ipvsadm -S > /PATH/TO/SOMEFILE或者 ipvsadm-save > /PATH/TO/SOMEFILE
重载:ipvsadm -R < /PATH/TO/SOMEFILE 或者 ipvsadm-restore < /PATH/TO/SOMEFILE
清空规则:ipvsadm -C
计数器清零:ipavsadm -Z [-t|u|f service-address]
配置lvs的DR模型,首先将vip配置到Director的网卡别名
ifconfig eth0:0 192.168.204.100 netmask 255.255.255.255 broadcast 192.168.204.100 up
上面的掩码必须是那种形式,并且只能广播给自己
接下来在RS上设置内核参数:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
只回答目标IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使 eth0收到来
自10.1.1.2这样地址发起的对192.168.0.1
的查询会回答,而对10.1.1.1 的arp查询不会回应)
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
接下来在RS的lo网卡的的别名上配置192.168.204.100
ifconfig lo:0 192.168.204.100 netmask 255.255.255.255 broadcast 192.168.204.100 up
route add -host 192.168.204.100 dev lo:0
上面的内核参数和lo:0的配置以及添加路由需要在每台RS上执行