lvs调度算法
lvs的调度算法决定了如何在集群点之间分布工作负荷。当director调度器收到来自客户端访问vip的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。director调度器用的调度方法基本分为两类:
固定调度算法:rr 、 wrr 、dh 、 sh
动态调度算法:wlc 、lc 、lblc 、lblcr
rr:轮询算法,它将请求依次分配给不同的rs节点,也就是rs节点中均摊分配。这种算法简单,但只适合rs节点处理性能差不多的情况
wrr :加权轮训调度,它将依据不同rs的权值分配任务。权值较高的rs将优先获得任务,并且分配到的连接数就爱哪个比权值低的rs更多。相同权值的rs得到相同数目的连接数
wlc :加权最小连接数调度,假设各台rs的全职依次为wi,当前tcp连接数依次为ti。依次yi/wi为最小的rs作为下一个分配的rs
dh :目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的rs
sh :源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的rs
lc :最小连接数调度(least-connerction),lpvs表存储了所有活动的连接。lb会比较将连接请求
lblc :基于地址的最小连接数调度(locality-based least-connection):将来自同一个 目的地址的请求分配给同一台rs,此时这台服务器是尚未满负荷的。否则就将这个请求cality-based least-connection):将来自同一个 目的地址的请求分配给同一台rs,此时这台服务器是尚未满负荷的。否则就将这个请求 配给连接数最小的rs,并以它作为 下一次分配的首先考虑
lvs有三种模式:nat模式(LVS/NAT),直接路由模式( LVS/DR),ip隧道模式(LVS/TUN)
以及二度开发的第四种模式(FULL NAT)
DR直接路由模式
原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客
三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡(172.16.254.200) 和一个内网ip(192.168.0.8),两个 real server 上只有内网 ip (192.168.0.18) 和 (192.168.0.28),并且需要把两个 real server 的内网网关设置为 director 的内网 ip(192.168.0.8)
2、安装和配置
两个 real server 上都安装 nginx 服务
yum install -y nginx
Director 上安装 ipvsadm
yum install -y ipvsadm
Director 上编辑 nat 实现脚本
复制代码
vim /usr/local/sbin/lvs_nat.sh
编辑写入如下内容:
#! /bin/bash
director服务器上开启路由转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
关闭 icmp 的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
director设置 nat 防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
director设置 ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 172.16.254.200:80 -s wrr
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.18:80 -m -w 1
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.28:80 -m -w 1
复制代码
保存后,在 Director 上直接运行这个脚本就可以完成 lvs/nat 的配置
/bin/bash /usr/local/sbin/lvs_nat.sh
查看ipvsadm设置的规则
ipvsadm -ln
3、测试LVS的效果
通过浏览器测试2台机器上的web内容 http://172.16.254.200 。为了区分开,我们可以把 nginx 的默认页修改一下:
在 RS1 上执行
echo "rs1rs1" >/usr/share/nginx/html/index.html
在 RS2 上执行
echo "rs2rs2" >/usr/share/nginx/html/index.html
NAT模式
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。
在之前的DR模式下接着操作
三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡(172.16.254.200) 和一个内网ip(192.168.0.8),两个 real server 上只有内网 ip (192.168.0.18) 和 (192.168.0.28),并且需要把两个 real server 的内网网关设置为 director 的内网 ip(192.168.0.8)
2、安装和配置
两个 real server 上都安装 nginx 服务
yum install -y nginx
Director 上安装 ipvsadm
yum install -y ipvsadm
Director 上编辑 nat 实现脚本
复制代码
vim /usr/local/sbin/lvs_nat.sh
编辑写入如下内容:
#! /bin/bash
director服务器上开启路由转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
关闭 icmp 的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
director设置 nat 防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
director设置 ipvsadm
IPVSADM='/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 172.16.254.200:80 -s wrr
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.18:80 -m -w 1
$IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.28:80 -m -w 1
复制代码
保存后,在 Director 上直接运行这个脚本就可以完成 lvs/nat 的配置
/bin/bash /usr/local/sbin/lvs_nat.sh
查看ipvsadm设置的规则
ipvsadm -ln
3、测试LVS的效果
通过浏览器测试2台机器上的web内容 http://172.16.254.200 。为了区分开,我们可以把 nginx 的默认页修改一下:
在 RS1 上执行
echo "rs1rs1" >/usr/share/nginx/html/index.html
在 RS2 上执行
echo "rs2rs2" >/usr/share/nginx/html/index.html
注意,切记一定要在两台 RS 上设置网关的 IP 为 director 的内网 IP。