来源:oracleace
摘要:MySQL 8.2引入了透明读/写分离功能,MySQL 路由器可以自动将只读SQL路由到集群的只读节点。然而,MySQL路由器在此过程中需要对接收到的SQL进行一定程度的解析,以确定其是否为只读SQL。这个解析过程对系统性能会有怎样的影响呢?知名MySQL布道师Frédéric Descamps对此进行了测试,让我们一起看看他的分析。

01
—
环境
为了执行测试,我使用以下环境:
Linux Kernel 5.15.0 – aarch64
MySQL Community Server 8.2.0
MySQL Router 8.2.0
sysbench 1.1.0 using LuaJIT 2.1.0-beta3
VM.Standard.A1.Flex – Neoverse-N1 (50 BogoMIPS) 4 cores
24GB of RAM
MySQL InnoDB 集群在 3 台机器上运行,一台机器用于 MySQL 路由器和 Sysbench。
Sysbench 准备了 8 个表,每个表有 100000 条记录。
MySQL连接使用SSL。
02
—
MySQL InnoDB 集群

以下是 MySQL Shell 中集群的概述:
JS > cluster.describe(){"clusterName": "myCluster","defaultReplicaSet": {"name": "default","topology": [{"address": "mysql1:3306","label": "mysql1:3306","role": "HA"},{"address": "mysql2:3306","label": "mysql2:3306","role": "HA"},{"address": "mysql3:3306","label": "mysql3:3306","role": "HA"}],"topologyMode": "Single-Primary"}}JS > cluster.status(){"clusterName": "myCluster","defaultReplicaSet": {"name": "default","primary": "mysql1:3306","ssl": "REQUIRED","status": "OK","statusText": "Cluster is ONLINE and can tolerate up to ONE failure.","topology": {"mysql1:3306": {"address": "mysql1:3306","memberRole": "PRIMARY","mode": "R/W","readReplicas": {},"replicationLag": "applier_queue_applied","role": "HA","status": "ONLINE","version": "8.2.0"},"mysql2:3306": {"address": "mysql2:3306","memberRole": "SECONDARY","mode": "R/O","readReplicas": {},"replicationLag": "applier_queue_applied","role": "HA","status": "ONLINE","version": "8.2.0"},"mysql3:3306": {"address": "mysql3:3306","memberRole": "SECONDARY","mode": "R/O","readReplicas": {},"replicationLag": "applier_queue_applied","role": "HA","status": "ONLINE","version": "8.2.0"}},"topologyMode": "Single-Primary"},"groupInformationSourceMember": "mysql1:3306"}
还有已经引导到集群的MySQL路由器,在MySQL路由器中我们可以看到所有的端口:
JS > cluster.listRouters(){ "clusterName": "myCluster", "routers": { "router.sub09280951550.mysqlgermany.oraclevcn.com::system": { "hostname": "router.subXXXXXXX.mysqlgermany.oraclevcn.com", "lastCheckIn": "2023-11-15 09:27:18", "roPort": "6447", "roXPort": "6449", "rwPort": "6446", "rwSplitPort": "6450", "rwXPort": "6448", "version": "8.2.0" } }}
03
—
OLTP 读/写
oltp_read_write.lua脚本,然后使用 MySQL 路由器的读/写专用端口 (端口6446) 再次运行它,最后使用读/写拆分端口 (端口6450)。测试使用 8 个线程,每次运行 3 次。
$ sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql \ --mysql-user=sysbench --mysql-password=XxxxXX --mysql-ssl=REQUIRED \ --mysql-host=<...> --mysql-port=<...> --tables=8 --table-size=100000 \ --threads=8 run

04
—
OLTP 只读
oltp_read_only.lua脚本。再次使用 8 个线程和 3 次运行:

04
—
OLTP 只写
oltp_write_only.lua测试了只写工作负载。再次 8 个线程和 3 次运行:

我们可以看到,差异很小,但差异的确存在。
05
—
更复杂的工作负载
oltp_update_non_index.lua,我们可以看到显著的差异。

06
—
结论
