TokuDB如何用?腾讯这么做!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

本文根据第55期线上分享整理而成,文末有彩蛋哟~

 

 
 

前言

 

大家好,我是林水彬,来自腾讯互动娱乐事业群的DBA。很高兴今天能有机会在这里跟大家一起交流讨论TokuDB在业务中的一些相关实践。

 

本次主要有3个议题想和大家交流讨论下:

  • 背景

  • 压力测试

  • 运营经验

 
 
 

 

TokuDB的背景
 
 

 

让我们从使用TokuDB的背景说起。

 

 

这幅图层现了当前我们大部分的游戏架构,今天要讨论的角色在左下角—logdb,logdb(又叫tlog),顾名思义,存储的是玩家的一些流水日志,譬如,登陆/登出;购买的道具记录等。

 

非技术的现状:

  1. 随着游戏的运营策划,拉新留存,不断滚服,不同区服在线不均,导致资源浪费;

  2. 策划希望保留更多的数据,X业务单区甚至能达到 2T。

 

技术的现状:

  1. 采用InnoDB,一般是游戏大区:Tlog = 1:1;存储的硬件成本高;

  2. 采用MyISAM,虽然能节省一半空间,但无法在线加字段,而加字段的变更又是占游戏日常变更的大块头。

 

TokuDB:InnoDB  = 1:10

TokuDB:MyISAM = 1:5

MyISMA:InnoDB  = 1:2

 

这是一组经验数据。

 

2015年上半年,当时部门正在搞成本优化,借着这把火,我们发起了一个项目,叫:端游Tlog成本优化。以项目的方式,以TokuDB为技术,以业务的诉求为基础,按KPI驱动,逐步建设,逐步迭代,快速落地。

 

目前接入TokuDB的业务20+,实例200+。

 

 

这幅图是我们最开始推动接入TokuDB的5个业务,节省机器数 150台,按照tlog机型每个月运营成本980/月,这5个业务每个月也可以节省15万。也许这是技术变现的另一层意思。

 

接下来我们正式介绍下TokuDB。

 

TokuDB作为MySQL的一个存储引擎,业务侧不需要修改任何代码,开发可以像使用InnoDB一样选择TokuDB。它有如下几个优点:

 

 

上线现网前我们对TokuDB进行了一些调研,主要包括:

  1. 高压缩比

  2. 查询

  3. 更新

  4. 业务查询

  5. 业务入库

 

第4、5是我们基于tlog业务个性化的考虑出发的。

 

我们先看下TokuDB为人称道的高压缩特性

 

 

这是我们从现网来的一组压缩数据。

 

TokuDB之所以比InnoDB有较高的压缩优势,可能原因有:

  1. TokuDB默认块大小为4M,更适合压缩。

  2. InnoDB需要将压缩后的数据pad到固定大小的padding 空间里,这会降低所能达到的压缩效果,而TokuDB是unpadded。

  3. InnoDB可能存在碎片,而TokuDB没有这个问题。

 

 

TokuDB相关压力测试
 
 

 

关于压力测试,我们使用的工具是自研的test_server:

 

查询的测试SQL:SELECT id FROM test.big_tb WHERE id=  ?

原地更新的测试SQL:update test.big_tb set col1=col1+1 whereid = ?

非原地更新的测试SQL:update test.sml_tb set col13 =substr(sha1(rand()), 1, ceil(rand()*8)) where id = ?

 

首先是select。

 

MySQL配置

innodb_buffer_pool_size=15G

innodb_flush_log_at_trx_commit=0

sync_binlog=0

row_format=lz_ma(TokuDB)

tokudb_cache_size=15G

 

全cache

row 2000000 innodb 2.4G  tokudb 20M

 

非全cache

row 40000000 innodb 48G  tokudb 754M

 

 

结论:

  1. 全cache下TokuDB是InnoDB的2/3

  2. 非全cache同等数据用tokudb后只有754M,所以tokudb 内存能缓存大部分数据下,TokuDB几乎是InnoDB的10倍

 

其次是更新。

 

MySQL配置

innodb_buffer_pool_size=15G

innodb_flush_log_at_trx_commit=0

sync_binlog=0

row_format=lz_ma(TokuDB)

tokudb_cache_size=15G

 

全cache

row 2000000 innodb 2.4G  tokudb 20M

 

非全cache

row 40000000 innodb 48G  tokudb 754M

 

结论:

  1. 全cache下无论原地更新或非原地更新对于TokuDB的表现均无太大差别

  2. 全cache下原地更新TokuDB是InnoDB的1/2,非原地更新TokuDB是InnoDB的2/3 

  3. 非全cache同等数据用tokudb后只有754M,所以tokudb 内存能缓存大部分数据下,无论原地更新或非原地更新,InnoDB是TokuDB的1/5 

 

