背景:

TokuDB引擎是有Tokutek开发的一个数据库存储引擎,在设计之初便引入了独特的索引算法,在其官网测试的文章中看到TokuDB性能比InnoDB高出很多。

MySQL是一个插件式的数据库,在MySQL5.5版本之前MyISAM是MySQL的默认存储引擎,在之后的版本中默认的存储引擎变成了InnoDB。其特点是它支持事务,具有完善的崩溃恢复机制,具体的特点这里不说明,可以自行的寻找资料。这里介绍的TokuDB和InnoDB有很多相似之处:一个高性能,支持事务、MVCC、聚簇索引等。最大的不同在于TokuDB采用了一种叫做Fractal Tree的索引结构,使其在随机写数据的处理上有很大提升。一般来说数据库的索引结构都采用B+Tree或则类似的数据结构,InnoDB也是如此。InnoDB是以主键组织的B+Tree结构,数据按照主键顺序排列。对于顺序的自增主键有很好的性能,但是不适合随机写入,大量的随机I/O会使数据页分裂产生碎片,索引维护开销很多大。而TokuDB的Fractal Tree的索引结构很好的解决了这个问题。

TokuDB解决随机写入的问题得益于其索引结构,Fractal Tree 和 B-Tree的差别主要在于索引树的内部节点上,B-Tree索引的内部结构只有指向父节点和子节点的指针,而Fractal Tree的内部节点不仅有指向父节点和子节点的指针,还有一块Buffer区。当数据写入时会先落到这个Buffer区上,该区是一个FIFO结构,写是一个顺序的过程,和其他缓冲区一样,满了就一次性刷写数据。所以TokuDB上插入数据基本上变成了一个顺序添加的过程。

TokuDB另一个特点是压缩性能和低CPU消耗,TokuDB存储引擎默认的块大小是4M,这使其有更好的压缩效率。默认支持压缩功能,不需要配置其他的东西。压缩选项有:TokuDB_Quicklz、TokuDB_Lzma、TokuDB_Zlib,同时也支持非压缩选项。TokuDB_Zlib支持的默认压缩格式。一般压缩都需要消耗更多的CPU。但TukuDB消耗的CPU资源较少。

TokuDBhttps://www.percona.com/doc/percona-server/5.7/index.html

安装

为了方便安装,直接在percona版本的MySQL上安装TokuDB存储引擎。Ubuntu下apt安装percona MySQL:http://www.percona.com/doc/percona-server/5.6/installation/apt_repo.html

vi /etc/apt/sources.list.d/percona.list

deb http://repo.percona.com/apt trusty main

其他:添加其他软件的更新,和本次安装无关

vi /etc/apt/sources.list

deb http://mirrors.aliyun.com/ubuntu trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu trusty-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse

源添加完毕之后更新:

apt-get update

最后apt安装percona MySQL:

apt-get install percona-server-server-5.6 percona-server-client-5.6

以上percona MySQL安装完毕,接着就开始安装TokuDB。

参考官网的安装说明:https://www.percona.com/doc/percona-server/5.6/tokudb/tokudb_installation.html

安装TokuDB的前提条件是需要支持jemalloc,需要关闭 Transparent huge pages ,执行:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

效果:

root@ptest:~# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
root@ptest:~# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

开始apt安装TokuDB:

root@ptest:~# apt-get install percona-server-tokudb-5.6

安装好检查:

root@ptest:~# ps_tokudb_admin --enable -uroot -p
Enter password:
Continuing without password... Checking if Percona server is running with jemalloc enabled...
grep: /proc//environ: Permission denied
>> Percona server is running with jemalloc enabled. Checking transparent huge pages status on the system...
>> Transparent huge pages are currently disabled on the system. Checking if thp-setting=never option is already set in config file...
>> Option thp-setting=never is not set in the config file.
>> (needed only if THP is not disabled permanently on the system) Checking TokuDB plugin status...
>> TokuDB plugin is installed. Adding thp-setting=never option into /etc/mysql/my.cnf
>> Successfuly added thp-setting=never option into /etc/mysql/my.cnf #把参数thp-setting=never加载到了my.cnf的[mysqld_safe]的选项组下

通过show engines、show plugins 查看存储引擎,是否安装成功,要是没有成功则检查上面是否有错误。要是通过show engines没有TokuDB,但通过show plugins有则需要手动install:

INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_lock_waits SONAME 'ha_tokudb.so';

查看版本:

>SELECT @@tokudb_version;
+------------------+
| @@tokudb_version |
+------------------+
| tokudb-7.5.6 |
+------------------+

以上就完成了TokuDB的安装。详细信息请见官网

测试:针对插入、压缩、存储引擎转换、事务、复制等日常用到的功能进行测试。

