MySQL · TokuDB · 让Hot Backup更完美

简介: 前言 很久很久以前,内核君发表了一篇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里,不再污染数据文件。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
SQL Oracle 关系型数据库
MySQL Enterprise Backup使用简介
MySQL Enterprise Backup是一款专门用于备份MySQL数据库发工具。
661 0
|
存储 算法 关系型数据库
MySQL · 源码分析 · Tokudb序列化和反序列化过程
序列化和写盘 Tokudb数据节点写盘主要是由后台线程异步完成的: checkpoint线程:把cachetable(innodb术语buffer pool)中所有脏页写回 evictor线程:释放内存,如果victim节点是dirty的,需要先将数据写回。
3273 0
|
存储 算法 关系型数据库
TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘
HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库。HybridDB采用一份数据存储来进行OLTP和OLAP处理,解决了以往需要把一份数据多次复制来分别进行业务交易和数据分析的问题,极大地降低了数据存储的成本,缩短了数据分析的延迟,使得实时分析决策称为可能。 HybridDB for MySQL兼容MySQL的语法及
3293 0
|
存储 关系型数据库 MySQL
【MySQL】Tokudb安装测试初探
一 前言    TokuDB 是一个高性能、支持MVCC的MySQL 和 MariaDB 的存储引擎。TokuDB 的主要特点是数据压缩功能出色,对高写压力的支持,由美国TokuTek公司(http://www.tokutek.com/) 研发,该公司于2015年4月份被Percona收购,理所当然地提供了TokuDB版本的Percona Server。
1593 0
|
关系型数据库 MySQL 索引
|
存储 关系型数据库 MySQL
MySQL · TokuDB · 日志子系统和崩溃恢复过程
TokuDB日志子系统 MySQL重启后自动加载InnoDB和其他的动态plugin,包括TokuDB。每一plugin在注册的时候指定init和deinit回调函数。TokuDB的init/deinit函数分别是tokudb_init_func和tokudb_done_func。 MySQL重
2043 0
|
存储 MySQL 关系型数据库
MySQL · TokuDB · Savepoint漫谈
问题描述 某TokuDB实例备库发生复制中断,报错信息甚是诡异: Error executing row event: "Can't lock file (errno: 22 - Invalid argument)" 经过gdb core后,大体知道了发生错误的原因: TokuDB在
1487 0
|
存储 缓存 索引
MySQL · TokuDB · TokuDB索引结构--Fractal Tree
背景介绍 TokuDB采用的是Fractal Tree作为索引的数据组织方式。它是一种面向磁盘I/O优化的数据结构,采用“分期偿还”策略减少在数据插入过程中从root节点到leaf节点的搜索过程。这种搜索过程可以简称为locate_position,就是寻找要插入key在Tree中位置的过程。
3449 0

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多