同时,我们也回放了现网tlog的查询模式。

 

 

现网回放的Top 7 SQL属于范围查询,而范围查询 TokuDB的表现要优于InnoDB。

 

根据前面的压力测试环节,可以看出,TokuDB优势在于压缩和范围查询,点查询不是他的优势所在。所以,稍微总结下,建议TokuDB的应用场景如下:

 

 

 

TokuDB运营经验
 
 

 

说完压测,接下来我们讨论下踩坑的正确姿势。

 

第1个坑。

 

来自TMySQL用户,包括很多开发和GCS系统,都习惯mysql –u$USER –p$PASSWD 来执行,这条命令在MySQL 5.6会有个warning告警:

 

Warning: Using a password on the command line interface can be insecure

 

 

单据或者脚本解析到这个warning,则全部失败。

 

所以,为了向前兼容,我们在源码层面将这个warn关闭。

 

 

看第2个坑。

 

一般MySQL的升级方法包括:

  1. 导入导出

  2. 做一个slave

  3. 原地升级

根据数据量大小,如果100G内的,我们一般选择原地升级。

 

某天在某个高星级业务上业务运维发现TokuDB的加字段很慢。

 

TokuDB无法在线加字段的条件:

  1. 原地升级

  2. 表含有数据

  3. 表含有时间字段

 

TokuDB无法在线加字段的原因:

MySQL 5.6.4在Server层新增三种时间类型MYSQL_TYPE_TIME2,MYSQL_TYPE_DATETIME2,MYSQL_TYPE_TIMESTAMP2,并在InnoDB层以二进制的格式存储,用这种方式来实现时间类型支持小数精度并优化存储节省空间。如果直接使用加字段操作,alter table t1 add c1 int。  

 

对MySQL 5.6中,通常情形下加字段的隐式行为是走的online ddl,即ALGORITHM=INPLACE。 如若t1满足上述3个条件,该SQL则隐式走ALGORITHM=COPY,即非在线加字段的逻辑。因此,在系统默认行为下,通过原地升级过来的旧版本MySQL时间类型会妨碍后续的online ddl行为。

 

修复的方式有2个:

  1. alter table force,这种方式需要拷贝数据,成本太高。

  2. avoid_temporal_upgrade 把这个参数打开即可,很赞,建议使用这种方式。

 

接下来看第3个坑。

 

某天有开发投诉,数据入库延迟严重,导致统计任务失败,重跑成本极高。

 

TokuDB官方宣称Load DATA比InnoDB强;并且我们在预研阶段也验证过的确如此,BUT WHY ??

 

查阅文档发现,原来是使用的姿势不对,Load DATA带不带local关键字区别很大。

 

有无local走的协议不同,有local,则是通过client读取后发送给server;无local,便是server直接读取。


 

下面看第4个坑。

 

现网TokuDB的部署策略是1:2或1:4个大区共用1个实例,正如这幅图所展示的:

 

 

淘宝的MySQL内核月报提到TokuDB 分区表文件数目计算公式: 分区数目 * (1 + 1 + 索引数目),这么一算,fd不够用也就有理有据了,因为fd是进程级别的,所以我们只要进行如下调整即可。

 

 

这是我们现网TokuDB实例上架的参数。

 

这个坑是业务运维的兄弟发现的,他们在查询时DB经常报:MySQL GONE AWAY。

 

接下来是最后一个坑。

 

数据安全是DBA的生命线,随着运营数据的与日俱增,逻辑备份压力越来越大。我们对比了业界的2种方案:

 

 

为了便于内部系统集成,我们采用阿里的方案。

 

TokuDB物理备份的步骤:

  1. 连接mysql,设置SET TOKUDB_CHECKPOINT_LOCK=ON;

  2. 加只读锁FLUSH TABLES WITH READ LOCK;

  3. 获取binlog位置,

  4. 拷贝tokudb的redolog和一些元数据文件(tokudb.****)

  5. 释放只读锁UNLOCK TABLES;

  6. 拷贝tokudb的数据文件和表结构

  7. 释放checkpoint锁,SET TOKUDB_CHECKPOINT_LOCK=OFF;

 

 

但我们发现,TokuDB把所有的数据文件的路径都写死了,这样不同实例跨端口的恢复就不会报错。

 

tokuftdump解析tokudb.directory:

 

 

从解析的内容可以看出,每个记录都是一个key,一个value,key就是对应的表名,value就是数据文件的路径,tokudb把所有的数据文件的路径写死,这样的话恢复到不同路径的话当然就会报错。

 

我们TMySQL 2.x对这个“bug”做了修复,使directory文件中只存相对路径,然后和数据文件的路径拼出完整的路径。

 

