RocksDB是facebook基于LevelDB实现的,目前为facebook内部大量业务提供服务。经过facebook大量工作,将RocksDB作为MySQL的一个存储引擎移植到MySQL,称之为MyRocks。
经过两年的发展,MyRocks已经比较成熟(RC阶段),现已进入了facebook MySQL的主分支了。MyRocks是开源的,参见git 。
下面对MyRocks做一个简单介绍,不涉及源码。
来看看facebook的测试数据
数据字段信息保存在System Column Family (System CF) “system“中
数据字段信息包括:
以上信息可以通过information_schema查看,如RocksDB_ddl,RocksDB_index_file_map等
RocksDB的行以key value的形式存储,和innodb类似,记录格式主键和二级索引也有区别
MyRocks也是基于行锁,锁信息都保存在内存中。
MyRocks也支持MVCC,MVCC通过快照的方式实现,类似于PostgreSQL。
MyRocks目前只支持两种隔离级别,RC和RR。
RR表现和innodb并不一样,RocksDB 的快照不是在事务开始的时候建立,而是延迟到第一次读的时候建立.
以下client1 MyRocks返回的是2,innodb返回1
- <client 1> <client 2>
- CREATE TABLE t1(pk INT PRIMARY KEY);
- INSERT INTO t1 VALUES(1);
- SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- BEGIN
- INSERT INTO t1 VALUES(2);
- SELECT COUNT(*) FROM t1; // MyRocks返回的是2,innodb返回1
RC表现也不一样,事务1大更新多行过程中,其他事务也可以更新事务还未更新到的行,事务1再更新时会失败。
MyRocks也是通过binlog方式复制,由于binlog与RocksDB之间没有xa,异常crash可能丢数据,所以,MyRocks主备环境建议开启semi-sync.
由于gap lock支持不健全(仅primary key上支持), 使用statement方式复制会导致不一致,所有MyRocks建议使用行级复制。
支持MySQLdumup逻辑备份
- #内部会执行以下语句
- SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- START TRANSACTION WITH CONSISTENT RocksDB SNAPSHOT;
同时有自动的物理备份工具MyRocks_hotbackup,但还不支持备份innodb; 也不支持增量备份。MyRocks_hotbackup支持流式备份
- MyRocks_hotbackup--user=root --port=3306 --checkpoint_dir=/data/backup --stream=xbstream| ssh$dst‘xbstream–x /data/backup’
- #内部建立硬链接方式备份数据SST files,checkpoint多次更新,只备份新的SST files, 因此WAL日志很少,恢复时apply log时间很短
- SET GLOBAL RocksDB_create_checkpoint= /path/to/backup
- rocksdb_skip_unique_check=1
- rocksdb_commit_in_the_middle=1
- rocksdb_write_disable_wal=1
- rocksdb_max_background_flushes=40
- rocksdb_max_background_compactions=40
- rocksdb_default_cf_options=(in addition to existing parameters); write_buffer_size=128m;level0_file_num_compaction_trigger=4;level0_slowdown_writes_trigger=256;level0_stop_writes_trigger=256;max_write_buffer_number=16;memtable=vector:1024
- rocksdb_override_cf_options=(in addition to existing parameters);__system__={memtable=skip_list:16}
MyRocks目前有以下一些限制
来源: http://mysql.taobao.org/monthly/2016/08/03/