阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Keepalived+LVS-DR实现实现负载均衡高可用集群

159次阅读
没有评论

共计 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 的功能

Keepalived+LVS-DR 实现实现负载均衡高可用集群 

第 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 集群配置完毕

Keepalived+LVS-DR 实现实现负载均衡高可用集群

注意:所有有访问的返回值都是 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

Keepalived+LVS-DR 实现实现负载均衡高可用集群

10.0.0.3 的数据包 mac 地址的返回值就是访问 web03

Keepalived+LVS-DR 实现实现负载均衡高可用集群

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 1U 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 直接路由模式

Keepalived+LVS-DR 实现实现负载均衡高可用集群

NAT 模式

Keepalived+LVS-DR 实现实现负载均衡高可用集群

FULLNAT

Keepalived+LVS-DR 实现实现负载均衡高可用集群

TUNNEL

Keepalived+LVS-DR 实现实现负载均衡高可用集群

更多详情见请继续阅读下一页的精彩内容: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 状态

Keepalived+LVS-DR 实现实现负载均衡高可用集群

3.1.5.2 关闭 web03

Keepalived+LVS-DR 实现实现负载均衡高可用集群

3.1.5.3 查看 lb03 状态

Keepalived+LVS-DR 实现实现负载均衡高可用集群

如图发现,web03 被剔除

3.1.5.4 开启 web03

Keepalived+LVS-DR 实现实现负载均衡高可用集群

3.1.5.5 查看 lvs 状态

Keepalived+LVS-DR 实现实现负载均衡高可用集群

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 的功能

Keepalived+LVS-DR 实现实现负载均衡高可用集群 

第 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 集群配置完毕

Keepalived+LVS-DR 实现实现负载均衡高可用集群

注意:所有有访问的返回值都是 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

Keepalived+LVS-DR 实现实现负载均衡高可用集群

10.0.0.3 的数据包 mac 地址的返回值就是访问 web03

Keepalived+LVS-DR 实现实现负载均衡高可用集群

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 1U 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 直接路由模式

Keepalived+LVS-DR 实现实现负载均衡高可用集群

NAT 模式

Keepalived+LVS-DR 实现实现负载均衡高可用集群

FULLNAT

Keepalived+LVS-DR 实现实现负载均衡高可用集群

TUNNEL

Keepalived+LVS-DR 实现实现负载均衡高可用集群

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-12/149030p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计10498字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中