1)插入和压缩性能:压缩参数:tokudb_row_format

zjy@127.0.0.1 : test 10:58:58>show create table login_log_Toku\G;
*************************** 1. row ***************************
Table: login_log_Toku
Create Table: CREATE TABLE `login_log_Toku` (
`userID` varchar(255) NOT NULL,
`tryIP` varchar(255) DEFAULT NULL,
`tryTime` datetime DEFAULT NULL,
`tryResult` tinyint(1) DEFAULT '',
`refferUrl` varchar(255) DEFAULT NULL,
`sID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`authType` tinyint(1) DEFAULT '',
`type` tinyint(1) DEFAULT '',
`deviceType` varchar(64) DEFAULT '',
PRIMARY KEY (`sID`),
KEY `idx_tryip` (`tryIP`),
KEY `idx_userid` (`userID`),
KEY `idx_tryTime` (`tryTime`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec) ERROR:
No query specified zjy@127.0.0.1 : test 10:59:45>insert into login_log_Toku select * from login_log;
Query OK, 49534274 rows affected (18 min 35.63 sec)
Records: 49534274 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 11:18:40>create table login_log_innodb like login_log;
Query OK, 0 rows affected (0.11 sec) zjy@127.0.0.1 : test 11:27:58>insert into login_log_innodb select * from login_log;
Query OK, 49534274 rows affected (2 hours 1 min 34.06 sec)
Records: 49534274 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 01:29:38>create table login_log_myisam like login_log;
Query OK, 0 rows affected (0.15 sec) zjy@127.0.0.1 : test 08:56:30>alter table login_log_myisam engine = myisam;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 08:56:51>insert into login_log_myisam select * from login_log;
Query OK, 49534274 rows affected (14 min 25.44 sec)
Records: 49534274 Duplicates: 0 Warnings: 0

上面看到写入TokuDB表的时间远远小于InnoDB,MyISAM(堆表)的写入也比InnoDB好很多。

-rw-rw----  mysql mysql .7K  5月   : login_log_innodb.frm
-rw-rw---- mysql mysql .7G 5月 : login_log_innodb.ibd
-rw-rw---- mysql mysql .7K 5月 : login_log_myisam.frm
-rw-rw---- mysql mysql .8G 5月 : login_log_myisam.MYD
-rw-rw---- mysql mysql .7G 5月 : login_log_myisam.MYI
-rw-rw---- mysql mysql .7K 5月 : login_log_Toku.frm

查看文件,看到InnoDB所占的空间比MyISAM大,9.7>5.5。TokuDB在数据库目录下面只保存.frm表结构定义文件,其数据保存在数据库的目录的上一层(可以通过tokudb_data_dir,tokudb_log_dir指定位置):

ls -lh *toku*
-rw------- mysql mysql 12K 5月 : log000000000005.tokulog27
-rw-rw---- mysql mysql 64K 5月 : _test_sql_c80_2a_status_34_1_1b.tokudb
-rw-rw---- mysql mysql 265M 5月 : _test_login_log_Toku_key_idx_tryip_3c_1_1b_B_1.tokudb
-rw-rw---- mysql mysql 229M 5月 : _test_login_log_Toku_key_idx_tryTime_3c_1_1b_B_3.tokudb
-rw-rw---- mysql mysql 282M 5月 : _test_login_log_Toku_key_idx_userid_3c_1_1b_B_2.tokudb
-rw-rw---- mysql mysql .4G 5月 : _test_login_log_Toku_main_3c_1_1b_B_0.tokudb
-rw-rw---- mysql mysql 17K 5月 : _test_ttt_main_5_1_1b_B_0.tokudb
-rw-rw---- mysql mysql 16K 5月 : _test_ttt_status_3_1_1b.tokudb
-rw-rw---- mysql mysql 32K 5月 : tokudb.directory
-rw-rw---- mysql mysql 16K 5月 : tokudb.environment
-rw------- mysql mysql 5月 : __tokudb_lock_dont_delete_me_data
-rw------- mysql mysql 5月 : __tokudb_lock_dont_delete_me_environment
-rw------- mysql mysql 5月 : __tokudb_lock_dont_delete_me_logs
-rw------- mysql mysql 5月 : __tokudb_lock_dont_delete_me_recovery
-rw------- mysql mysql 5月 : __tokudb_lock_dont_delete_me_temp
-rw-rw---- mysql mysql 32K 5月 : tokudb.rollback

从上面看出,TokuDB的索引文件和数据文件是分开的,一个索引一个文件。总共大小为2.2G,最小。其他为TokuDB的日志文件和一些元数据。

2)存储引擎转换和事务支持:

1:存储引擎转换

zjy@127.0.0.1 : test 06:08:48>show create table log\G;
*************************** 1. row ***************************
Table: log
Create Table: CREATE TABLE `log` (
`userID` varchar(255) NOT NULL,
`tryIP` varchar(255) DEFAULT NULL,
`tryTime` datetime DEFAULT NULL,
`tryResult` tinyint(1) DEFAULT '',
`refferUrl` varchar(255) DEFAULT NULL,
`sID` int(10) unsigned NOT NULL DEFAULT '',
`authType` tinyint(1) DEFAULT '',
`type` tinyint(1) DEFAULT '',
`deviceType` varchar(64) DEFAULT '',
KEY `idx_userid` (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec) ERROR:
No query specified zjy@127.0.0.1 : test 06:08:50>alter table log engine = tokudb;
Query OK, 100 rows affected (0.02 sec)
Records: 100 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 06:08:56>select * from log;
有数据,数据未丢失。 zjy@127.0.0.1 : test 06:09:34>show create table log\G;
*************************** 1. row ***************************
Table: log
Create Table: CREATE TABLE `log` (
`userID` varchar(255) NOT NULL,
`tryIP` varchar(255) DEFAULT NULL,
`tryTime` datetime DEFAULT NULL,
`tryResult` tinyint(1) DEFAULT '',
`refferUrl` varchar(255) DEFAULT NULL,
`sID` int(10) unsigned NOT NULL DEFAULT '',
`authType` tinyint(1) DEFAULT '',
`type` tinyint(1) DEFAULT '',
`deviceType` varchar(64) DEFAULT '',
KEY `idx_userid` (`userID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.12 sec) ERROR:
No query specified zjy@127.0.0.1 : test 06:09:37>alter table log engine = tokudb;
Query OK, 100 rows affected (0.02 sec)
Records: 100 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 06:15:24>select * from log;
有数据,数据未丢失。 反推把TokuDB转换成InnoDB和MyISAM也没有问题。

