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_usec
、binlog_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数对比为:
CPU Idle的对比为:
结论
MariaDB复制效率是MySQL的2倍。
2、复制参数对主库效率的影响
- 1)设置
binlog_commit_wait_count=0
,此时binlog_commit_wait_usec
被忽略,主库每秒可以完成25000次insert操作。 - 2)设置
binlog_commit_wait_count=12
,binlog_commit_wait_usec=10000
,主库每秒可以完成1000次insert操作。 - 3)设置
binlog_commit_wait_count=8
,binlog_commit_wait_usec=10000
,主库每秒可以完成20000次insert操作。 - 4)设置
binlog_commit_wait_count=8
,binlog_commit_wait_usec=100000
,主库每秒可以完成20000次insert操作。
结论
主库开启了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的兼容性,切换非常顺利),发现不仅主从复制性能提升很大,普通读写性能也有一定程度的提升,主从复制延迟的问题得到解决。
- 最新
- 最热
只看作者