Galera (MariaDB) 的 MySQL 集群写入性能

fil*_*tti 5 mysql mariadb galera

我目前正在评估从当前数据库服务器到三节点集群的迁移。

我们当前的服务器是运行 MariaDB 10.1 的虚拟机,并异步复制到另一台服务器,以便在不影响性能的情况下执行数据库备份。

读写比约为 70/30,我们正在运行一个物联网平台,其中有许多传感器发送原始数据,这些数据在合并并呈现给最终用户之前写入数据库。

由于写入与读取的比率很高,我想确保集群在迁移之前在写入方面的性能至少与我们当前的服务器一样好。

对于此测试,我在 Google 计算引擎上启动了一个虚拟机,该虚拟机具有 16 个 vCPU、60GB RAM 和 SSD 本地存储,具有 10,000 读取 IOPS 和 15,000 写入 IOPS。

在这个运行 Debian 8.3 的虚拟机上,我安装了 MariaDB 10.1(其中包括 Galera 集群),以便使用 Sysbench 0.5 运行一些基准测试。

这些是我从默认 mysql.cnf 文件更改的 MySQL 参数:

[mysqld]
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_log_file_size=2G
innodb_buffer_pool_size=4G
sync_binlog=0
Run Code Online (Sandbox Code Playgroud)

从 sysbench 运行更新测试时,我注意到在当前部署的单个节点上启用 wsrep 会产生巨大的开销。

这是我用来运行基准测试的命令:

sysbench --db-driver=mysql --num-threads=32 --max-time=30 --max-requests=0 --oltp-tables-count=32 --oltp-table-size=100000 --oltp -test-mode=complex --test=/root/sysbench/sysbench/tests/db/update_index.lua --mysql-db=sbtest --oltp-skip-trx=运行时

当 wsrep_on=OFF 时,我在基准测试中每秒获得大约 54000 次更新。

将 wsrep_on 设置为 ON,每秒大约获得 19000 次更新。

我原以为启用同步复制会对性能造成影响,但没想到会影响这么大。

看起来 CPU 和 IO 都不存在瓶颈,那么为什么启用 wsrep 对性能的影响如此之大呢?

Ric*_*mes 3

数据仓库(您的应用程序)和 OLTP 有所不同。因此,我质疑基准的相关性。如果我没记错的话,OLTP 涉及非常短的“事务”,这可能会受到 Galera 的 wsrep 完成的跨节点同步的影响COMMIT。另一方面,新数据点的插入可以批量完成,例如 1000 个,而不必担心提交开销。

60GB,innodb_buffer_pool_size应该更像45G。并设置innodb_buffer_pool_instances=16

从表面上看,19K/秒(每个节点?)似乎更快 - 19K*3 > 54K。但也许我误读了事情。

让我们看看您的SHOW CREATE TABLE事实表。有许多错误可能会导致您的应用程序类型出现严重的性能问题。

什么时候进行“整合”?如何?汇总表(我想这就是你所说的)是效率的关键。有时,最好存储摘要数据,但丢弃原始数据。

查看我对高速摄取汇总表的讨论。我的观点是,除了底层结构(硬件、Galera 等)之外,还可以(并且应该)实现显着的加速。

您的 Galera 设置方向正确;Galera中可能有额外的提示。

更多问题(这将导致更多讨论):有多少客户端将数据注入表中?一次插入多少行?收集行并批量插入它们有多容易?插入过程中是否发生归一化?与插入并行进行摘要是否有意义?您想让客户端写入所有 3 个节点吗?客户端和节点之间是否有某种形式的代理?