2:事务支持

zjy@127.0.0.1 : test 03:20:19>create table tmp_innodb(id int,name varchar(10))engine = innodb default charset utf8;
Query OK, 0 rows affected (0.44 sec) zjy@127.0.0.1 : test 03:20:57>create table tmp_myisam(id int,name varchar(10))engine = myisam default charset utf8;
Query OK, 0 rows affected (0.01 sec) zjy@127.0.0.1 : test 03:21:07>create table tmp_tokudb(id int,name varchar(10))engine = tokudb default charset utf8;
Query OK, 0 rows affected (0.05 sec) zjy@127.0.0.1 : test 03:21:17>start transaction;
Query OK, 0 rows affected (0.01 sec) zjy@127.0.0.1 : test 03:21:47>insert into tmp_innodb values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.11 sec)
Records: 3 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 03:22:10>insert into tmp_myisam values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 03:22:17>insert into tmp_tokudb values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 03:22:22>commit;
Query OK, 0 rows affected (0.02 sec) zjy@127.0.0.1 : test 03:22:26>select * from tmp_innodb;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.16 sec) zjy@127.0.0.1 : test 03:22:52>select * from tmp_myisam;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.01 sec) zjy@127.0.0.1 : test 03:22:56>select * from tmp_tokudb; #和innodb一样,数据提交写入
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.01 sec) zjy@127.0.0.1 : test 03:23:04>start transaction; Query OK, 0 rows affected (0.16 sec) zjy@127.0.0.1 : test 03:23:17>insert into tmp_innodb values(11,'aa'),(22,'bb'),(33,'cc');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 03:23:39>insert into tmp_myisam values(11,'aa'),(22,'bb'),(33,'cc');
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 03:23:51>insert into tmp_tokudb values(11,'aa'),(22,'bb'),(33,'cc');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0 zjy@127.0.0.1 : test 03:24:30>rollback;
Query OK, 0 rows affected, 1 warning (0.01 sec) #myisam不支持事务引发的warning zjy@127.0.0.1 : test 03:24:40>select * from tmp_innodb;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.29 sec) zjy@127.0.0.1 : test 03:24:49>select * from tmp_myisam;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 11 | aa |
| 22 | bb |
| 33 | cc |
+------+------+
6 rows in set (0.18 sec) zjy@127.0.0.1 : test 03:24:55>select * from tmp_tokudb; #和innodb一样,数据被回滚。
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.00 sec)

3)复制相关

MySQL的复制是通过Master利用binlog IO线程把修改数据库的SQL推送到Slave上,Slave通过本地的binlog IO线程把SQL写入到中继日志里(relay log)里,再通过SQL线程回放这些SQL,应用到数据库。复制的核心在于binlog,而binlog和存储引擎是没有关系,所以从理论上说主从的存储引擎不一样也不影响复制。