修复解析的内容如下:

 

 

至此备份的坑也就解决了。

 

 

Q&A
 
 

 

Q1: Toku的缺点主要有哪些,因为目前innondb还是大量在使用,能否指点一二?

A1:缺点可以从压力测试的数据看下,主要是点查询比InnoDB差。

 

Q2:Tokudb的range query比innodb 好?还有原因是cache 命中高吗?

A2:从我们测试来看,TokuDB的范围查询比InnoDB要好;TokuDB能缓存大部分数据可能是一个原因;不过当我们把tokudb的内存参数调得比数据要小一点的时候,TokuDB的范围查询仍然比InnoDB要高一点。

 

Q3:阿里备份与percona备份有没详细一点的对比?

A3:第一个是官方提供的方案——https://www.percona.com/blog/2015/02/05/tokudb-hot-backup-now-mysql-plugin/。简单来说这个方案是做了一个插件,加载了一个so,拦截所有有关于文件的系统调用,然后一边复制一边将改动同时应用到拷贝上去。

 

第二个是阿里提供的方案——http://mysql.taobao.org/monthly/2015/12/06/,这个方案听起来相对简单,只要加锁然后拷贝文件就可以了。

 

Q4:方便的话请介绍一下硬件的配置,cpu (压缩算法对cpu 的要求),磁盘方面参数。

A4:我们tlog机型刚刚在背景那块稍微提了下,配置不是很高。

 

 

Q5:在这配置下,生产最高的QPS,TPS是多少,CPU user是多少?

A5:目前我们TokuDB大部分是在Tlog业务应用,而Tlog的查询不会太高,主要是周边系统拉取的,所以QPS这个指标我们之前不是很关注;这个之前我们采集的某高星级业务整点高峰的性能数据。

 

 

作者介绍  林水彬

  • 目前就职于腾讯,主要工作包括MYSQL、Hadoop以及自动化平台建设;

  • TPUB版主,CSDN社区技术专家。


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-05-06

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
11月前
|
Linux 数据安全/隐私保护 C语言
新手向导:轻松离线搭建最新版OpenVPN(含一键安装脚本)
OpenVPN 是常用的虚拟私有网络工具,通过 Docker 搭建非常简单。但常用的 kylemanna/openvpn 镜像已三年未更新,停留在 OpenVPN 2.4 版本。为了升级到最新版本(如 2024 年 2 月发布的 v2.6.9),可以通过官方开源社区获取最新安装包并手动编译安装。步骤包括安装依赖、下载并编译 OpenSSL 和 OpenVPN、生成证书和配置文件等。此外,GitHub 上有一键安装脚本 openvpn-install.sh,简化了安装过程,但其版本可能不是最新的。安装完成后,还需配置 iptables 以确保客户端能正常使用代理网络。
14766 1
|
前端开发 Java API
Swagger接口文档 —— 手把手教学,全方位超详细小白能看懂,百分百能用Java版
本文提供了一份详细的Swagger接口文档生成工具的使用教程,包括了导入依赖、配置类设置、资源映射、拦截器配置、Swagger注解使用、生成接口文档、在线调试页面访问以及如何设置全局参数(如token),旨在帮助Java开发者快速上手Swagger。
8406 0
Swagger接口文档 —— 手把手教学,全方位超详细小白能看懂,百分百能用Java版
|
4月前
|
Prometheus 监控 Cloud Native
使用docker-compose管理多服务项目:日志监控方法指南
通过上述步骤,可以建立有效的日志监控系统,这不仅有助于问题的迅速定位和解决,而且对于分析系统性能、用户行为模式等都是一个宝贵的资源。只要正确配置和维护,Docker Compose管理的多服务项目可以高效地进行日志监控与分析。
184 0
|
10月前
|
存储 Kubernetes 网络协议
还不会 Cert Manager 自动签发证书?一文掌握
本文将介绍如何使用 Cert Manager 实现自动签发证书并与 Rainbond 结合使用。
|
11月前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费市场分析的深度学习模型
使用Python实现智能食品消费市场分析的深度学习模型
321 36
github镜像加速方案整理
github镜像加速方案整理
2172 1
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
1962 5
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
|
算法 搜索推荐 Shell
Shell编程之数组排序算法(冒泡排序、直接选择排序、反转排序)
1、数组排序(使用tr、sort、for) 操作步骤; 使用tr命令将数组内每个元素之间的空格替换为换行符; 之后使用sort命令按从小到大重新排序; 最后使用for循环遍历排序后的元素值。
625 0
|
存储 Linux Windows
如何显著提高 GitHub 的访问速度
如何显著提高 GitHub 的访问速度
475 0

热门文章

最新文章