动态修改LVS real server配置的影响验证

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 1. 背景 LVS是一种非常高效的负载均衡软件实现,尤其是DR模式。但实际部署需要考虑real server的健康状况,并应该根据real server的健康状况或扩容缩容需求及时更新LVS的配置。

1. 背景

LVS是一种非常高效的负载均衡软件实现,尤其是DR模式。但实际部署需要考虑real server的健康状况,并应该根据real server的健康状况或扩容缩容需求及时更新LVS的配置。但是动态修改LVS配置,对正在运行的客户端会有什么影响呢?考虑到这些问题对LVS做了个全组合测试。


2. 最初的配置

参考网上的流行配置。如下
LVS服务器:

点击(此处)折叠或打开

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. ifconfig eth0:0 ${vip} broadcast ${vip} netmask 255.255.255.255 up
  3. ipvsadm -A -t ${vip}:${port} -s rr
  4. ipvsadm -a -t ${vip}:${port} -r ${realserver}
  5. ...

后端real server:

点击(此处)折叠或打开

  1. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  2. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  3. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  4. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  5. ifconfig lo:0 ${vip} broadcast ${vip} netmask 255.255.255.255 up


2. 测试结果

用LVS做MySQL的负载均衡,测试结果如下:

是否存在lvs realserver配置项 mysql服务 客户端操作 结果 结果判断
存在 启动 新建连接 成功 OK
存在 启动 执行sql 成功 OK
存在 停止 新建连接 ERROR 2003 (HY000): Can't connect to MySQL server on '10.27.113.51' (111)
OK
存在 停止 执行sql mysql> select 1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    9911
Current database: *** NONE ***

mysql进程死掉的时候会给直接客户端发个F包,这样客户端可以检出连接切断。
OK
存在 停止 已执行sql等待服务端返回 mysql> select sleep(20);
ERROR 2013 (HY000): Lost connection to MySQL server during query


mysql进程死掉的时候会给直接客户端发个F包,这样客户端可以检出连接切断,停止等待。
OK
不存在 启动 新建连接 成功(有其它real server可选)或失败(无其它real server可选)

[root@srdsdevapp69 ~]# mysql -h 10.27.113.51 -e "select @@server_id";
ERROR 2003 (HY000): Can't connect to MySQL server on '10.27.113.51' (111)
OK
不存在 启动 执行sql 客户端一直等待ack包。处于这个状态时,再加上lvs的realserver可以恢复。

mysql> select 1;

+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (5 min 25.57 sec)

注意tcpdump包
17:20:22.310061 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:20:22.510941 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:20:22.912934 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:20:23.716944 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:20:25.324920 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:20:28.540935 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:20:34.972918 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:20:47.836934 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:21:13.564932 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:22:05.021017 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:23:47.932941 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:25:47.932934 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [P.], seq 126:139, ack 295, win 123, length 13
17:25:47.934196 IP 10.27.113.51.mysql > srdsdevapp69.40776: Flags [P.], seq 295:351, ack 139, win 29, length 56
17:25:47.934287 IP srdsdevapp69.40776 > 10.27.113.51.mysql: Flags [.], ack 351, win 123, length 0
NG
不存在 启动 已执行sql等待服务端返回 正常执行,因为mysql的反馈不经过lvs,只要客户端的包发出去了,lvs的配置修改了也不会影响这个包的响应。
mysql> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.00 sec)
OK

上面倒数第二个测试结果我认为是有问题的。试想,如果我要集群收缩删除一个后台服务器,如果直接从LVS的realserver列表里删,就会导致那些还连在上面的客户端下次发SQL时会一直等待。

4. 改进后的配置

后经调查,通过在LVS服务器上设置下面的内核参数可解决问题。上面的场景下,客户端发SQL时会立刻错误返回。

  1. echo 1 > /proc/sys/net/ipv4/vs/expire_nodest_conn

5. 最后
LVS默认行为的初衷好像是期待后台服务器发生故障后从列表中剔除,然后等后台服务器恢复之后再加进来。这段时间让客户端等待,可以使故障对客户端透明。实际上这基本是做不到的,后台服务器故障再恢复后,提供服务的进程已经不是原来的进程了,无法继续使用之前的连接。所以LVS还不如把立刻错误返回作为默认行为。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
运维 算法 Linux
LVS详解(四)——LVS安装与配置命令
LVS详解(四)——LVS安装与配置命令
16 2
|
4月前
|
负载均衡 监控 调度
Keepalived+Lvs(dr)调度器主备配置小实验
Keepalived和LVS(Linux Virtual Server)是两个常用的开源软件,通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalived是一种用于实现高可用性的软件,它可以监控服务器的健康状态,并在主服务器出现故障时自动切换到备份服务器。
98 2
|
11月前
|
监控 网络协议 数据安全/隐私保护
高可用 - 05 Keepalived配置(全局配置、VRRPD、LVS)
高可用 - 05 Keepalived配置(全局配置、VRRPD、LVS)
421 0
|
负载均衡 Linux Docker
LVS+keepalived配置高可用架构和负载均衡机制(2)
LVS+keepalived配置高可用架构和负载均衡机制(2)
176 0
|
负载均衡 网络协议 前端开发
LVS+keepalived配置高可用架构和负载均衡机制(1)
LVS+keepalived配置高可用架构和负载均衡机制(1)
660 1
|
负载均衡 并行计算 算法
Lvs-负载均衡配置 NAT与DR模式
Lvs-负载均衡配置 NAT与DR模式
317 1
Lvs-负载均衡配置 NAT与DR模式
|
负载均衡
|
网络协议
KEEPALIVED 做LVS+HA实例安装与配置
--------------------------------------master------------------------------------------------------- wget http://www.
1013 0
|
移动开发 网络协议 Shell
LVS+KEEPALIVED 安装与配置实例
--------------------------------------master--------------------------------------- echo "1" > /proc/sys/net/ipv4/ip_forward wget http://www.
1270 0
|
前端开发 网络协议 Shell