MyRocks简介:
MyRocks是facebook开发的一款基于RocksDB的开源MySQL存储引擎,基于oracle MySQL5.6版本。
MyRocks库由Facebook 数据库工程团队维护。
RocksDB是一个可嵌入的、持久K-V存储。
RocksDB 是基于log-structured merge-tree(LSM-tree),针对快速存储进行了优化,并将出色的
存储空间和读写性能均衡相结合。若生产环境使用SSD等快速存储,MyRocks有以下优势:
1.更少的存储空间,节省存储空间
2.更多的存储耐久性,写入性能提升
3.提供更好的IO容量,查询效率更高
4.复制速度更快。
MyRocks派生版本(MyRocks Variants):
Facebook's MySQL Branch(基于MySQL5.6,upcoming 8.0)
MariaDB 10.2.16+
MariaDB 10.3.7+
Percona Server 5.7.20+
MariaDB10.2 和MariaDB10.3以及Percona已经发布正式版本,MyRocksDB和InnoDB可以共存。
截止2018.7.30日各个分支使用的最新版本如下:
RocksDB version:
Facebook:5.16 详细见文件:https://github.com/facebook/rocksdb/blob/master/include/rocksdb/version.h
MariaDB:5.10.0 (MariaDB10.3.8)
Percona:5.10.0 (Percona Server 5.7.22-22)
相比于InnoDB 目前MyRocksDB还缺少如下功能:
Online DDL尚不支持,但是支持更快的添加和删除索引;
ALTER TABLE ... EXCHANGE PARTITION 尚不支持;
SAVEPOINT 缺失;
Transportable tablespace 不支持
Foreign keys 不支持
Spatial indexes 不支持
Fulltext indexes 不支持
Gap locks支持但是 MyRocks不支持Next-key Lock
Group Replication
不支持galera cluster;
只支持64bit的,不支持32bit;
不支持MariaDB的optimistic parallel replication;
MyRocks存储引擎本身还有如下不足:
1.XA protocol 不被很好的支持,目前是MyRocks中的一个实验性质的功能;
2.排序很慢。ORDER BY DESC 或者 ORDER BY ASC都比较慢,这是因为RocksDB的Prefix Key Encoding功能。默认的升序扫描(ascending scan)较快但是降序扫描更慢;若配置了reverse column family 则反之。
3.MyRocks 仅支持Row-based replication,当然SBR也支持 但是不推荐使用。
4.对排序规则目前仅支持*_bin_collation对CHAR/VARCHAR列进行索引。
5.binlog与RocksDB之间没有xa,异常crash可能丢数据。所以,MyRocks一般开启semi-sync.
6.从MyISAM或者InnoDB存储引擎大量的数据转为MyRocksDB尽量不要使用ALTER or INSERT INTO SELECT
(主要是防止表足够大将导致服务器占用所有内存最终OOM)
推荐使用data load的方式新建表并配置一下参数:
SET session sql_log_bin=0;
SET session rocksdb_bulk_load=1;
ALTER TABLE large_myisam_table ENGINE=RocksDB;
SET session rocksdb_bulk_load=0;
MyRocks存储引擎被MariaDB和Percona支持,截止2018.7.30支持的操作系统如下:
Percona server:
Debian 8 (“jessie”)
Debian 9 (“stretch”)
Ubuntu 14.04 LTS (Trusty Tahr)
Ubuntu 16.04 LTS (Xenial Xerus)
Ubuntu 16.10 (Yakkety Yak)
Ubuntu 17.04 (Zesty Zapus)
Red Hat Enterprise Linux or CentOS 6 (Santiago)
Red Hat Enterprise Linux or CentOS 7 (Maipo)
MariaDB:
Red Hat Enterprise Linux or CentOS 7 (Maipo)
Debian 8 (“jessie”)
Debian 9 (“stretch”)
Ubuntu 14.04 LTS (Trusty Tahr)
Ubuntu 16.04 LTS (Xenial Xerus)
Ubuntu 16.10 (Yakkety Yak)
Fedora 24
Fedora 25
OpenSUSE 42
windows 64(zip and MSI)
MyRocks目前的用户:
Facebook和Alibaba等
MyRocks事务:
MyRocks也是基于行锁,锁信息都保存在内存中。
MyRocks也支持MVCC,MVCC通过快照的方式实现,类似于PostgreSQL。
MyRocks目前只支持两种隔离级别,RC和RR。
MyRocks数据字典:
MariaDB [information_schema]> show tables like 'rocksdb%';
+-----------------------------------------+
| Tables_in_information_schema (rocksdb%) |
+-----------------------------------------+
| ROCKSDB_GLOBAL_INFO |
| ROCKSDB_CFSTATS |
| ROCKSDB_TRX |
| ROCKSDB_CF_OPTIONS |
| ROCKSDB_COMPACTION_STATS |
| ROCKSDB_DBSTATS |
| ROCKSDB_DEADLOCK |
| ROCKSDB_PERF_CONTEXT |
| ROCKSDB_INDEX_FILE_MAP |
| ROCKSDB_LOCKS |
| ROCKSDB_PERF_CONTEXT_GLOBAL |
| ROCKSDB_DDL |
+-----------------------------------------+
12 rows in set (0.001 sec)
MyRocks监控信息及状态查看:
SHOW ENGINE ROCKSDB STATUS\G
show engine rocksdb transaction status\G
以及上面的数据字典信息查看。
MyRocks复制:
MyRocks也是通过binlog方式复制,由于binlog与RocksDB之间没有xa,异常crash可能丢数据,所以,MyRocks主备环境建议开启semi-sync.
由于gap lock支持不健全(仅primary key上支持), 使用statement方式复制会导致不一致,故MyRocks建议使用行级复制(SBR)。
MyRocks备份恢复:
逻辑备份支持mysqldump;
物理备份使用MyRocks_hotbackup,但还不支持备份innodb; 也不支持增量备份。MyRocks_hotbackup支持流式备份。
其他优化:
1.bloom filter
2.data load
数据加载时可以忽略唯一性约束检查,分段自动提交,停写wal等,推荐下面的配置信息:
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}
3.Reverse column families
4.singleDelete
资料参考:
https://mariadb.com/kb/en/library/myrocks/
https://github.com/facebook/mysql-5.6/wiki/MyRocks-advantages-over-InnoDB
https://github.com/facebook/mysql-5.6/wiki/MyRocks-limitations
https://github.com/facebook/mysql-5.6/wiki