1、描述以及工作原理
(1)什么是LVS
linux virtural server的简称,也就是linxu虚拟机服务器,这是一个由章文嵩博士发起的开
源项目,官网是http://www.linuxvirtualserver.org,现在lvs已经是linux内核标准的一
部分,使用lvs可以达到的技术目标是:通过Linux达到负载均衡技术和Linux操作系统实现一个
高性能高可用的linux服务器集群,他具有良好的可靠性,可延展性和可操作性,从而以低廉的成
本实现最优的性能,Lvs是一个实现负载均衡集群开源软件项目,lvs从逻辑上可以分为调度层,
server集群层,和共享存储免费,开源,四层负载均衡
2、LVS调度算法
(1)静态调度算法 Fixed Scheduling Method
1.1 轮询
RR 轮询 **
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
1.2加权轮询
WRR 加权轮询 **
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。 这样可以保证处理能力强的服务器处理更多的访问流量。调度器 可以自动问询真实服务器的负载情况,并动态地调整其权值
1.3目标地址hash
DH 目标地址hash **
算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。
目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
1.4源地址hash
SH 源地址hash*
算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是 可用的且未超载,将请求发送到该服务器,否则返回空。
它采用的散列函数与目标地址散列调度算法的相同。除了将请求的目标IP地址换成请求的源IP地址外,它的算法流程与目标地址散列调度算法的基本相似。在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
(2)动态调度算法Dynamic Scheduling Method 动态调度方法
2.1 Lc最少链接
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
2.2 wlc加权最少链接
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化
负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动
问询真实服务器的负载情况,并动态地调整其权值。
2.3 sed最少期望延迟
基于wlc算法,举例说明:ABC三台机器分别权重123,连接数也分别是123,name如果使用WLC算法的话一个新请求 进入时他可能会分给ABC中任意一个,使用SED算法后会进行这样一个运算
A:(1+1)/2
B:(1+2)/2
C:(1+3)/3
根据运算结果,把连接交给C
2.4 nq从不排队调度算法
无需列队,如果有台realserver的连接数=0 就直接分配过去,不需要进行sed运算
2.5 lblc基于本地最少链接
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该 目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;
若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
2.6 lblcr带复制的基于本地的最少链接
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同 之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,
若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一 台服务器 将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
3、LVS的工作原理
1. 当用户向负载均衡调度器(director server)发起请求,调度器将请求发往内核空间
2. prerouting链首先会接受到用户请求,判断目标ip确定是本机ip,将数据包发往input链
3. IPVS是工作在input链上的,当用户请求到达input时,ipvs会将用户请求和自己定义好的集群服务器进行比对,如果用户请求就是定义的集群服务,那么此时ipvs会强行修改数据包里的目标ip地址以及端口,并将新的数据包发往POSTROUTING链,
4. POSTROUTING链接收到数据包后,发现目标ip地址刚好是自己的后端服务器,那么通过选
路,将数据包最终发送给后端服务器
4、组成以及相关术语
(1)、组成
1.1 ipvs
ip virtual server,一段代码工作在内核空间,ipvs,是真正生效实现调度的代码(类似nginx中的proxy_pass),
1.2 ipvsadm
另一段是工作在用户空间,ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,谁是后端真正的服务器(real server)类似nginx中的upstream
1.3 lvs组成
(2)、术语
1. DS Dlrector Server前端负责均衡节点(负载均衡服务器)
2. RS real server 后端真实工作服务器(web服务器)
3. vip向外部直接面向用户请求,作为用户请求的目标ip地址(负载均衡的ip地址,提供给用户)
4. DIP Director Server lp 和内部主机通讯的ip地址(负责与Real Server交互的内部lp)
5. RIP Real Server lp 后端服务器ip地址
6. CIP client IP访问客户端ip地址
5、三种工作模式
1 .* LVS-NAT模式
2. *LVS-DR模式
3. Lvs-Tun模式(隧道模式)
6、NAT模式的工作原理
1. 用户请求ds,此时请求的报文会先到内核空间prerouting链,此时报文ip为pip,目标ip为vip
2. prerouting检测发现数据包目标ip是本机,将数据包送到input链
3. ipvs对比数据包请求的服务是否为集群服务,如果是,修改数据包的目标ip地址为后端服务器的IP地址,然后将数据包发送给POSTROUTING链,此时报文ip为cip,目标ip为rip
4. POSTROUTING通过选路,将数据发送给Real Server
5. RealServer对比发现目标ip为自己的ip,开始构建响应报文发回给Director Server此时报文的源ip为RIP,目标ip为CIP
6. Derector Server在响应客户端前,会将源ip地址修改为自己的VIP,然后响应给客户端,目标ip为cip,此时报文源IP为VIP,目标ip为cip
(1)NAT模型的特性
1. Rs应该是私有地址,Rs网关必须指向DIP
2. DIP和RIP必须在同一个网段内
3. 请求和响应报文都应该经过Director Server,高负载场景中Director Server容易成为性能瓶颈
4. 支持端口映射
5. Rs可是使用任意操作系统
6.缺陷,对Ds压力会比较大,请求和响应都需要经过ds,
7、NAT模式实战环境准备
1.环境规划
角色 作用 IP NAT 负载均衡调度器DS 内网:(DIP ens36 192.168.8.169),外网:(VIP ens33 192.168.8.167) web01 真实web服务器RS 192.168.8.166 web02 真实web服务器RS 192.168.8.168 DNS 用来解析各主机的域名和ip地址 192.168.8.147 client 测试 192.168.8.170 给NAT主机增加一张网卡,命名为ens37,自动或者手工获取ip均可,理论上nat对应ds服务器应该有两张网卡(vip,dip)vip对外服务,需要使用公网ip,dip内网局域网,使用虚拟机使用仅主机模式,也可以用桥接模式和nat模式都可
2. 步骤
2.1 在NAT调度器配置两个网卡和两个IP地址
正常来说应该配置两个不同的网段的IP,一个对外的VIP,一共对内的dip,现在主要使用nat的网络模式,可以配置桥接模式对外,nat对内,(不方便所以都是配置nat模式,但是要分清楚那个IP是对内,那个对外,在物理主机上都要ping通)
C:\Users\89765>ping 192.168.8.167正在 Ping 192.168.8.167 具有 32 字节的数据: 来自 192.168.8.167 的回复: 字节=32 时间<1ms TTL=64 来自 192.168.8.167 的回复: 字节=32 时间<1ms TTL=64 来自 192.168.8.167 的回复: 字节=32 时间<1ms TTL=64192.168.8.167 的 Ping 统计信息:数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位):最短 = 0ms,最长 = 0ms,平均 = 0msC:\Users\89765>ping 192.168.8.169正在 Ping 192.168.8.169 具有 32 字节的数据: 来自 192.168.8.169 的回复: 字节=32 时间<1ms TTL=64 来自 192.168.8.169 的回复: 字节=32 时间<1ms TTL=64192.168.8.169 的 Ping 统计信息:数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位):最短 = 0ms,最长 = 0ms,平均 = 0ms
2.2 web01和web02下载nginx
yum -y install epel-release
yum -y install nginx
2.3 配置dns服务器
lxe.com
web01 192.168.8.166
web02 192.168.8.168
nat 192.168.8.167
dns 192.168.8.147
# 安装bind的
yum -y install bind
#配置主配置文件
vim /etc/named. conf# 配置zones文件
vim /etc/named.rfc ... zones
# 配置zone文件
vim /var/named/ ... zone
# 同步时间
# 启动服务
[root@dns ~]# vim /etc/named.rfc1912.zones
43 zone "lxe.com" IN {44 type master;45 file "lxe.com.zone";46 allow-update { none; };47 };
[root@dns ~]# vim /etc/named.conf
listen-on port 53 { 127.0.0.1;any; };allow-query { localhost;any; };
[root@dns ~]# cd /var/named/
[root@dns named]# cp -p named.localhost lxe.com.zone
[root@dns named]# vim lxe.com.zonenat A 192.168.8.167 ds A 192.168.8.169 web01 A 192.168.8.166 web02 A 192.168.8.168
[root@dns named]# named-checkconf /etc/named.conf
[root@dns named]# named-checkconf /etc/named.rfc1912.zones
[root@dns named]# named-checkzone lxe.com.zone lxe.com.zone
zone lxe.com.zone/IN: loaded serial 0
OK
[root@dns named]# systemctl start named
[root@dns named]# systemctl enable named
2.4 客户端
[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.8.147 #DNS服务器的地址
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
DNS1=192.168.8.147
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ping nat.lxe.com PING nat.lxe.com (192.168.8.167) 56(84) bytes of data. 64 bytes from 192.168.8.167 (192.168.8.167): icmp_seq=1 ttl=64 time=0.234 ms 64 bytes from 192.168.8.167 (192.168.8.167): icmp_seq=2 ttl=64 time=0.233 ms
2.5 nat服务器
[root@lvs ~]# echo "nameserver 192.168.8.147" > /etc/resolv.conf
[root@lvs ~]# ping nat.lxe.com PING nat.lxe.com (192.168.8.167) 56(84) bytes of data. 64 bytes from lvs (192.168.8.167): icmp_seq=1 ttl=64 time=0.013 ms 64 bytes from lvs (192.168.8.167): icmp_seq=2 ttl=64 time=0.030 ms
2.6 配置时间同步服务器
[root@lvs ~]# yum -y install ntpdate.x86_64
[root@lvs ~]# crontab -e
* 2 * * * /usr/sbin/ntpdata cn.ntp.org.cn
[root@lvs ~]# yum -y install ntp
[root@lvs ~]# systemctl start ntpd
[root@lvs ~]# systemctl enable ntpd
3.配置规则
[root@lvs ~]# yum -y install ipvsadm.x86_64
[root@lvs ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lvs ~]# ipvsadm -C #清空以往规则
[root@lvs ~]# ipvsadm -L #
[root@lvs ~]# ipvsadm -A -t 192.168.8.167:80 -s rr #添加轮询 -A是对外网的
[root@lvs ~]# ipvsadm -L -n
TCP 192.168.8.167:80 rr
[root@lvs ~]# ipvsadm -a -t 192.168.8.169:80 -r 192.168.8.166:80 -m #-a 对内网 后面是web01
[root@lvs ~]# ipvsadm -a -t 192.168.8.169:80 -r 192.168.8.168:80 -m