LVS 的英文全称是 Linux Virtual Server, 即 Linux 虚拟服务器.
特点
跨平台: Windows,Linux
作用
实现负载均衡
核心组件
ip_vs:Linux 的内核功能模块, 工作在内核, 依赖该内核模块实现负载均衡功能
ipvsadm: 应用层程序, 该程序可以和内核中的 ip_vs 模块通信, 实现对负载均衡的管理和控制
优点
LVS 主要用于多服务器的负载均衡. 它工作在网络层, 可以实现高性能, 高可用的服务器集群技术. 它廉价, 可把许多低性能的服务器组合在一起形成一个超级服务器. 它易用, 配置非常简单, 且有多种负载均衡的方法. 它稳定可靠, 即使在集群的服务器中某台服务器无法正常工作, 也不影响整体效果. 另外可扩展性也非常好.
补充
keepalived 也可以对 ip_vs 进行管理
2. 相关术语
1. DS:Director Server. 指的是前端负载均衡器节点.
2. RS:Real Server. 后端真实的工作服务器.
3. VIP: 向外部直接面向用户请求, 作为用户请求的目标的 IP 地址.
4. DIP:Director Server IP, 主要用于和内部主机通讯的 IP 地址.
5. RIP:Real Server IP, 后端服务器的 IP 地址.
6. CIP:Client IP, 访问客户端的 IP 地址.
3.LVS 的工作模式
- DR
- NAT
- TUN
- FULLNAT
4.LVS 的调度算法
[所谓的算法: DR 按照什么规则来从多个 RS 中筛选出来一个给用户提供服务]
动态算法: DR 会实时的检测后端的 RS 的负载情况, 将新用户的请求调度到一个负载较少的 RS 之上
静态算法: 无论后端的 RS 当前的服务器负载情况怎么样, 都安装固定的方式来给 RS 分配用户请求
静态算法
rr:Round Bobin, 轮询, 将客户端的请求交替分配给 RS
wrr:Weighted Round Bobin, 加权轮询, 根据 RS 的性能不同, 让他们来承担不同比例的用户请求
dh:Destination Hashing, 目标地址哈希调度, 基于用户所请求的地址做哈希表
作用: 实现将对于相同的地址 (rs) 的请求调度到同一个 RS 之上
使用场景: 适应于前端是一个 DR, 后端是多个 cache 的时候
sh:Source Hashing, 源地址的哈希调度, 基于用户的 ip 地址做哈希表
作用: 实现将同一个客户端调度到相同的 RS 之上
动态算法
lc:Least Connection, 最小连接数调度, 本质是调度到当前负载最低的主机上
overhead=active*256+inactive
wlc:Weighted Least Connection, 加权最小连接数调度, 本质是调度到当前负载最低的主机上
overhead=(active*256+inactive)/weight
SED: 是 wlc 补充, 为了降低 overhead 出现重复的情况
overhead=((active+1)*256+inactive))/weight
NQ:Never queue, 算法基本和 sed 相同, 为了避免性能差的 RS 长时间处于空闲状态
lblc: 基于目标地址的最小连接数调度, 这种算法那是 lc 和 dh 的组合, 适应于 cache 场景
lblcr: 带有复制功能的 lblc
5.ipvsadm 的使用格式
ipvsadm 的使用格式
ipvsadm -A|E -t|u|f service-address:port [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] <<添加一个 lvs 服务器
ipvsadm -D -t|u|f service-address <<删除一个 lvs 服务器
ipvsadm -C <<清空规则表
ipvsadm -R <<从标准输入恢复规则表
ipvsadm -S [-n] <<使用 service ipvsadm save 即可
ipvsadm -a|e -t|u|f service-address -r server-address [options] <<添加一个后端 web 服务
ipvsadm -d -t|u|f service-address -r server-address <<删除一个后端 Web 服务
ipvsadm -L|l [options] <<显示 lvs 中的规则表
- ipvsadm -Z [-t|u|f service-address]
- ipvsadm --set tcp tcpfin udp
- ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
- ipvsadm --stop-daemon state
- ipvsadm -h
6.ipvsad 的选项参数
-A: 添加一个虚拟服务(添加 vip)[相当于负载均衡哪个服务器]
-E: 编辑修改一个虚拟服务
-D: 删除虚拟服务
-C: 清空规则表
-R: 从标准输入恢复规则表
--save|-S: 将当前内存中的规则保存到标准输出
-a: 指定在虚拟服务中添加 RS 节点 [添加后端的 Web 服务器]
-e: 指定在虚拟服务中编辑修改 RS 节点
-d: 指定在虚拟服务中删除 RS 节点
-L|-l: 显示 lvs 中的规则表 << ipvsadm -L -n --stats
-Z: 将计数器清零
-t service-address[:port]: 该规则是对 tcp 协议的请求做调度
-u service-address[:port]: 该规则是对 udp 协议的请求做调度
-f: 表示这个请求是经过 iptables 所标记过的服务类型
-r: 指定真实服务器的地址(remote)
-s scheduler: 指定该规则要用的调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
-p [time]: 指定在多次时间以内, 将相同的客户端调度到相同的后端节点之上, 默认时间 300s
-w: 设置 RS 节点的权重
-g: 指定用 DR 模式(默认)
-i: 指定用 tunnel 模式
-m: 指定用 nat 模式
7.ipvsadm 主要配置文件
说明: lvs 主要文件说明
/etc/rc.d/init.d/ipvsadm:sysV 风格服务管理脚本
/etc/sysconfig/ipvsadm-config: 配置文件
/sbin/ipvsadm: 用于配置 lvs 规则的工具
/sbin/ipvsadm-restore: 恢复或者读取规则到内存的工具
/sbin/ipvsadm-save: 保存内存中的规则的工具
[默认情况下, 所配置的规则都是保存在内存中的]
8.LVS 的 DR 模式实战
1. 准备环境
- centos7.5
- DR1 172.20.10.2/28
- WEB1 172.20.10.8/28
- WEB2 172.20.10.8/28
- VIP 172.20.10.11/28
2. 配置服务器端
安装依赖包
[root@ken ~]# yum install libnl* popt* kernel-devel -y
给安装的内核开发库做连接
[root@ken ~]# ln -s /usr/src/kernels/3.10.0-862.el7.x86_64/ /usr/src/Linux/
安装 lvs
[root@ken ~]# yum install ipvsadm -y
添加一个 vip
[root@ken ~]# ip a a 172.20.10.11/28 dev eth0
添加一个虚拟服务器
[root@ken ~]# ipvsadm -A -t 172.20.10.11:80 -s rr
在虚拟服务器中添加后端服务器
- [root@ken ~]# ipvsadm -a -t 172.20.10.11:80 -r 172.20.10.9:80 -w 1 -g
- [root@ken ~]# ipvsadm -a -t 172.20.10.11:80 -r 172.20.10.8:80 -w 1 -g
查看规则
- [root@ken ~]# ipvsadm -L -n --stats
- IP Virtual Server version 1.2.1 (size=4096)
- Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
- -> RemoteAddress:Port
- TCP 172.20.10.11:80 0 0 0 0 0
- -> 172.20.10.8:80 0 0 0 0 0
- -> 172.20.10.9:80 0 0 0 0 0
3. 配置客户端
两台客户端配置保持完全相同, 除了测试文件之外.
安装配置 Web 服务器
- [root@ken ~]# yum install httpd -y
- [root@ken ~]# echo "this is 172.20.10.9 for test">/var/www/html/index.HTML
- [root@ken ~]# systemctl restart http
给 RS 绑定虚拟 IP
[root@ken ~]# ip a a 172.20.10.11/32 dev lo:0
在 RS 做 ARP 抑制
- [root@ken ~]# echo "1">/proc/sys.NET/ipv4/conf/lo/arp_ignore
- [root@ken ~]# echo "1">/proc/sys.NET/ipv4/conf/all/arp_ignore
- [root@ken ~]# echo "2">/proc/sys.NET/ipv4/conf/lo/arp_announce
- [root@ken ~]# echo "2">/proc/sys.NET/ipv4/conf/all/arp_announce
9. 浏览器测试
输入 VIP 地址
进行刷新测试
测试完成!
10. 补充
关于 arp 抑制
作用: 设置不对某些 arp 请求做应答
实现原理: 修改内核参数 /proc/sys.NET/ipv4/conf/
控制方式 1:arp_ignore
0: 默认, 表示的当该主机收到 arp 请求, 只有该主机有所请求的哪个 IP 地址, 就会给对方做成应答
1: 只对哪些请求的目标 IP 是当前主机的网卡接口 (这个接口就是插着网线的接口) 上的地址的时候, 才会做出应答
控制方式 2:arp_announced
作用: 限制当前主机做 arp 应该的条件(也就是限制当用户所请的 ip 是哪个 IP 的时候, 才做 arp 应答)
0: 默认值, 表示在任意网络接口上的 IP 都可以做 arp 应答
1: 优先使用本地的接口做 arp 应答
2: 优先使用子接口做 arp 应答
来源: https://www.cnblogs.com/kenken2018/p/9734382.html