MASTER:主上建表写入
rep@192.168.200.25 : test 08:55:58>create table tmp_engine(id int,name varchar(10))default charset utf8;
Query OK, 0 rows affected (0.24 sec) rep@192.168.200.25 : test 08:56:57>insert into tmp_engine values(1,'a'),(2,'b');
Query OK, 2 rows affected (0.15 sec)
Records: 2 Duplicates: 0 Warnings: 0 rep@192.168.200.25 : test 08:59:18>insert into tmp_engine values(11,'aa'),(22,'bb');
Query OK, 2 rows affected (0.37 sec)
Records: 2 Duplicates: 0 Warnings: 0 rep@192.168.200.25 : test 08:59:25>select * from tmp_engine;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 11 | aa |
| 22 | bb |
+------+------+
4 rows in set (0.24 sec) SLAVE:从上同步数据,并修改存储引擎
zjy@127.0.0.1 : test 09:00:01>select * from tmp_engine;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 11 | aa |
| 22 | bb |
+------+------+
4 rows in set (0.19 sec) zjy@127.0.0.1 : test 09:00:04>alter table tmp_engine engine = tokudb;
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 0 MASTER:主上继续写入
rep@192.168.200.25 : test 09:00:24>insert into tmp_engine values(1111,'aaaa'),(2222,'bbbb');
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0 rep@192.168.200.25 : test 09:00:29>select * from tmp_engine;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 11 | aa |
| 22 | bb |
| 111 | aaa |
| 222 | bbb |
| 1111 | aaaa |
| 2222 | bbbb |
+------+------+
8 rows in set (0.05 sec) SLAVE:从上修改完存储引擎之后,数据继续正常同步。
zjy@127.0.0.1 : test 09:00:13>select * from tmp_engine;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 11 | aa |
| 22 | bb |
| 111 | aaa |
| 222 | bbb |
| 1111 | aaaa |
| 2222 | bbbb |
+------+------+
8 rows in set (0.23 sec)

从上面看出,主从复制和存储引擎无关,从上修改成和主上不同的存储引擎,正常同步。

4)备份相关

TokuDB 有自己的热备份方案:tokudb-hot-backup-part-1tokudb-hot-backup-part-2,和其他存储引擎一样也可以使用mysqldump进行备份。

