MySQL8.0 - 新特性 - 网络模块优化

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 本文主要描述下MySQL8.0在网络模块的几个小优化, 由于本人对server层代码不熟悉,所以只是列出自己的理解和相关的patch以及worklog,不做深入详细实现的解释,感兴趣的可自行从连接中找到对应的代码 admin Port 运维大并发负载数据库的同学经常会碰到的情况是,max_connection被占满,甚至root账户都无法登陆上去,kill掉这些链接来让实例恢复正常。

本文主要描述下MySQL8.0在网络模块的几个小优化, 由于本人对server层代码不熟悉,所以只是列出自己的理解和相关的patch以及worklog,不做深入详细实现的解释,感兴趣的可自行从连接中找到对应的代码

admin Port

运维大并发负载数据库的同学经常会碰到的情况是,max_connection被占满,甚至root账户都无法登陆上去,kill掉这些链接来让实例恢复正常。

Alibaba RDS MySQL的做法是把connection的个数拆分成不同的使用目的,例如系统维护账户占用一部分,用户账户占用一部分,两者不互相影响。

另外一种方式是比较高危的,通过gdb的方式直接进入进程去修改max_connection的值,但注意符号表要编译到mysqld里面,不然无法识别。

此外在mariadb/percona server的线程池实现里,也引入了extra port,当线程池用满无法登陆时,可以使用extra port来连上实例。

在MySQL8.0里,则引入了admin port的概念,顾名思义,就是单独开一个端口给管理员用,该特性从8.0.14开始引入。可以说这是个对运维非常有用,关键时候可以救命的特性。这个feature由facebook贡献给上游

主要包含几个配置参数:
admin_address: 用于指定管理员发起tcp连接的主机地址,可以是ipv4,ipv6, 或者Host name等等,他类似bind-address,但不同的是只能接受一个ip地址

admin_port: 顾名思义,就是管理员用来连接的端口号,注意如果admin_address没有设置的话,这个端口号是无效的

create_admin_listener_thread: 是否创建一个单独的listener线程来监听admin的链接请求,默认值是关闭的,facebook的建议是打开,否则其会使用已有的监听线程去监听admin连接。该参数同样需要admin_address打开, 否则没有任何影响

注意必须要有权限SERVICE_CONNECTION_ADMIN才能登陆该端口,否则会报错

根据文档描述2,admin port的连接个数不受max_connection或者Max_user_connection的限制。

参考文档

官方文档
Administrative Connection Management
WL#12138: Add Admin Port
相关代码

Multiple addresses for the --bind-address

通常在大规模允许的实例上我们不会去设置bind-address, 但在特定场景下还是有用的。从MySQL8.0.13开始,可以通过bind-address设置多个网络地址,对应release note:

To enable the server to listen on a set of addresses, the bind_address system variable now permits a list of comma-separated IP addresses or host names, not just a single address or name. For details, see Server System Variables.

也就是说如果你想通过bind-address绑定多个地址,需要使用8.0.13及之后的版本, 当然在之前的版本你也可以指定为使用 * 来匹配多个地址。

可以混合指定Ipv4和ipv6的地址,例如:

bind_address=198.51.100.20,2001:db8:0:f101::1

参考文档
bind address参数说明
WL#11652: Support multiple addresses for the --bind-address command option
相关代码

Performance for connect/disconnect

这是一个性能优化,尤其是针对频繁断开链接的短连接。这是因为MySQL里是使用一个全局大锁来保护LOCK_thd_list和LOCK_thd_remove来保护链接链表的。

优化的思路其实很简单直接:就是分区。所有的包括锁,链接链表,COND_thd_list都被分成8个分区(hardcode, 无法配置)来减少冲突, 根据thread id来分区。唯一的负面影响就是出于监控目的,可能performance schema需要获取全部分区来获得线程信息,但通常这是可以容忍的。

参考文档

WL#9250: Split LOCK_thd_list and LOCK_thd_remove mutexes
相关代码

Remove metadata from resultset

这是个老话题了,我们知道在mysql返回的结果集了除了用户的数据外,还包含了库,表名,列名,甚至表列的别名等信息,这些信息占据了返回值的很大一部分网络包开销,特别的,当你需要是点查询时,可能你的返回包的元数据要远远大于你需要的数据,而多数情况下,你并不需要这些元数据

例如当你返回n个列时,元数据包含:

- column count (n);
- n * column definitions

而每个column definition包含:

- catalog
- schema
- table alias
- table
- column alias
- column name
etc.

8.0版本里,你可以选择的移除resultset的metadata,通过参数resultset_metadata来控制,不过当我登陆终端,想设置这个参数时 却报错:

root@(none) 10:15:27>set session resultset_metadata = 'none';
ERROR 3640 (HY000): The client doesn't support optional metadata transfer

这是因为标准客户端的连接没有打开选项CLIENT_OPTIONAL_RESULTSET_METADATA,如果您使用C API,可以通在调用mysql_real_connect时把该flag设置到参数client_flag中,这样你就可以可选的设置这个session级别参数来关闭metadata了.

