TalkingData统计分析产品线中,多维度交叉计算大量使用了Bitmap结构,这些Bitmap以及Bitmap计算的中间结果(也都是Bitmap结构)都存放在MySQL主从集群中,并作读写分离。正常一个Bitmap结构,经过压缩以后大小在几KB到几MB之间。

从2015年开始,随着TalkingData覆盖智能设备的数量急剧增多,以及设备属性维度的增加,Bitmap的数量也在不断增大。我们发现MySQL的主从复制渐渐出现一定的性能瓶颈,从库会有一定的滞后。尤其是在周末或傍晚,游戏和应用的活跃高峰时段,从库的复制甚至会滞后6到12个小时,导致用户在界面看到的数据同样出现延迟,影响用户体验。在调整各种MySQL参数依然无法解决问题的情况下,我们也在考虑替代方案,其中就包括MariaDB,因为MariaDB的主从同步在多线程上支持的更好,其效率可能比MySQL高。

MariaDB 由MySQL的创始人Michael Widenius主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。Oracle收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB目前主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。MariaDB在扩展功能、存储引擎(使用XtraDB来代替MySQL的InnoDB)以及一些新的功能改进方面都强过MySQL,而且从MySQL迁移到MariaDB也是非常简单的,因此,大型互联网用户以及Linux发行商越来越多的抛弃MySQL,转投MariaDB阵营。甚至在2013年的时候,谷歌高级系统工程师也透露说,谷歌的开源数据中心正在从MySQL迁移至MariaDB。维基百科、Red
Hat、SUSE也都逐步迁移到了MariaDB。

MariaDB目前实现以下两种并行模式

1、乐观模式

从10.1.3开始支持,事物总是并行执行,如果有冲突,后面的语句回滚,再重新执行。Myisam、DDL操作不支持并行。

2、保守模式

  • 1)基于组提交的有序并行

组提交默认开启,同时提交的事务可以并行复制,也可以通过binlog_commit_wait_usecbinlog_commit_wait_count这两个参数控制事务提交,这两个参数的意思是允许事务等待binlog_commit_wait_usec指定的毫秒直到有binlog_commit_wait_count个事务一起提交。

  • 2)基于gtid_domain_id的乱序并行

如果两个会话的gtid_domain_id不同,则任务可以并行,比如会话A在表A上操作索引,会话B没有操作A表,则这两个回话可以并行复制,多用于DDL及多主复制。

例如:

Session A:
SET SESSION gtid_domain_id=1
ALTER TABLE t ADD INDEX myidx(b)
SET SESSION gtid_domain_id=0
Session B:
delete from B where id=?;

于是我们测试了一下二者的复制效率。

【测试环境】

内存64G,双CPU Intel(R)
Xeon(R) CPU E5-2620 v2 @ 2.10GH,内核:2.6.32-358.el6.x86_64,OS:CentOS release 6.5。

参数:

innodb_buffer_pool_size = 10G
sync_bin_log=0
innodb_flush_log_at_trx_commit=2
log_slave_updates=off

**主库 :10.0.19-MariaDB-log
Source distribution**

**从库1:10.0.19-MariaDB-log
Source distribution**

**从库2:MySQL 5.6.22-log
Source distribution**

【测试方法】

3个实例在同一主机,先在主库并行执行10个任务,运行1小时后停止,然后分别在MariaDB及MySQL从库开启复制。

【测试结果】

1、开启组提交,并设置相关参数,观察从库执行效率。

binlog_commit_wait_usec=10000
binlog_commit_wait_count=4

每秒insert数对比为:

372e59577dd02572ee6c4886835f2513_b.jpg

CPU Idle的对比为:

d6ed31fa7b6843bb0c9571527ce720b5_b.jpg

结论

MariaDB复制效率是MySQL的2倍。

2、复制参数对主库效率的影响

  • 1)设置binlog_commit_wait_count=0,此时binlog_commit_wait_usec被忽略,主库每秒可以完成25000次insert操作。
  • 2)设置binlog_commit_wait_count=12binlog_commit_wait_usec=10000,主库每秒可以完成1000次insert操作。
  • 3)设置binlog_commit_wait_count=8binlog_commit_wait_usec=10000,主库每秒可以完成20000次insert操作。
  • 4)设置binlog_commit_wait_count=8binlog_commit_wait_usec=100000,主库每秒可以完成20000次insert操作。

5e9a822b8530bdbaf7e572b0dc6fdf40_b.jpg

结论

主库开启了10个并行任务,测试结果发现当binlog_commit_wait_count=12时,对插入效率影响非常大,而binlog_commit_wait_count=8时,影响可以接受。而binlog_commit_wait_usec设置为10毫秒或者100毫秒对整体效率影响不大。binlog_commit_wait_count不能超过实际并行事务数,否则严重影响性能。

从测试中可以看出,MariaDB 在主从复制性能上大大优于MySQL。而且,当我们在生产环境中把MySQL切换到MariaDB以后(因为MariaDB对MySQL的兼容性,切换非常顺利),发现不仅主从复制性能提升很大,普通读写性能也有一定程度的提升,主从复制延迟的问题得到解决。

最后修改:2018 年 03 月 09 日
如果觉得我的文章对你有用,请随意赞赏