-- MySQL dump 10.13  Distrib 5.6.19, for osx10.7 (x86_64)
--
-- Host: 192.168.200.240 Database: test
-- ------------------------------------------------------
-- Server version 5.6.23-72.1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; --
-- Table structure for table `tmp_engine`
-- DROP TABLE IF EXISTS `tmp_engine`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tmp_engine` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=TokuDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */; --
-- Dumping data for table `tmp_engine`

从上面看出通过mysqldump进行备份和其他存储引擎备份效果一样。

5)其他

可以像InnoDB存储引擎一样,看事务、锁的信息:

SELECT * FROM information_schema.tokudb_trx;

SELECT * FROM information_schema.tokudb_locks

参数说明:tokudb大部分参数在默认情况下已经工作很好了,下面加粗的参数可以适当的进行修改。

zjy@:dba_test ::>show variables like 'toku%';
+-----------------------------------------+----------------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------------+
| tokudb_alter_print_error | OFF |
| tokudb_analyze_delete_fraction | 1.000000 |
| tokudb_analyze_in_background | OFF |
| tokudb_analyze_mode | TOKUDB_ANALYZE_STANDARD |
| tokudb_analyze_throttle | |
| tokudb_analyze_time | |
| tokudb_auto_analyze | |
| tokudb_block_size | |
| tokudb_bulk_fetch | ON |
| tokudb_cache_size | |
| tokudb_cachetable_pool_threads | |
| tokudb_cardinality_scale_percent | |
| tokudb_check_jemalloc | |
| tokudb_checkpoint_lock | OFF |
| tokudb_checkpoint_on_flush_logs | OFF |
| tokudb_checkpoint_pool_threads | |
| tokudb_checkpointing_period | |
| tokudb_cleaner_iterations | |
| tokudb_cleaner_period | |
| tokudb_client_pool_threads | |
| tokudb_commit_sync | OFF |
| tokudb_compress_buffers_before_eviction | ON |
| tokudb_create_index_online | ON |
| tokudb_data_dir | /var/lib/mysql/tokudb_data |
| tokudb_debug | |
| tokudb_directio | OFF |
| tokudb_disable_hot_alter | OFF |
| tokudb_disable_prefetching | OFF |
| tokudb_disable_slow_alter | OFF |
| tokudb_disable_slow_update | OFF |
| tokudb_disable_slow_upsert | OFF |
| tokudb_empty_scan | rl |
| tokudb_enable_partial_eviction | ON |
| tokudb_fanout | |
| tokudb_fs_reserve_percent | |
| tokudb_fsync_log_period | |
| tokudb_hide_default_row_format | ON |
| tokudb_killed_time | |
| tokudb_last_lock_timeout | |
| tokudb_load_save_space | ON |
| tokudb_loader_memory_size | |
| tokudb_lock_timeout | |
| tokudb_lock_timeout_debug | |
| tokudb_log_dir | /var/lib/mysql/tokudb_log |
| tokudb_max_lock_memory | |
| tokudb_optimize_index_fraction | 1.000000 |
| tokudb_optimize_index_name | |
| tokudb_optimize_throttle | |
| tokudb_pk_insert_mode | |
| tokudb_prelock_empty | ON |
| tokudb_read_block_size | |
| tokudb_read_buf_size | |
| tokudb_read_status_frequency | |
| tokudb_row_format | tokudb_zlib |
| tokudb_rpl_check_readonly | ON |
| tokudb_rpl_lookup_rows | ON |
| tokudb_rpl_lookup_rows_delay | |
| tokudb_rpl_unique_checks | ON |
| tokudb_rpl_unique_checks_delay | |
| tokudb_strip_frm_data | OFF |
| tokudb_support_xa | ON |
| tokudb_tmp_dir | /tmp |
| tokudb_version | 5.6.-76.1 |
| tokudb_write_status_frequency | |
+-----------------------------------------+----------------------------+

tokudb_alter_print_error:alter表操作的时候是否打印错误信息。

tokudb_analyze_in_background:analyze表操作的是否放到后台执行,放后台则执行的时候立即返回,默认不放后台执行。

tokudb_analyze_mode:analyze表的模式,可选择的有:TOKUDB_ANALYZE_CANCELTOKUDB_ANALYZE_STANDARDTOKUDB_ANALYZE_RECOUNT_ROWS,默认是

TOKUDB_ANALYZE_STANDARD。

tokudb_analyze_throttle:定义键的最大数量进行ANALYZE TABLE的每秒访问,默认是0。

tokudb_analyze_time:定义analyze操作计算索引基数的秒数,默认5秒。

tokudb_block_size:内部fractal tree索引和叶节点未压缩大小,默认4M。改变该值只会影响后续新建的表。

tokudb_bulk_fetch:如果设置1,bulk fetch 算法用于select和insert,也包含insert into。默认是1。

tokudb_cache_size(bytes):类似于innodb buffer pool,默认是一半的物理内存,推荐80%的内存(要是全部都使用tokudb引擎)。

缓存大小,读写时候,数据会首先会缓存到这里。默认大小为机器物理内存的一半。

tokudb_check_jemalloc:检查jemalloc链接,默认1。

tokudb_checkpoint_lock:锁定TokuDB检查点。当设置为1,TokuDB检查站被锁定。设置为0,或断开的客户端,释放该锁。默认0。

tokudb_checkpoint_on_flush_logs:在刷写日志的时候checkpoint,默认是0。

tokudb_checkpointing_period:默认60s,建议默认,不需要改变。

checkpoint的时间间隔,默认60s,innodb有2种checkpoint机制,一个是在数据库关闭时,刷写脏页到磁盘;另一个在数据库运行时刷出一部分脏页。而TokuDB采取第一种,60s刷写脏页。Innodb的重做日志是一组日志文件循环写入,当日志文件写满时会从头开始写,当头的数据页还没有刷写到磁盘会卡住进行强制刷写,此时的写入操作都要等待。TokuDB没有重做日志的概念,当写满日志文件时,会生成下一个文件,继续写。当数据被刷写到磁盘后会被purge。

tokudb_cleaner_iterations:这个变量指定多少个内部节点在 tokudb_cleaner_period周期内清理。默认值是5,将此变量设置为0关闭清理线程。

tokudb_cleaner_period:这个变量指定以秒为单位的频率允许清理线程。默认值是1,将此变量设置为0关闭清理线程。

tokudb_commit_sync(ON/OFF):类似于innodb_flush_log_at_commit,默认1。

当事务提交的时候,是否要fsync log到磁盘。
默认开启(ON),如果设置为OFF,性能会提升,但可能会丢失事务(commit记录到log buffer,但是未fsync到磁盘的事务)。

tokudb_create_index_online:默认开启

开启表示在创建索引时,表可以被插入和查询,关闭则表示创建索引时不能被插入和查询,默认开启。

tokudb_data_dir:这个变量指定tokudb表的存储目录。

tokudb_log_dir:这个变量指定tokudb日志的存储目录。

tokudb_debug:这个变量表示是否开启tokudb的debug模式,默认关闭。

tokudb_directio(ON/OFF):

是否开启Direct I/O功能,TokuDB在写盘的时候,无论是否开启Direct I/O,都是按照512字节对齐的。默认为OFF。开启表示写操作不经过缓存,直接写磁盘

tokudb_disable_hot_alter这个变量表示是否支持在线alter操作,OFF支持,ON表示关闭。默认是OFF。

tokudb_disable_prefetching:TokuDB试图预取行的附加块,这对于大多数范围查询有帮助的,但可能会对范围查询与LIMIT子句造成不必要的IO。默认为0:开启;1:关闭。

tokudb_disable_slow_alter:建议设置OFF,这个变量控制是否慢alter操作被允许,一般TokuDB列添加,删除,扩展,重命名非常快。混合的alter,包含添加add和删除drop的操作会慢。默认关闭(OFF):支持混合的alter语句。设置开启(ON)遇到慢的alter(混合)则会报错:

ERROR  (): Table '...' uses an extension that doesn't exist in this MySQL version

tokudb_fs_reserve_percent默认5,磁盘剩余可用空间低于5%的时候,拒绝写入,直到释放出更多的空间。可以查看这个例子说明

这个变量控制可以写入文件系统的百分比。默认为5,意思是磁盘剩余可用空间低于5%的时候,拒绝写入,直到释放出更多的空间(每五秒去检测磁盘空间大小)。一旦停用,插入将被重新启用,有2倍的储备可用。如果磁盘完全满TokuDB将完全冻结。我们建议大小为物理内存至少有一半的大小。

tokudb_fsync_log_period:默认0

多久fsync一下log buffer到磁盘,TokuDB的log buffer总大小为32MB且不可更改。默认为0ms(此时做fsync的后台线程一直处于wait状态),设置0,受tokudb_commit_sync开关控制是否要fsync log到磁盘(checkpoint也会fsync log buffer的,默认为1分钟)。

tokudb_hide_default_row_format:隐藏默认的row format,默认1。

tokudb_killed_time:该变量控制锁回滚的频率。默认4000ms,4s。

tokudb_last_lock_timeout:默认为空,当检测到死锁时,或锁请求超时,显示出一个描述最近锁定冲突JSON文档。只有tokudb_lock_timeout_debug设置了才生效。可以看个例子说明

tokudb_load_save_space:默认为1,表示数据load的时候压缩。

tokudb_loader_memory_size:限制了内存的TokuDB批量载入程序,将用于每个Loader实例的数量,默认为100 MB。

tokudb_lock_timeout:即锁超时时间,一个事务等待其他事务持有的锁被释放的,如果冲突的事务锁超时时间内解除锁定,这是等待锁的事务将获得的锁超时错误。默认4000毫秒,即4秒。

tokudb_lock_timeout_debug:以JSON文档的格式描述锁冲突的信息。默认为1:通过select @@tokudb_last_lock_timeout可以查看锁冲突信息;2:通过错误日志查看锁冲突信息;3:可以通过1和2查看锁冲突信息;0:没有锁冲突和死锁信息。

tokudb_max_lock_memory:锁可用的最大内存。

tokudb_optimize_index_fraction:优化索引树的百分比,默认是1(整个索引树),可选范围是0~1。

tokudb_optimize_index_name:优化表中指定的单个索引。

tokudb_optimize_throttle:默认情况下优化表使用所有可用的资源。此变量允许表优化速度,以便减少所使用的总资源的限制。限制每秒优化分形树的叶节点的数量。默认值0,并没有规定限制。

tokudb_pk_insert_mode使用replace into或insert ignore into的主键写入到没有二级索引或则二级索引包含在主键里的表的模式。默认是1,可以选择值有0和2。

1:如果没有定义触发器则快速写入,否则写入慢并且row模式下的复制不工作。

2:写入慢,触发器和row模式下的复制工作正常。

0:快速写入,触发器不工作,row模式的复制不工作。

疑惑:触发器没有测试,但是测试下来replace into 和 insert ingore 的row模式下的复制都正常?还是row模式下的触发器的行为?(待测)

tokudb_prelock_empty:默认1,开启批量加载,只有一个事务加载表,会加快插入。通常情况下,TokuDB取得对空表的表锁,但是如果有多个事务加载,但只有一个事务可以访问。设置0则避免了这个情况,可以加快插入,但是批量加载将被关闭。

tokudb_read_block_size:默认65536,64K。在fractal Tree索引上读取的未压缩的块字节。改变只会影响后期创建的表。值越大,对于大范围的扫描和较高的压缩更好,而较小的值对小范围扫描更好。

tokudb_read_buf_size:默认131072,128K。每个客户端使用缓冲区的字节数,用于存储大容量读取值。设为0将禁用大容量读取。

tokudb_read_status_frequency:通过show processlist判断一些查询的进展。如:查询、插入、删除、更新。默认10000,用于读取控制读取进展,被设置到10000的频率。设置1,检查慢查询。

tokudb_write_status_frequency:通过show processlist判断一些查询的进展。如:查询、插入,删除、更新。默认1000。控制写的频率,对于慢查询,设置1,再运行SHOW PROCESSLIST几次,了解正在取得进展的。

tokudb_rpl_check_readonly:默认情况下,当从处于只读模式,行模式事务将从二进制日志使用TokuDB的read-free replication(RFR)。这个变量设置为OFF关闭只读检查从,允许当从不只读的时候运行RFR。默认ON,不建议修改。

tokudb_rpl_lookup_rows:如果设置成OFF,binlog_format是Row并且read_only开启,tokudb的从库不会执行的行查找的更新或删除行的日志事件,消除对相关的IO的需求。默认是ON,不建议修改。

tokudb_rpl_lookup_rows_delay:默认0,关闭。用于模拟在行查找查询之前读取。长sleep通过的指定的时间,以微秒为周期。

tokudb_rpl_unique_checks:默认ON,开启。禁用时,TokuDB从跳过插入和更新唯一性的检查。从而消除了所有相关的读IO的操作。

tokudb_rpl_unique_checks_delay:默认0,关闭。用于模拟在行查找查询之前读取。长sleep通过的指定的时间,以微秒为周期。

tokudb_row_format

 tokudb_row_format 可以设置如下的几个值:
tokudb_default: 设置默认的压缩行为。在 TokuDB 7.1.0版本,默认使用zlib 库进行压缩,未来版本可能会改变。
tokudb_fast: 使用quicklz 库的压缩模式。
tokudb_small: 使用 lzma 库的压缩模式。
tokudb_zlib: 使用 zlib 库的压缩模式,提供了中等级别的压缩比和中等级别的CPU消耗。
tokudb_quicklz: 使用 quicklz 库的压缩模式, 提供了轻量级的压缩比和较低基本的CPU消耗。
tokudb_lzma: 使用lzma库压缩模式,提供了高压缩比和高CPU消耗。
tokudb_uncompressed: 不使用压缩模式。
可以使用如下命令修改行格式:
ALTER TABLE table_name ROW_FORMAT=row_format;
注意修改行格式的操作也是online 操作。

tokudb_support_xa:默认开启,是否支持XA事务。

tokudb_tmp_dir:临时文件目录。

tokudb_version:tokudb的版本。

针对不同的使用场景: 

1) 对数据要求较高(不允许丢失数据,事务ACID完整性),只需根据内存调整tokudb_cache_size大小即可,建议开启tokudb_directio。
2) 对数据要求不太高(允许部分数据丢失,不要求事务ACID完整性),可配置:
tokudb_commit_sync=OFF
tokudb_fsync_log_period=1000 #1秒
在此配置下,每1秒对log buffer做下fsync,可充分利用log的group commit功能,如果TokuDB挂掉,则可能会丢失最多1秒的数据。

tokudb参数模板

# * TokuDB
tokudb_cache_size = 512M
tokudb_commit_sync = 0
tokudb_create_index_online = 1
tokudb_checkpointing_period = 60
tokudb_fsync_log_period = 1000
tokudb_directio = 0
tokudb_disable_hot_alter= 0
tokudb_disable_slow_alter = 0
tokudb_fs_reserve_percent= 10
tokudb_lock_timeout = 4000
tokudb_killed_time = 4000
tokudb_lock_timeout_debug = 1
tokudb_optimize_index_fraction = 1
tokudb_read_status_frequency = 1
tokudb_write_status_frequency = 1
#no tiggers
tokudb_pk_insert_mode = 1
tokudb_data_dir = /var/lib/mysql/tokudb_data
tokudb_log_dir = /var/lib/mysql/tokudb_log
tokudb_tmp_dir = /tmp

关于TokuDB的文件说明可以看 http://mysql.taobao.org/monthly/2015/09/10/?spm=5176.100239.0.0.0o6KjD

性能测试:InnoDB vs TokuDB

http://blog.csdn.net/lidan3959/article/details/37511645

http://www.cnblogs.com/billyxp/p/3567421.html#2888035

http://www.tokutek.com/tokudb-for-mysql/tokudb-vs-innodb/

总结:

TokuDB优点

1,online ddl 非常给力,特别是对字段的修改非常快
2,压缩比非常高通常都能达到7,8倍的压缩比
3,完全支持ACID事物的四大特性
4,Fractal-tree在事务实现上有优势,无undo log
5,Leaf节点做MVCC,实现最终多版本
6,tokudb.rollback记事务逻辑日志

TokuDB缺点
1,响应时间相对较长
2,online ddl 对text,blob等类型的字段不适用
3,没有合适的备份工具,只能通过mysqldump进行逻辑备份
建议适用场景:
1,访问频率不高的数据或历史数据归档
2,表非常大并且时不时还需要进行ddl操作

参考文章:

TokuDB在网易生产环境中的应用实践:http://www.zeuux.com/group/mysql/bbs/content/55227/

TokuDB参数:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29578485&id=4928669 

TokuDB参数:https://www.percona.com/doc/percona-server/5.7/tokudb/tokudb_variables.html

TokuDB参数:https://mariadb.com/kb/en/mariadb/tokudb-system-variables/

TokuDB 使用简单说明

MySQL 高性能存储引擎:TokuDB初探

TokuDB 引擎安装测试的更多相关文章

  1. tokudb引擎安装-2

    前言:因为现在tokuDB直接整合到Percona server里面了,下载页面直接跳转到下载Percona Server 页面了.安装方法跟以前不一样了,下面就来看一下新版本怎么安装了 ##准备阶段 ...

  2. ubuntu-10.04的测试环境 安装测试 Coreseek开源中文检索引擎-Sphinx中文版

    主要参考文档:http://www.coreseek.cn/products-install/install_on_bsd_linux/ 一. 32位版本: coreseek安装需要预装的软件: ap ...

  3. 【MySQL】TokuDB引擎初探(MySQL升级为Percona,MySQL升级为MariaDB)

    参考:http://blog.sina.com.cn/s/blog_4673e6030102v46l.html 参考:http://hcymysql.blog.51cto.com/5223301/14 ...

  4. node.js介绍及Win7环境安装测试(转)

    官网描述: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...

  5. TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘

    原文出处:阿里云RDS-数据库内核组 HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库.HybridDB采用一份数据存 ...

  6. mahout 安装测试

    1 下载 在http://archive.apache.org/dist/mahout下载相应版本的mahout 版本,获取官网查看http://mahout.apache.org 相关的信息

  7. Hbase的安装测试工作

    Hbase的安装测试工作: 安装:http://www.cnblogs.com/neverwinter/archive/2013/03/28/2985798.html 测试:http://www.cn ...

  8. ubuntu下opencv2.4.9安装测试

    ubuntu下opencv2.4.9安装测试 whowhoha@outlook.com 一.依赖包安装 1.  build-essential 软件包 sudo apt-get install bui ...

  9. 如何在本地安装测试ECSHOP 转载

    如何在本地安装测试ECSHOP 如何在本地(自己的电脑)上先安装ECShop 一.创建PHP环境 1.下载AppServ 因为ECShop在线网上商店系统是用PHP语言开发的,所以,在本地架设网店之前 ...

随机推荐

  1. [Asp.Net]获取客户端ip和mac地址

    摘要 有时候,我们需要获取客户端的一些信息,以便进行统计.比如:客户端的唯一标识,ip等信息 IP 通过获取HTTP_X_FORWARDED_FOR,或者REMOTE_ADDR可以获取客户端的ip. ...

  2. webapi支持跨域访问

    写在前面 在实际应用中,跨域请求还是比较常见的,如何上接口直接支持跨域的访问呢? demo 场景项目A有个接口用来获取用户列表,现在项目b也有个功能需要加载用户列表.这两个项目在两个域名下,至少端口好 ...

  3. linux下代替system的基于管道的popen和pclose函数

    linux下使用system需要谨慎,那么代替它的方法是什么呢? 标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行. 这里我们称调用popen的进程为父进程,由pop ...

  4. 如何在服务器上搭建git服务器

    参考文章: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770 ...

  5. ls按时间排序输出文件列表

    文件转自:http://www.2cto.com/os/201303/197829.html ls按时间排序输出文件列表   首先,ls --help查看ls相关的与时间排序相关的参数:   > ...

  6. django book

    一.安装配置 1.下载地址: https://www.djangoproject.com/download/ 2.安装: tar zxvf Django-1.6.1.tar.gz && ...

  7. 自定义select控件开发

    目的:select下拉框条目太多(上百),当用户选择具体项时会浪费用户很多时间去寻找,因此需要一个搜索框让用户输入关键字来匹配列表,便于用户选择 示例图: 1.html结构 <div class ...

  8. jQuery源码-jQuery.fn.attr与jQuery.fn.prop

    jQuery.fn.attr.jQuery.fn.prop的区别 假设页面有下面这么个标签,$('#ddd').attr('nick').$('#ddd').prop('nick')分别会取得什么值? ...

  9. Markdown 写作工具选择

    Markdown 写作工具选择 候选产品 参考了少数派网站 markdown 写作工具2015年度盘点 http://sspai.com/32483, Windows 下 Markdown 的编辑工具 ...

  10. SqlServer中字符串和日期类型的转换

    SQL Server Date 函数 定义和用法 CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() 函数可以用不同的格式显示日期/时间数据. 语法 CONVERT(da ...