MySQL · TokuDB · 让Hot Backup更完美

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介: 前言 很久很久以前,内核君发表了一篇HA方案·TokuDB热备的文章,方法很简单: SET TOKUDB_CHECKPOINT_LOCK=ON; 开始拷贝TokuDB的数据文件(不包含日志文件); FLUSH TABLES WITH READ LOCK; 记录binlog位置,拷贝最新的b

前言

很久很久以前,内核君发表了一篇HA方案·TokuDB热备的文章,方法很简单:

  1. SET TOKUDB_CHECKPOINT_LOCK=ON;
  2. 开始拷贝TokuDB的数据文件(不包含日志文件);
  3. FLUSH TABLES WITH READ LOCK;
  4. 记录binlog位置,拷贝最新的binlog和TokuDB的日志文件(*.tokulog);
  5. UNLOCK TABLES;
  6. SET TOKUDB_CHECKPOINT_LOCK=OFF;

这些步骤可以很方便的嵌入到Percona XtraBackup中,与InnoDB一起工作,目前看是一个比较简单可行的方案。

大实例备份恢复问题

问题来了。
当某个实例的数据量达到TB级,你会发现备库(基于备份)重搭后,启动会灰常灰常慢,因为他们都在recover redo-log,为什么呢?

  1. SET TOKUDB_CHECKPOINT_LOCK=ON;
  2. 开始拷贝TokuDB的数据文件(不包含日志文件),由于拷贝TB级的数据非常耗时,redo log持续增加甚至上万个

当TokuDB启动后,扫描和recover这几万个redo log将是灾难性的。

解决这个问题比较简单,我们稍微调整下热备的顺序即可:

  1. SET TOKUDB_CHECKPOINT_LOCK=ON;
  2. FLUSH TABLES WITH READ LOCK;
  3. 记录binlog位置,拷贝最新的binlog和TokuDB的日志文件(*.tokulog);
  4. UNLOCK TABLES;
  5. 开始拷贝TokuDB的数据文件(不包含日志文件) –移动到这里
  6. SET TOKUDB_CHECKPOINT_LOCK=OFF;

这样在拷贝TokuDB数据文件的时候,就跟redo-log没半毛钱关系了,而且拷贝的redo-log数也大大减少!

优化改进

本以为这样就可以早点下班回家,但问题还是来。

某实例有几十万个TokuDB文件(分区表文件),使用热备的数据备库重搭后,复制过程中偶尔会出现”Duplicate entry … for key ‘PRIMARY’“错误。

引起这个错误的原因比较深,触发自TokuDB内部机制。

TokuDB每个分区表有数个文件组成(想了解TokuDB数据库文件的请轻戳这里),当分区表非常多的时候,打开的文件句柄数会非常多,受限于open_files_limit配置,TokuDB底层会触发句柄关闭机制,对当前文件进行checkpoint操作(新数据被刷到磁盘且生效)再做close,这样即使拿到checkpoint锁后,还是有数据被写入,就引发了以上问题。

为了解决这个问题,我们在热备的过程中引入一个状态:in_backup = true,防止文件关闭做checkpoint操作,具体的patch见这里

这样TokuDB的热备就比较完美了,整个热备过程中,所有的数据文件均处于一个“一致性”状态,所有的操作都在redo-log里,不再污染数据文件。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL Oracle 关系型数据库
MySQL Enterprise Backup使用简介
MySQL Enterprise Backup是一款专门用于备份MySQL数据库发工具。
338 0
|
存储 算法 关系型数据库
MySQL · 源码分析 · Tokudb序列化和反序列化过程
序列化和写盘 Tokudb数据节点写盘主要是由后台线程异步完成的: checkpoint线程:把cachetable(innodb术语buffer pool)中所有脏页写回 evictor线程:释放内存,如果victim节点是dirty的,需要先将数据写回。
3178 0
|
存储 算法 关系型数据库
TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘
HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库。HybridDB采用一份数据存储来进行OLTP和OLAP处理,解决了以往需要把一份数据多次复制来分别进行业务交易和数据分析的问题,极大地降低了数据存储的成本,缩短了数据分析的延迟,使得实时分析决策称为可能。 HybridDB for MySQL兼容MySQL的语法及
3136 0
|
存储 关系型数据库 MySQL
【MySQL】Tokudb安装测试初探
一 前言    TokuDB 是一个高性能、支持MVCC的MySQL 和 MariaDB 的存储引擎。TokuDB 的主要特点是数据压缩功能出色,对高写压力的支持,由美国TokuTek公司(http://www.tokutek.com/) 研发,该公司于2015年4月份被Percona收购,理所当然地提供了TokuDB版本的Percona Server。
1471 0
|
关系型数据库 MySQL 索引
|
存储 关系型数据库 MySQL
MySQL · TokuDB · 日志子系统和崩溃恢复过程
TokuDB日志子系统 MySQL重启后自动加载InnoDB和其他的动态plugin,包括TokuDB。每一plugin在注册的时候指定init和deinit回调函数。TokuDB的init/deinit函数分别是tokudb_init_func和tokudb_done_func。 MySQL重
1897 0
|
存储 MySQL 关系型数据库
MySQL · TokuDB · Savepoint漫谈
问题描述 某TokuDB实例备库发生复制中断,报错信息甚是诡异: Error executing row event: "Can't lock file (errno: 22 - Invalid argument)" 经过gdb core后,大体知道了发生错误的原因: TokuDB在
1379 0
|
存储 缓存 索引
MySQL · TokuDB · TokuDB索引结构--Fractal Tree
背景介绍 TokuDB采用的是Fractal Tree作为索引的数据组织方式。它是一种面向磁盘I/O优化的数据结构,采用“分期偿还”策略减少在数据插入过程中从root节点到leaf节点的搜索过程。这种搜索过程可以简称为locate_position,就是寻找要插入key在Tree中位置的过程。
3250 0

相关产品

  • 云数据库 RDS MySQL 版