1. LVS 简介
1.1 什么是LVS
LVS(Linux Virtual Server) 是一个高度可扩展且高可用的服务器, 构建在真实服务器集群上的, load balancer(负载均衡) 在linux 操作系统上运行, 服务器集群的体系结构对用户透明, 并且用户就像是在于 单个高性能的虚拟服务器交互一样,
1.2 服务器集群系统
传统的没有集群的的服务器 如果性能不足, 就需要使用 '对称多处理'(Symmetric Multi-Processor 简称SMP) 是由多个CPU, 和通过总线共享的内存和I/O 部件组成的计算机系统, SMP 是一种低并行的结构, 是通常所说的'紧耦合多处理系统', 该系统的可扩展能力是有限的, 优点是 单一的系统, 有共享的内存和I/O, 且易编程.
由于SMP 扩展能力有限, SMP 不能够满足高可升缩, 高可用网络服务中 负载能力不断增长需求. 随着负载增长, 会导致服务器不断升级,
- 这种服务器有以下几种不足:
- 升级繁琐, 机器切换会使服务中, 并且原有计算资源浪费
- 越高端单服务器, 升级花费越大
- SMP 服务器 发生单点故障(Single Point of Failure)时, 服务器或应用软件失效, 导致整个服务中断.
通过高性能网络或局域网服务器几圈称为高可升缩, 高可用网络服务的有效结构,
- 这种松耦合的服务器集群的有点:
- 性能: 网络服务工作负载通常是大量相互独立的任务, 通过一组服务器分别操作, 可以获得很高的性能
- 性价比: 通过组 服务器集群可以使用大规模的低成本的服务器.
- 可伸缩性: 集群系统中节点数目可以增长到成千上万个, 伸缩性远超过单个超级计算机.
- 高可用性: 在硬件和软件上都有冗余, 通过检测硬件故障, 将故屏蔽, 由存活节点提供服务, 实现服务的高可用性.
- 服务器集群系统可以实现可伸缩性服务也存在很多需要的操作.
- 透明性(Transperncy)
- 如果高效的使用多个独立服务器组成松耦合的集群系统构建成一个虚拟的服务器, 客户端在于集群交互式, 需要感受像是在与一台高性能服务器交互一样, 客户端不需要任何修改, 部分服务的切入和切出 不会中断服务.
- 性能(Performance)
- 性能需要线性提升, 需要设计很好的软硬件体系结构, 消除系统性能提升时的瓶颈, 降幅在剧呢很难过调度到各个服务器上,
- 高可用性(Availability)
- 需要设计实现很好的系统资源和故障的检测和处理系统, 发现一个模块失败时, 要这个模块上提供服务迁移到其他模块上理想状态下, 这种迁移是 实时, 自动的.
- 可管理性(Manageability)
- 需要使系统易管理, 就像管理单一系统一样,
- 透明性(Transperncy)
1.3 IP 蓄力服务器软件IPVS
在调度器实现技术中, IP 负载均衡技术是效率最高的, 在已有的IP 负载均衡技术中 有通过负载均衡技术中 又通过网络地址转换 NAT(Network Address Translation) 将一组服务器构建成一个高性能, 高可用的虚拟服务器, 称为 VS/NAT 技术, 大多数商业化的IP 负载均衡调度都是使用该方法, 如 LocalDirector, F5的 Big/IP 等等.
由于NAT 缺点和网络非对称性, 就有了通过IP隧道的方法 VS/TUN(IP Tunneling), 和通过直接路由 实现虚拟服务器的方法 VS/DR(Direct Routing), 可以极大提升系统的伸缩性, 所以IPVS 软件实现了这三种IP 负载均衡技术, 原理如下:
-
Virtual Server via Network Address Translation(VA/NAT)
- 通过网络地址转换, 调度器重写请求报文的目标地址, 根据设定的调度算法, 将请求分配到后端真实服务器上, 真实服务器的响应报文通过调度器时, 报文源地址会被重写, 返回给客户端, 完成负载调度过程.
-
Virtual Server via IP Tunneline(VS/TUN)
- 采用NAT 技术时由于请求和响应报文都需要经过调度器重写, 客户端请求越来越多时, 调度器的处理能力会称为系统瓶颈, 为解决该问题, 调度器会把请求报文通过隧道发到真实服务器, 而真实服务器直接返回给客户端, 调度器只处理了请求报文, 一般服务器响应报文会比请求报文大很多, 所以采用 VS/TUN 技术, 集群的吞吐量可以提高很多倍.
-
Virtual Server via Direct Routing(VS/DR)
- VS/DS 通过改写请求报文的MAC 地址. 将请求发送到真实服务器, 二诊室服务IQ响应直接返回给客户端, 和 VS/TUN技术一样, VS/DR 技术可以极大提高集群系统的伸缩性, 这种发发没有VS/TUN 的开销, 队及群众真实服务器也米诶有必要的 IP 隧道协议要求, 但是要求的是 调度器与真实服务器必须在同一个网段中.
1.4 LVS 调度器 负载轮询算法
-
轮询(Round Robin)
- 调度器通过'轮询' 算法将外度请求顺序轮流分配到真实服务器上, 均匀的对待每一个服务器, 不管其实际连接数 或者系统负载.
-
加权轮询(Weighted Round Robin)
- 调度器通过 '加权轮询' 调度算法根据真实服务器不同的处理能力来调度访问请求. 可以保证处理更多的访问流量, 调度器可以自动询问真实服务器的负载情况, 并动态调节其权值.
-
最少连接数(Laster Connections)
- 调度器通过'最少连接数' 调度算法动态将网络请求调度到已建立的链接最少的服务器上, 如果集群系统的真实服务器具有相近的系统性能, 采用'最小链接'算法可以较高的均衡负载.
-
加权最少连接(Weighted Laster Connections)
- 在集群系统中如果服务器性能差异较大, 调度器采用'加权最少连接' 调度算法可以优化 负载均衡性能, 调度器可以自动询问真实服务器负载情况, 并动态调整权值.
-
基于局部性的最小连接(Locality-Based Least Connections)
- 该调度算法是针对目标IP 地址的负载均衡, 目前主要用于Cache 集群, 该算法根据请求的目标IP最近使用的服务器, 如果该服务器时可用的, 并且没有超载, 那么将会将请求转发到该服务器, 如果服务器不存在, 或者服务器超载, 则采用'最少连接'原则.
-
带复制的基于局部的最少连接(Locality-Based Least Connections with Replication)
- 该算法也是针对目标IP 地址的负载均衡, 目前用于 Cache 集群系统中, 和 LBLC 不同的是它 要维护一个目标IP 地址到一组服务器的映射, 而LBLC 维护的是一个目标IP 地址到到一台服务器的映射, 如果服务器没有超载, 将请求发送到服务器, 如果服务器超载则 按照 最小连接.
-
目标地址散列(Destination Hashing)
- 该算法根据请求目标IP 地址, 作为散列键(Hash Key) 从静态分配找到对应的服务器, 如果该服务器可用, 就会将请求发送到该服务器.
-
源地址散列(Source Hashing)
- 该算法是根据源IP 地址, 作为散列键(Hash Key)
1.5 LVS 体系结构
LVS 设计时考虑到系统的透明性, 可伸缩性, 高可用性, 易管理性, 采用了三层结构
- 负载调度器(Load Balancer), 是整个系统对外的前端机, 负责将客户的请求发送到一组服务器上执行, 让客户认为是来自一个IP 地址的(称为VIP)
-服务器池(Server pool), 一组正真执的客户请求的服务器, 执行的服务器有 Web, Mail, FTP, DNS 都可以. - 共享存储(shared storage), 为服务器池提供一个共享的存储区, 这样很容易让服务器拥有相同的内容, 提供相同的服务. 如数据库.
2. LVS 集群的搭建(VS/NAT)
2.1 环境说明
主机名 IP地址 软件
node10009 192.168.10.9 LVS
192.168.20.9
node10011 192.168.20.11 nginx
node10012 192.168.20.12 nginx
VIP 192.168.10.3
2.2 安装ipvsadm 工具
[fangfc@node10009 ~]$ sudo yum -y install ipvsadm
....
Installed:
ipvsadm.x86_64 0:1.27-7.el7
Complete!
[fangfc@node10009 ~]$
- ipvs 工具是一个LVS 的管理工具,
- 常用参数:
-A --Add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录, 新增一台新的虚拟服务器
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录
-D --delete-service 删除 虚拟服务器表 中的一条记录
-C --clear 清除 所有记录
-R --restore 恢复 规则(恢复到上一次保存)
-S --save 保存 规则,
-a --add-server 新怎一条 真实服务器 的记录(增加一台真实服务器)
-e --edit-server 编辑一条 真实服务器记录
-d --delete-server 删除一条 真实服务器记录
-L/-l --list 显示列表
-n --numberic 数字形式显示端口号
-c --connection 显示ipvs 目前存在的连接, 也可以用于分析调度情况
-Z --zero 将转发消息统计清零
-p --persistent 配置持久化时间
--set top tcp udp 配置三个时间
-r --real-server 真实的服务器
-t/-u tcp/udp 协议的虚拟服务
-g/-m/-i LVS 模式 DR/NAT/TUN
-w 配置真实服务器的权重
-s 配置负载均衡算法, 如 rr, wrr, lc
--timeout 显示配置的 超时时间
--stats 显示历史转发消息统计(累加值)
--rate 显示转发速率信息(瞬时)
2.3 集群搭建
- LB 上设置
- 搭建步骤
1. 在 eth0 绑定网卡 VIP 地址
2. 清除当前LVS规则
3. 设置 tcp, tcpfin, udp 链接超时时间
4. 添加虚拟服务, -t指定虚拟服务的IP 端口, -s 指定调度算法,
5. 将虚拟服务关联到真实服务上,
- 配置VIP地址
[root@node10009 ~]# ip addr add 192.168.10.3/24 dev ens33
[root@node10009 ~]# ip a s ens33 | grep inet
inet 192.168.10.9/24 brd 192.168.10.255 scope global ens33
inet 192.168.10.3/24 scope global secondary ens33
inet6 fe80::20c:29ff:fe8f:4e4a/64 scope link
[root@node10009 ~]#
- 配置转发
[root@node10009 ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@node10009 ~]# vim /etc/sysctl.conf
- 配置lvs
[root@node10009 ~]# ipvsadm -C
[root@node10009 ~]# ipvsadm --set 30 5 60
[root@node10009 ~]# ipvsadm -A -t 192.168.10.3:80 -s rr -p 20
[root@node10009 ~]# ipvsadm -a -t 192.168.10.3:80 -r 192.168.10.11:80 -m
[root@node10009 ~]# ipvsadm -a -t 192.168.10.3:80 -r 192.168.10.12:80 -m
[root@node10009 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.3:80 rr persistent 20
-> 192.168.10.11:80 Masq 1 0 0
-> 192.168.10.12:80 Masq 1 0 0
[root@node10009 ~]#
- Real Server 设置
- 所有的 Real Server 配置DR 模式都需要 配置 网关为 LB 的内网ip
- node10011
[fangfc@node10011 ~]$ ip route
default via 192.168.20.9 dev ens34 proto static metric 100
192.168.20.0/24 dev ens34 proto kernel scope link src 192.168.20.11 metric 100
[fangfc@node10011 ~]$
[fangfc@node10011 ~]$ ip a show ens34 | grep inet
inet 192.168.20.11/24 brd 192.168.20.255 scope global noprefixroute ens34
inet6 fe80::5a3a:3ec1:9021:6f0c/64 scope link noprefixroute
[fangfc@node10011 ~]$
- node10012
[root@node10012 ~]# ip route
default via 192.168.20.9 dev ens34 proto static metric 100
192.168.20.0/24 dev ens34 proto kernel scope link src 192.168.20.12 metric 100
[root@node10012 ~]# ip a show ens34 | grep inet
inet 192.168.20.12/24 brd 192.168.20.255 scope global noprefixroute ens34
inet6 fe80::dcae:3aca:a26:ea64/64 scope link noprefixroute
[root@node10012 ~]#
2.4 测试
END