MariaDB开启TokuDB存储引擎

应用场景

由于运维及存档分析需要,需要将某些程序、文件调用日志导入到本地MariaDB数据库存储。同时为了节省磁盘空间,决定使用TokuDB存储引擎。

在MariaDB5.5.3410.0.6之后的版本已经包含了TokuDB存储引擎,只是默认没有开启,可以根据需要手动进行开启。开启方式也很简单,方法如下文介绍。

MariaDB的二进制包版本中,只有名称中带有glibc_214的压缩包版本,才包含TokuDB引擎。

系统环境

  • OS: CentOS 7
  • DB Version: MariaDB Enterprise 10.0.23

禁用Transparent Huge Pages(THP)

检查Linux是否开启Transparent Huge Pages。如果有开启,则需要关闭,否则MariaDB无法开启TokuDB引擎。

原因:

Transparent Huge Pages is a feature in newer linux kernel versions that causes problems for the memory usage tracking calculations in TokuKV and can lead to memory overcommit. If you have this feature enabled, TokuKV will not start, and you should turn it off.

如果没有禁用Transparent Huge Pages,则开启TokuDB后启动MariaDB时,错误日志记录如下,不过mysqld服务仍是可以正常启动的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Transparent huge pages are enabled, according to /sys/kernel/mm/transparent_hugepage/enabled
160517 11:40:22 [ERROR] TokuDB: Huge pages are enabled, disable them before continuing
160517 11:40:22 [ERROR] ************************************************************
160517 11:40:22 [ERROR]
160517 11:40:22 [ERROR]                         @@@@@@@@@@@
160517 11:40:22 [ERROR]                       @@'         '@@
160517 11:40:22 [ERROR]                      @@    _     _  @@
160517 11:40:22 [ERROR]                      |    (.)   (.)  |
160517 11:40:22 [ERROR]                      |             ` |
160517 11:40:22 [ERROR]                      |        >    ' |
160517 11:40:22 [ERROR]                      |     .----.    |
160517 11:40:22 [ERROR]                      ..   |.----.|  ..
160517 11:40:22 [ERROR]                       ..  '      ' ..
160517 11:40:22 [ERROR]                         .._______,.
160517 11:40:22 [ERROR]
160517 11:40:22 [ERROR] TokuDB will not run with transparent huge pages enabled.
160517 11:40:22 [ERROR] Please disable them to continue.
160517 11:40:22 [ERROR] (echo never > /sys/kernel/mm/transparent_hugepage/enabled)
160517 11:40:22 [ERROR]
160517 11:40:22 [ERROR] ************************************************************
160517 11:40:22 [ERROR] Plugin 'TokuDB' init function returned error.
160517 11:40:22 [ERROR] Plugin 'TokuDB' registration as a STORAGE ENGINE failed.

未禁用Transparent Huge Pages时,在MySQL命令行,开启TokuDB时,报错信息如下:

1
2
mysql> INSTALL SONAME 'ha_tokudb';
ERROR 1123 (HY000): Can't initialize function 'TokuDB'; Plugin initialization function failed.

检查是否开启Transparent Huge Pages

1
shell> cat /sys/kernel/mm/transparent_hugepage/enabled

执行以上命令,如果提示路径不存在,或返回以下信息,则表示没有开启Transparent Huge Pages。

1
always madvise [never]

如果返回以下信息,则表示已开启Transparent Huge Pages,需要将其禁用。

1
[always] madvise never

禁用Transparent Huge Pages

临时禁用

以下更改立即生效,在重启后失效:

1
shell> echo never > /sys/kernel/mm/transparent_hugepage/enabled

永久禁用

以下更改在重启后生效,且仅限CentOS或RedHat系统。

在文件/etc/default/grub添加以下内容:

1
GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"

更新grub (boot loader):

1
shell> grub2-mkconfig -o /boot/grub2/grub.cfg "[email protected]"

以上是MariaDB官方文档介绍的方法。
在公司的测试机上按照以上修改,重启电脑后,Transparent Huge Pages和预料中的一样,被禁用掉了。可是,当我在自己的虚拟机和本地开发机器上,按照以上修改重启系统后,Transparent Huge Pages并没有被禁用掉。如下:

1
2
shell> cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

参考MongoDB官方文档,在禁用Transparent Huge Pages时提到,如果有在Red Hat或者CentOS(6+)系统使用tuned或ktune,还需要添加额外的配置,以防止THP被重新启用。

tuned和ktune是Red Hat和CentOS系统上的动态调优工具,通过其能够禁用transparent huge pages。如果要通过tuned和ktune来禁用transparent huge pages,需要创建一个配置文件设置THP的值为never

以下是CentOS 7系统通过添加tuned配置文件来禁用transparent huge pages的方法,CentOS 6系统的配置方法与此有些不同,可以参考MongoDB官方文档

  1. 新建tuned配置文件夹

    1
      shell> mkdir /etc/tuned/no-thp
  2. 添加配置文件tuned.conf

    1
      shell> vim /etc/tuned/no-thp/tuned.conf

    并添加以下配置内容:

    1
    2
    3
    4
      [main]
      include=virtual-guest
      [vm]
      transparent_hugepages=never
  3. 使新的配置文件生效

    1
      shell> tuned-adm profile no-thp

以上配置添加完成后,再次重启系统,查看及确认Transparent Huge Pages已经被禁用,如下。

1
2
shell> cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

修改MariaDB配置文件,启用TokuDB

在配置文件my.cnf中添加以下配置,在每次启动时都启用TokuDB存储引擎,重启生效。

1
plugin-load = ha_tokudb

当然,也可以在不重启MariaDB的情况下,执行以下MySQL命令,启用TokuDB存储引擎。

1
mysql> INSTALL SONAME 'ha_tokudb';

使用SHOW ENGINES命令查看已开启的存储引擎,可以看到TokuDB已启用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                    | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | CSV storage engine                                                         | NO           | NO   | NO         |
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                      | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                  | NO           | NO   | NO         |
| BLACKHOLE          | NO      | /dev/null storage engine (anything you write to it disappears)             | NULL         | NULL | NULL       |
| MyISAM             | YES     | MyISAM storage engine                                                      | NO           | NO   | NO         |
| TokuDB             | YES     | Percona TokuDB Storage Engine with Fractal Tree(tm) Technology             | YES          | YES  | YES        |
| InnoDB             | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| ARCHIVE            | NO      | Archive storage engine                                                     | NULL         | NULL | NULL       |
| FEDERATED          | YES     | FederatedX pluggable storage engine                                        | YES          | NO   | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                         | NO           | NO   | NO         |
| Aria               | YES     | Crash-safe tables with MyISAM heritage                                     | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.02 sec)

相关参数配置

1
2
3
4
5
6
7
8
[mysqld]
# TokuDB
plugin-load = ha_tokudb
tokudb_cache_size = 4G
tokudb_data_dir = /data/mysql/mysql3306/tokudb_data
tokudb_log_dir = /data/mysql/mysql3306/logs
tokudb_tmp_dir = /data/mysql/mysql3306/tmp
tokudb_pk_insert_mode = 2

各参数说明:

  • tokudb_cache_size
    默认情况下,TokuDB分配50%的系统内存。
  • tokudb_data_dir
    指定TokuDB数据的存储位置。默认为空,使用datadir定义的路径。
  • tokudb_log_dir
    指定TokuDB日志的存储位置。默认为空,使用datadir定义的路径。
  • tokudb_tmp_dir
    TokuDB批量导入数据时,临时文件的存储位置。TokuDB在使用LOAD DATA导入数据的时候会通过临时表(可能会很大)来完成。
    默认为空,使用datadir定义的路径。
  • tokudb_pk_insert_mode
    主键写入的模式,只有值为2时,才支持RBR。

注意事项

变量toukudb_cache_size的值大小设置

TokuDB默认分配50%的系统内存,该值由变量toukudb_cache_size控制,类似于InnoDB的innodb_buffer_pool_size
如果同时使用InnoDB和TokuDB存储引擎,需适当调整这两个变量的值,以免超过系统内存,造成swap交换。

toukudb_cache_size为只读变量,修改后重启生效。

变量tokudb_pk_insert_mode对复制的影响

当变量tokudb_pk_insert_mode为默认值(1)或0时,基于ROW格式的复制(RBR)将无法运行,需要将该变量的值修改为2,RBR才能正常运行。

变量tokudb_pk_insert_mode的说明如下:

  • Description: Mode for primary key inserts using either REPLACE INTO or INSERT IGNORE on tables with no secondary index, or where all columns in the secondary index are in the primary key. For example PRIMARY KEY (a,b,c), key (b,c)
    • 0: Fast inserts. Triggers may not work, and row-based replication will not work.
    • 1: Fast inserts if no triggers are defined, otherwise inserts may be slow. Row-based replication will not work.
    • 2: Slow inserts. Triggers and row-based replication work normally.
  • Scope: Global, Session
  • Dynamic: Yes
  • Data Type: enumerated
  • Default Value: 1
  • Valid Values: 0, 1, 2

数据占用存储空间对比

使用MyISAM引擎存储日志数据时,表数据大小是13G;更改为TokuDB引擎后,使用默认的压缩方式(tokudb_zlib),表数据大小是1.6G。可以看出,TokuDB相对于MyISAM,数据压缩比达到8倍之多。

参考文章

  1. MariaDB官方文档-Enabling TokuDB:
    https://mariadb.com/kb/en/mariadb/enabling-tokudb
  2. MongoDB官方文档-Disable Transparent Huge Pages(THP):
    https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
  3. TokuDB使用简单说明:
    http://highdb.com/tokudb-特性概览/