简介
LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项目,它的官方站点是 www.linuxvirtualserver.org 。
现在 LVS 已经是 Linux 标准内核的一部分,在 Linux2.4 内核以前,使用 LVS 时必须要重新编译内核以
支持 LVS 功能模块,但是从 Linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打
任何补丁,可以直接使用 LVS 提供的各种功能。
LVS 主要用于服务器集群的负载均衡。其优点有:
1.工作在网络层,可以实现高性能,高可用的服务器集群技术。
2.廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
3.易用,配置非常简单,且有多种负载均衡的方法。
4.稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。
5.可扩展性也非常好!
安装配置
linux 内核 2.4 版本以上的基本都支持 LVS ,要使用 lvs ,只需要再安装一个 lvs 的管理工具: ipvsadm
yum install ipvsadm
ipvsadm 用法
其实 LVS 的本身跟 iptables 很相似 , 而且连命令的使用格式都很相似 , 其实 LVS 是根据 iptables 的框架开
发的 , 那么 LVS 的本身分成了两个部分:
第一部分是工作在内核空间的一个 IPVS 的模块,其实 LVS 的功能都是 IPVS 模块实现的,
第二部分是工作在用户空间的一个用来定义集群服务的一个工具 ipvsadm, 这个工具的主要作用是将管理员
定义的集群服务列表传送给工作在内核空间中的 IPVS 模块,下面来简单的介绍下 ipvsadm 命令的用法
ipvsadm 组件定义规则的格式:
virtual-service-address: 是指虚拟服务器的 ip 地址
real-service-address: 是指真实服务器的 ip 地址
scheduler :调度方法
ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h
命令选项解释:有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。
-A --add-service # 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service # 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service # 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear # 清除内核虚拟服务器表中的所有记录。
-R --restore # 恢复虚拟服务器规则
-S --save # 保存虚拟服务器规则,输出为 -R 选项可读的格式
-a --add-server # 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server # 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server # 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list # 显示内核虚拟服务器表
-Z --zero # 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp # 设置连接超时值
--start-daemon # 启动同步守护进程。他后面可以是 master 或 backup ,用来说明 LVS Router 是 master
或是 backup 。在这个功能上也可以采用 keepalived 的 VRRP 功能。
--stop-daemon # 停止同步守护进程-h --help # 显示帮助信息
#其他的选项 :
-t --tcp-service service-address # 说明虚拟服务器提供的是 tcp 的服务 [vip:port] or [real-server-ip:port]
-u --udp-service service-address # 说明虚拟服务器提供的是 udp 的服务 [vip:port] or [real-server-
ip:port]
-f --fwmark-service fwmark # 说明是经过 iptables 标记过的服务类型。
-s --scheduler scheduler # 使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, 默认的
调度算法是: wlc.
-p --persistent [timeout] # 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台
真实的服务器处理。 timeout 的默认值为 300 秒。
-M --netmask # 子网掩码
-r --real-server server-address # 真实的服务器 [Real-Server:port]
-g --gatewaying 指定 LVS 的工作模式为直接路由模式(也是 LVS 默认的模式)
-i --ipip # 指定 LVS 的工作模式为隧道模式
-m --masquerading # 指定 LVS 的工作模式为 NAT 模式
-w --weight weight # 真实服务器的权值
--mcast-interface interface # 指定组播的同步接口
-c --connection # 显示 LVS 目前的连接 如: ipvsadm -L -c
--timeout # 显示 tcp tcpfin udp 的 timeout 值 如: ipvsadm -L --timeout
--daemon # 显示同步守护进程状态
--stats # 显示统计信息
--rate # 显示速率信息
--sort # 对虚拟服务器和真实服务器排序输出
--numeric -n # 输出 IP 地址和端口的数字形式
LVS 三种工作模式:NAT(地址转换)、DR(直接路由)、TUN(隧道)
DR:直接路由:
工作方式:
1, 首先用户用 CIP 请求 VIP
2, 根据上图可以看到,不管是 Director Server 还是 Real Server 上都需要配置 VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为 CIP 目标地址为 VIP,此时路由器会发广播问谁是 VIP,那么我们集群中所有的节点都配置有 VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定 VIP 就是 Director Server,或者使用一种机制不让Real Server 接收来自网络中的 ARP 地址解析请求,这样一来用户的请求数据包都会经过 Director Servrer
3,当 Director Server 收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台 Real Server 上去,假如说此时根据调度算法的结果,会将请求负载到 RealServer 1 上面去,此时 Director Server 会将数据帧中的目标 MAC 地址修改为 Real Server1 的 MAC 地址,然后再将数据帧发送出去
4,当 Real Server1 收到一个源地址为 CIP 目标地址为 VIP 的数据包时,Real Server1 发现目标地址为VIP,而 VIP 是自己,于是接受数据包并给予处理,当 Real Server1 处理完请求后,会将一个源地址为 VIP 目标地址为 CIP 的数据包发出去,此时的响应请求就不会再经过 Director Server 了,而是直接响应给用户。
部署:
1.先修改yum源
2.安装ipvsadm
yum install ipvsadm
3.Director Server : server1
添加VIP:
ip addr add 172.25.1.100/24
4.Real Server: server2 server3
同时添加VIP:
ip addr add 172.25.1.100/32
同时开启httpd服务
5.在 Server1 上做以下配置
##此时测试发现不会轮循发现谁先抢到显示谁
此时我们需要安装arptables
yum install arptables_jf.x86_64 -y
测试:
TUN(隧道)
原理:
(a) 当用户请求到达 Director Server,此时请求的数据报文会先到内核空间的
PREROUTING 链。 此时报文的源 IP 为 CIP,目标 IP 为 VIP 。
(b) PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
© IPVS 比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层
IP 报文,封装源 IP 为为 DIP,目标 IP 为 RIP。然后发至 POSTROUTING 链。 此时源 IP
为 DIP,目标 IP 为 RIP
(d) POSTROUTING 链根据最新封装的 IP 报文,将数据包发至 RS(因为在外层封装多了
一层 IP 首部,所以可以理解为此时通过隧道传输)。 此时源 IP 为 DIP,目标 IP 为 RIP
(e) RS 接收到报文后发现是自己的 IP 地址,就将报文接收下来,拆除掉最外层的 IP 后,
会发现里面还有一层 IP 首部,而且目标是自己的 lo 接口 VIP ,那么此 时 RS 开始处理此
请求,处理完成之后,通过 lo 接口送给 eth0 网卡,然后向外传递。 此时的源 IP 地址为
VIP,目标 IP 为 CIP
(f) 响应报文最终送达至客户端
LVS-Tun 模型特性
RIP 、 VIP 、 DIP 全是公网地址
RS 的网关不会也不可能指向 DIP
所有的请求报文经由 Director Server ,但响应报文必须不能进过 Director Server
不支持端口映射
RS 的系统必须支持隧道
部署:
1.在server1,server2,server3添加模块
modprobe ipip
2.在server1上添加ip
ip addr add 172.25.1.100/24 dev tunl0
3.在server2,server3上添加ip
ip addr add 172.25.1.100/32 dev tunl0
4…在 Server1 上做以下配置
5.在server2,server3上配置:
测试:
NAT(地址转换):
这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的 IP 为 VIP),根据调度算法决定将请求发送给哪个 后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标 IP 地址及端口改成后端真实服务器的 IP 地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT 模式下我们需要把 RS的默认路由设置为 LB 服务器。)把响应后的数据包发送 给 LB,LB 再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
原理图简述:
- 客户端请求数据,目标 IP 为 VIP
- 请求数据到达 LB 服务器, LB 根据调度算法将目的地址修改为 RIP 地址及对应端口(此 RIP 地址是根据调度算法得出的。)并在连接 HASH 表中记录下这个连接。
- 数据包从 LB 服务器到达 RS 服务器 webserver ,然后 webserver 进行响应。 Webserver 的网关必须是LB ,然后将数据返回给 LB 服务器。
- 收到 RS 的返回后的数据,根据连接 HASH 表修改源地址 VIP& 目标地址 CIP ,及对应端口 80. 然后数据就从 LB 出发到达客户端。
- 客户端收到的就只能看到 VIP\DIP 信息。
NAT 模式优缺点:
1 、 NAT 技术将请求的报文和响应的报文都需要通过 LB 进行地址改写,因此网站访问量比较大的时候LB 负载均衡调度器有比较大的瓶颈,一般要求最多之能 10-20 台节点
2 、只需要在 LB 上配置一个公网 IP 地址就可以了。
3 、每台内部的节点服务器的网关地址必须是调度器 LB 的内网地址。
4 、 NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。