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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 本文主要描述下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。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
522 0
|
6月前
|
机器学习/深度学习 数据可视化 网络架构
PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
PINNs训练难因多目标优化易失衡。通过设计硬约束网络架构,将初始与边界条件内嵌于模型输出,可自动满足约束,仅需优化方程残差,简化训练过程,提升稳定性与精度,适用于气候、生物医学等高要求仿真场景。
692 4
PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
|
6月前
|
机器学习/深度学习 算法
采用蚁群算法对BP神经网络进行优化
使用蚁群算法来优化BP神经网络的权重和偏置,克服传统BP算法容易陷入局部极小值、收敛速度慢、对初始权重敏感等问题。
463 5
|
6月前
|
机器学习/深度学习 数据采集 人工智能
深度学习实战指南:从神经网络基础到模型优化的完整攻略
🌟 蒋星熠Jaxonic,AI探索者。深耕深度学习,从神经网络到Transformer,用代码践行智能革命。分享实战经验,助你构建CV、NLP模型,共赴二进制星辰大海。
|
7月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
284 15
|
7月前
|
机器学习/深度学习 并行计算 算法
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
172 8
|
6月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
263 0
|
7月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
249 0
|
7月前
|
机器学习/深度学习 编解码 并行计算
【创新未发表!】基于BKA算法优化-BP、HO算法优化-BP、CP算法优化-BP、GOOSE算法优化-BP、NRBO算法优化-BP神经网络回归预测比较研究(Matlab代码)
【创新未发表!】基于BKA算法优化-BP、HO算法优化-BP、CP算法优化-BP、GOOSE算法优化-BP、NRBO算法优化-BP神经网络回归预测比较研究(Matlab代码)
450 0
|
7月前
|
机器学习/深度学习 传感器 数据采集
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
1081 0

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多