实际上在大概2012年左右,twitter mysql也做过类似的尝试,我在14年也做过类似的尝试,当时的测试结果如下:

After porting twitter’s patch ( Great thanks to Davi Arnaut) to MySQL5.6.16, I slightly changed it to make protocol_mode support more options:

0/METADATA_FULL: return all metadata, default value.
1/METADATA_REAL_COLUMN: only column name;
2/METADATA_FAKE_COLUMN: fake column name ,use 1,2...N instead of real column name
3/METADATA_NULL_COLUMN: use NULL to express the metadata information
4/METADATA_IGNORE: ignore metadata information, just for test..

CREATE TABLE `test_meta_impact` (
`abcdefg1` int(11) NOT NULL AUTO_INCREMENT,
`abcdefg2` int(11) DEFAULT NULL,
`abcdefg3` int(11) DEFAULT NULL,
`abcdefg4` int(11) DEFAULT NULL,
……
……
`abcdefg40` int(11) DEFAULT NULL,
PRIMARY KEY (`abcdefg1`)
) ENGINE=InnoDB AUTO_INCREMENT=229361 DEFAULT CHARSET=utf8

mysqlslap --no-defaults -uxx --create-schema=test -h$host -P $port --number-of-queries=1000000000 --concurrency=100 --query='SELECT * FROM test.test_meta_impact where abcdefg1 = 2'

METADATA_FULL : 3.48w TPS, Net send 113M
METADATA_REAL_COLUMN: 7.2W TPS, Net send 111M
METADATA_FAKE_COLUMN: 9.2W TPS , Net send 116M
METADATA_NULL_COLUMN: 9.6w TPS , Net send 115M
METADATA_IGNORE: 13.8w TPS, Net send 30M

可以看到去掉元数据后,不但网络传输少了至少三倍多, tps也上升了不少.

参考文档

WL#8134: Make metadata information transfer optional
resultset_metadata
C API
相关代码

异步query

从最新的8.0.16版本开始,新的C API开始支持异步的无阻塞的提交查询,相关的API包括:

mysql_real_connect_nonblocking()

mysql_real_query_nonblocking()

mysql_store_result_nonblocking()

mysql_next_result_nonblocking()

mysql_fetch_row_nonblocking()

mysql_free_result_nonblocking()

函数的名字就是原有阻塞性api加上后缀_nonblocking,比如说如果query的执行时间比较长,你可以先去干别的事情,然后再回来查询结果集。当然啦你必须要使用8.0.16或之后的client api

参考文档

WL#11381: Add asynchronous support into the mysql protocol
C API Asynchronous Interface
相关代码

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
RT-DETR改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
37 3
RT-DETR改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
|
8天前
|
机器学习/深度学习 计算机视觉 网络架构
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
93 63
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
|
8天前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
90 62
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
4天前
|
缓存 算法 关系型数据库
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
|
5天前
|
SQL 关系型数据库 MySQL
MySQL底层概述—7.优化原则及慢查询
本文主要介绍了:Explain概述、Explain详解、索引优化数据准备、索引优化原则详解、慢查询设置与测试、慢查询SQL优化思路
MySQL底层概述—7.优化原则及慢查询
|
5天前
|
存储 缓存 关系型数据库
MySQL底层概述—5.InnoDB参数优化
本文介绍了MySQL数据库中与内存、日志和IO线程相关的参数优化,旨在提升数据库性能。主要内容包括: 1. 内存相关参数优化:缓冲池内存大小配置、配置多个Buffer Pool实例、Chunk大小配置、InnoDB缓存性能评估、Page管理相关参数、Change Buffer相关参数优化。 2. 日志相关参数优化:日志缓冲区配置、日志文件参数优化。 3. IO线程相关参数优化: 查询缓存参数、脏页刷盘参数、LRU链表参数、脏页刷盘相关参数。
MySQL底层概述—5.InnoDB参数优化
|
8天前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 优化颈部网络
RT-DETR改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 优化颈部网络
34 10
RT-DETR改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 优化颈部网络
|
7天前
|
关系型数据库 MySQL 数据库
从MySQL优化到脑力健康:技术人与效率的双重提升
聊到效率这个事,大家应该都挺有感触的吧。 不管是技术优化还是个人状态调整,怎么能更快、更省力地完成事情,都是我们每天要琢磨的事。
56 23
|
3天前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。
|
3天前
|
机器学习/深度学习 数据采集 算法
基于GWO灰狼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a,展示了时间序列预测算法的运行效果(无水印)。核心程序包含详细中文注释和操作视频。算法采用CNN-GRU-SAM网络,结合灰狼优化(GWO),通过卷积层提取局部特征、GRU处理长期依赖、自注意力机制捕捉全局特征,最终实现复杂非线性时间序列的高效预测。

相关产品

  • 云数据库 RDS MySQL 版