共计 10498 个字符,预计需要花费 27 分钟才能阅读完成。
第 1 章 LVS 简介
1.1 LVS 介绍
LVS 是 Linux Virtual Server 的简写,意为 Linux 虚拟服务器,是虚拟的服务器集群系统,可在 UNIX/LINUX 平台下实现负载均衡集群功能。该项目在 1998 年 5 月由章文嵩博士组织成立,是国内最早出现的自由软件项目之一
官网:http://www.linuxvirtualserver.org/index.html
中文资料:LVS 项目介绍 http://www.linuxvirtualserver.org/zh/lvs1.html
LVS 集群的体系结构 http://www.linuxvirtualserver.org/zh/lvs2.html
LVS 集群中的 IP 负载均衡技术 http://www.linuxvirtualserver.org/zh/lvs3.html
LVS 集群的负载调度 http://www.linuxvirtualserver.org/zh/lvs4.html
简单一句话,当并发超过了 Nginx 上限,就可以使用 LVS 了。
日 1000-2000W PV 或并发请求 1 万以下都可以考虑用 Nginx。
大型门户网站,电商网站需要用到 LVS。
1.1.1 LVS 内核模块 ip_vs 介绍
早在 2.2 内核时,IPVS 就已经以内核补丁的形式出现
从 2.4.23 版本开始,IPVS 软件就合并到 Linux 内核常用版本的内核补丁的集合
从 2.4.24 以后 IPVS 已经成为 Linux 官方标准内核的一部分
说明:
LVS 无需安装
安装的是管理工具,第一种叫 ipvsadm,第二种叫 keepalive
ipvsadm 是通过命令行管理,而 keepalive 读取配置文件管理
后面我们会用 Shell 脚本实现 keepalive 的功能
第 2 章 LVS 集群搭建
2.1 环境准备
主机名 |
主机IP |
备注 |
lb03 |
10.0.0.15 |
01.Cent0S7.4 系统,内存 512M 02. 防火墙 firewall 和 Selinux 关闭 03.web03 和 web04 只安装 Nginx 软件,并满足 curl http://10.0.0.17/ 页尾得到结果为 web03 curl http://10.0.0.18/ 页尾得到结果为 web04 |
lb04 |
10.0.0.16 |
|
web03 |
10.0.0.17 |
|
web04 |
10.0.0.18 |
2.1 安装 ipvsadm 管理工具
1 lsmod |grep ip_vs #查看系统的 LVS 模块 ->默认没有加载模块,需安装管理工具才会激活 2 yum -y install ipvsadm
查看当前 LVS 状态,顺便激活 LVS 内核模块
[root@lb03 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb03 ~]# lsmod|grep ip_vs
ip_vs 141092 0
nf_conntrack 133387 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
注意 ipvsadm -ln 作用:健康检查,即当某台 web 服务器出现问题时 LVS 将自动踢出;等恢复后再添加进来
2.1.1 ①在 eth0 网卡绑定 VIP 地址(高可用)
1 ip addr add 10.0.0.13/24 dev eth0 #lb 服务的 IP 地址可扩展性较差,故使用 VIP 地址(删除 del;显示 show)
2.1.2 ②清除当前所有 LVS 规则
1 ipvsadm -C
2.1.3 ③设置 tcp、tcpfin、udp 链接超时时间(s)
1 ipvsadm —set 30 5 60 #控制浏览器与 lb01 的超时时间
2.1.4 ④添加虚拟服务,调度算法见 man ipvsadm
1 ipvsadm -A -t 10.0.0.13:80 -s wrr -p 20 2 3 #LVS 默认无 80 端口,需另外添加新的虚拟 IP 记录 -> 控制 lb01 与 web01、web02 的超时时间
2.1.5 ⑤将虚拟服务关联到真实服务上
1 ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.17:80 -g -w 1
2
3 ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.18:80 -g -w 1
2.1.6 ⑥查看配置结果
[root@lb03 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096) #LVS 版本号
Prot LocalAddress:Port Scheduler Flags #协议(TCP) 本地 IP:端口 调度算法 标志(持续时间 20s)
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#后端节点 IP:端口 工作模式 权重 已建立连接 正在连接
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.17:80 Route 1 0 0
-> 10.0.0.18:80 Route 1 0 0
2.2 web 服务器配置
2.2.1 Ⅰ. 在 lo 网卡绑定 VIP 地址
1 ip addr add 10.0.0.13/32 dev lo
2.2.2 Ⅱ. 修改内核参数抑制 ARP 响应
cat >>/etc/sysctl.conf<<EOF #其目的是为了让 rs 顺利发送 mac 地址给客户端
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
查看结果
[root@lb03 ~]# ip a s eth0
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:3b:cb:36 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.13/24 scope global secondary eth0
valid_lft forever preferred_lft forever
[root@web03 ~]# ip a s lo
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 10.0.0.13/32 scope global lo
valid_lft forever preferred_lft forever
2.2.3 Ⅲ.web 浏览器测试
1 http://10.0.0.13/
说明:当 lb 服务器断开连接后 VIP 会自动消失,重新连接后需再次添加 VIP
2.2.4 Ⅳ. arp 解析查看
[root@lb04 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.254 ether 00:50:56:e9:9f:2c C eth0
10.0.0.18 ether 00:0c:29:ea:ca:55 C eth0
10.0.0.13 ether 00:0c:29:de:7c:97 C eth0
172.16.1.15 ether 00:0c:29:de:7c:a1 C eth1
10.0.0.17 ether 00:0c:29:4a:ac:4a C eth0
至此,LVS 集群配置完毕
注意:所有有访问的返回值都是 10.0.0.3
lvs 与 nginx 的不同就在于 17 和 18 并不通过 IP 地址访问,而是通过 mac 地址访问
至此,LVS 集群配置完毕
2.2.4.1 存疑问题:使用抓包工具发现通信的是 windows IP 和 lb03 的 80 端口,但 lb03 没有 80 端口?
lvs 通过 mac 地址访问时,访问 10.0.0.3 就是访问 lb01
10.0.0.3 的数据包 mac 地址的返回值就是访问 web03
2.3 ARP 协议
2.3.1 arp 详解
01.ARP 协议,全称 ”Address Resolut ion Protocol”,中文名是地址解析协议,使用 ARP 协议可实现通过 IP 地址获得对应主机的物理地址(MAC 地址)
ARP 协议要求通信的主机双方必须在同一个物理网段(即局域网环境)!
02. 为了提高 IP 转换 MAC 的效率,系统会将解析结果保存下来,这个结果叫做 ARP 缓存
1 arp-a #Windows 查看 ARP 缓存命令
2 arp-n #Linux 查看 ARP 缓存命令
3 arping -c 1 -I eth0 10.0.0.6
4 #Linux 解析 IP 对应的 MAC 地址[- c 指定超时的 ARP 数据包数量;- I 指定使用哪个网络接口]
ARP 缓存表是把双刃剑
①主机有了 arp 缓存表,可以加快 ARP 的解析速度,减少局域网内广播风暴。因为 arp 是发广播解析的,频繁的解析也是消耗带宽的(尤其是机器多的时候) ②正是有了 arp 缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是 arp 欺骗攻击 ③切换路由器,负载均衡器等设备时,可能会导致短时网络中断。因为所有的客户端 ARP 缓存表未更新
2.3.2 服务器切换 ARP 问题
当 lb01 宕机,VIP 地址迁移到 lb02 时需要通过 arping 命令通知所有网络内机器更新本地的 ARP 缓存表,从而使得客户机访问时重新广播获取 MAC 地址
ARP 广播进行新的地址解析
1 arping -I eth0 -c 1 –U VIP 2 arping -I eth0 -c 1 -U 10.0.0.13
测试 ARP 缓存切换(手动漂移 VIP)
1 [root@lb03 ~]# ip addr del 10.0.0.13/24 dev eth0
2 [root@lb04 ~]# ip addr add 10.0.0.13/24 dev eth0
3 [root@lb04 ~]# arping -I eth0 -c 1 -U 10.0.0.13
4 ARPING 10.0.0.13 from 10.0.0.13 eth0
5 Sent 1 probes (1 broadcast(s))
6 Received 0 response(s)
windows 查看 arp -a
1 [e:\~]$ arp -a
2.3.3 LVS 集群的工作模式
DR 直接路由模式
NAT 模式
FULLNAT
TUNNEL
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-12/149030p2.htm
第 3 章 Keepalive+LVS 实现
3.1 安装配置 keepalive 实例
3.1.1 ①在 lb03 和 lb04 上安装 keepalive
1 yum install -y keepalived
3.1.2 ②编辑 keepalived.conf 配置文件
[root@lb03 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.13/24
}
}
virtual_server 10.0.0.13 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.0.0.17 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.0.0.18 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
3.1.3 ③开启 keepalived 服务
1 systemctl start keepalived.service 2 ip a #查看 VIP,此时应漂移到 lb04 上
3.1.4 ④web03/web04 同时操作以下步骤
ip addr add 10.0.0.13/32 dev lo
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
注意:因为虚拟的 ip 重启之后就会失效,故须加入开机启动项 rc.local 文件并赋予其可执行权限
3.1.5 ⑤keepalive 健康检查功能
模拟 web03 出现问题
3.1.5.1 查看 lb03 lvs 状态
3.1.5.2 关闭 web03
3.1.5.3 查看 lb03 状态
如图发现,web03 被剔除
3.1.5.4 开启 web03
3.1.5.5 查看 lvs 状态
web03 恢复
以上是健康检查功能
3.1.6 ⑥测试
1 [root@lb04 ~]# curl 10.0.0.13 2 web03 3 [root@lb04 ~]# ipvsadm -ln
3.2 常见 LVS 负载均衡高可用解决方案
01. 开发类似 keepalived 的脚本,早期的办法(不推荐)
02.heartbeat+lvs+ldirectord 脚本配置方案,复杂不易控制(不推荐使用)
03.RedHat 工具 piranha,一个 web 界面配置 LVS
04.LVS-DR+keepalived 方案,推荐最优方案,简单、易用、高效
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149030.htm
第 1 章 LVS 简介
1.1 LVS 介绍
LVS 是 Linux Virtual Server 的简写,意为 Linux 虚拟服务器,是虚拟的服务器集群系统,可在 UNIX/LINUX 平台下实现负载均衡集群功能。该项目在 1998 年 5 月由章文嵩博士组织成立,是国内最早出现的自由软件项目之一
官网:http://www.linuxvirtualserver.org/index.html
中文资料:LVS 项目介绍 http://www.linuxvirtualserver.org/zh/lvs1.html
LVS 集群的体系结构 http://www.linuxvirtualserver.org/zh/lvs2.html
LVS 集群中的 IP 负载均衡技术 http://www.linuxvirtualserver.org/zh/lvs3.html
LVS 集群的负载调度 http://www.linuxvirtualserver.org/zh/lvs4.html
简单一句话,当并发超过了 Nginx 上限,就可以使用 LVS 了。
日 1000-2000W PV 或并发请求 1 万以下都可以考虑用 Nginx。
大型门户网站,电商网站需要用到 LVS。
1.1.1 LVS 内核模块 ip_vs 介绍
早在 2.2 内核时,IPVS 就已经以内核补丁的形式出现
从 2.4.23 版本开始,IPVS 软件就合并到 Linux 内核常用版本的内核补丁的集合
从 2.4.24 以后 IPVS 已经成为 Linux 官方标准内核的一部分
说明:
LVS 无需安装
安装的是管理工具,第一种叫 ipvsadm,第二种叫 keepalive
ipvsadm 是通过命令行管理,而 keepalive 读取配置文件管理
后面我们会用 Shell 脚本实现 keepalive 的功能
第 2 章 LVS 集群搭建
2.1 环境准备
主机名 |
主机IP |
备注 |
lb03 |
10.0.0.15 |
01.Cent0S7.4 系统,内存 512M 02. 防火墙 firewall 和 Selinux 关闭 03.web03 和 web04 只安装 Nginx 软件,并满足 curl http://10.0.0.17/ 页尾得到结果为 web03 curl http://10.0.0.18/ 页尾得到结果为 web04 |
lb04 |
10.0.0.16 |
|
web03 |
10.0.0.17 |
|
web04 |
10.0.0.18 |
2.1 安装 ipvsadm 管理工具
1 lsmod |grep ip_vs #查看系统的 LVS 模块 ->默认没有加载模块,需安装管理工具才会激活 2 yum -y install ipvsadm
查看当前 LVS 状态,顺便激活 LVS 内核模块
[root@lb03 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb03 ~]# lsmod|grep ip_vs
ip_vs 141092 0
nf_conntrack 133387 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
注意 ipvsadm -ln 作用:健康检查,即当某台 web 服务器出现问题时 LVS 将自动踢出;等恢复后再添加进来
2.1.1 ①在 eth0 网卡绑定 VIP 地址(高可用)
1 ip addr add 10.0.0.13/24 dev eth0 #lb 服务的 IP 地址可扩展性较差,故使用 VIP 地址(删除 del;显示 show)
2.1.2 ②清除当前所有 LVS 规则
1 ipvsadm -C
2.1.3 ③设置 tcp、tcpfin、udp 链接超时时间(s)
1 ipvsadm —set 30 5 60 #控制浏览器与 lb01 的超时时间
2.1.4 ④添加虚拟服务,调度算法见 man ipvsadm
1 ipvsadm -A -t 10.0.0.13:80 -s wrr -p 20 2 3 #LVS 默认无 80 端口,需另外添加新的虚拟 IP 记录 -> 控制 lb01 与 web01、web02 的超时时间
2.1.5 ⑤将虚拟服务关联到真实服务上
1 ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.17:80 -g -w 1
2
3 ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.18:80 -g -w 1
2.1.6 ⑥查看配置结果
[root@lb03 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096) #LVS 版本号
Prot LocalAddress:Port Scheduler Flags #协议(TCP) 本地 IP:端口 调度算法 标志(持续时间 20s)
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#后端节点 IP:端口 工作模式 权重 已建立连接 正在连接
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.17:80 Route 1 0 0
-> 10.0.0.18:80 Route 1 0 0
2.2 web 服务器配置
2.2.1 Ⅰ. 在 lo 网卡绑定 VIP 地址
1 ip addr add 10.0.0.13/32 dev lo
2.2.2 Ⅱ. 修改内核参数抑制 ARP 响应
cat >>/etc/sysctl.conf<<EOF #其目的是为了让 rs 顺利发送 mac 地址给客户端
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
查看结果
[root@lb03 ~]# ip a s eth0
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:3b:cb:36 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.13/24 scope global secondary eth0
valid_lft forever preferred_lft forever
[root@web03 ~]# ip a s lo
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 10.0.0.13/32 scope global lo
valid_lft forever preferred_lft forever
2.2.3 Ⅲ.web 浏览器测试
1 http://10.0.0.13/
说明:当 lb 服务器断开连接后 VIP 会自动消失,重新连接后需再次添加 VIP
2.2.4 Ⅳ. arp 解析查看
[root@lb04 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.254 ether 00:50:56:e9:9f:2c C eth0
10.0.0.18 ether 00:0c:29:ea:ca:55 C eth0
10.0.0.13 ether 00:0c:29:de:7c:97 C eth0
172.16.1.15 ether 00:0c:29:de:7c:a1 C eth1
10.0.0.17 ether 00:0c:29:4a:ac:4a C eth0
至此,LVS 集群配置完毕
注意:所有有访问的返回值都是 10.0.0.3
lvs 与 nginx 的不同就在于 17 和 18 并不通过 IP 地址访问,而是通过 mac 地址访问
至此,LVS 集群配置完毕
2.2.4.1 存疑问题:使用抓包工具发现通信的是 windows IP 和 lb03 的 80 端口,但 lb03 没有 80 端口?
lvs 通过 mac 地址访问时,访问 10.0.0.3 就是访问 lb01
10.0.0.3 的数据包 mac 地址的返回值就是访问 web03
2.3 ARP 协议
2.3.1 arp 详解
01.ARP 协议,全称 ”Address Resolut ion Protocol”,中文名是地址解析协议,使用 ARP 协议可实现通过 IP 地址获得对应主机的物理地址(MAC 地址)
ARP 协议要求通信的主机双方必须在同一个物理网段(即局域网环境)!
02. 为了提高 IP 转换 MAC 的效率,系统会将解析结果保存下来,这个结果叫做 ARP 缓存
1 arp-a #Windows 查看 ARP 缓存命令
2 arp-n #Linux 查看 ARP 缓存命令
3 arping -c 1 -I eth0 10.0.0.6
4 #Linux 解析 IP 对应的 MAC 地址[- c 指定超时的 ARP 数据包数量;- I 指定使用哪个网络接口]
ARP 缓存表是把双刃剑
①主机有了 arp 缓存表,可以加快 ARP 的解析速度,减少局域网内广播风暴。因为 arp 是发广播解析的,频繁的解析也是消耗带宽的(尤其是机器多的时候) ②正是有了 arp 缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是 arp 欺骗攻击 ③切换路由器,负载均衡器等设备时,可能会导致短时网络中断。因为所有的客户端 ARP 缓存表未更新
2.3.2 服务器切换 ARP 问题
当 lb01 宕机,VIP 地址迁移到 lb02 时需要通过 arping 命令通知所有网络内机器更新本地的 ARP 缓存表,从而使得客户机访问时重新广播获取 MAC 地址
ARP 广播进行新的地址解析
1 arping -I eth0 -c 1 –U VIP 2 arping -I eth0 -c 1 -U 10.0.0.13
测试 ARP 缓存切换(手动漂移 VIP)
1 [root@lb03 ~]# ip addr del 10.0.0.13/24 dev eth0
2 [root@lb04 ~]# ip addr add 10.0.0.13/24 dev eth0
3 [root@lb04 ~]# arping -I eth0 -c 1 -U 10.0.0.13
4 ARPING 10.0.0.13 from 10.0.0.13 eth0
5 Sent 1 probes (1 broadcast(s))
6 Received 0 response(s)
windows 查看 arp -a
1 [e:\~]$ arp -a
2.3.3 LVS 集群的工作模式
DR 直接路由模式
NAT 模式
FULLNAT
TUNNEL
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-12/149030p2.htm