前言
RocksDB是facebook基于LevelDB实现的一款可嵌入式的持久化键值(Key-Value)存储数据库,目前为facebook内部大量业务提供服务。由于其有高性能和高适配性的特点,所以被大量的应用于对传统数据库引擎的高性能改造,例如商业数据库引擎 TerarkDB 分布式关系型数据库 TIDB 等都是应用了 ROCKSDB 来实现高性能的。
介绍
经过 Facebook 大量工作,将 RocksDB 作为 MySQL 的一个存储引擎移植到 MySQL,称之为 MyRocks。 经过多年的发展,MyRocks 已经比较成熟,已进入了facebook MySQL的主分支了。其他 MySQL 分支包括 Percona Server for MySQL 和 MariaDB Server 都集成了 MyRocks。
MyRockS 跑分:http://jetware.io/blog/redmine-performance-on-myrocks、https://www.percona.com/blog/2018/04/30/a-look-at-myrocks-performance/, 本来还想翻译翻译贴图出来的,没想到那么多图
简单放个 QPS 对比吧: MySQL 8.0 InnoDB VS MariaDB 10.3 MyRocks
RocksDB与innodb的比较
- innodb空间浪费, B tree分裂导致page内有较多空闲,page利用率不高。innodb现有的压缩效率也不高,压缩以block为单位,也会造成浪费。
- 写入放大:innodb 更新以页为单位,最坏的情况更新N行会更新N个页。RocksDB append only方式 另外,innodb开启double write也会增加写入。
- RocksDB对齐开销小:SST file (默认2MB)需要对齐,但远大于4k, RocksDB_block_size(默认4k) 不需要对齐,因此对齐浪费空间较少
- RocksDB索引前缀相同值压缩存储,节省空间
- RocksDB占总数据量90%的最底层数据,行内不需要存储系统列seqid (innodb聚簇索引列包含trxid,roll_ptr等信息)
Percona MyRocks
Percona MyRocks 是 MyRocks for Percona Server 的实现,安装了 Percona Server 的环境可以非常方便的集成 MyRocks 引擎,和 FaceBook 的 MyRocks 差异在于 事务隔离级别 的实现上。
安装
首先,我们需要安装有 Percona Server,安装教程:Percona Server 5.7 安装教程
安装 percona-server-rocksdb:
RHELCentOS:
yum install Percona-Server-rocksdb-57.x86_64
DeibanUbuntu:
apt-get install percona-server-rocksdb-5.7
安装好后我们回看到这句话:
* This release of Percona Server is distributed with RocksDB storage engine.
* Run the following script to enable the RocksDB storage engine in Percona Server:
ps-admin --enable-rocksdb -u <mysql_admin_user> -p[mysql_admin_pass] [-S <socket>] [-h <host> -P <port>]
也就是说我们需要运行相关语句:
运行:
ps-admin --enable-rocksdb -u root -p密码
然后就成功激活插件并关闭 Transparent huge pages 了
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| ROCKSDB | YES | RocksDB storage engine | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
10 rows in set (0.00 sec)
使用
具体如何使用 ROCKSDB 引擎呢?
我们在创建表和修改表的时候,加入 ENGINE=RocksDB
就可以使用了。
例如:
mysql> use mf8biz;
mysql> CREATE TABLE `juncedup_usermeta` (
`umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`meta_value` longtext COLLATE utf8mb4_unicode_520_ci,
PRIMARY KEY (`umeta_id`),
KEY `user_id` (`user_id`),
KEY `meta_key` (`meta_key`(191))
) ENGINE=RocksDB;
如果我们想激进一点可以把默认引擎设置为 ROCKSDB:
修改 /etc/my.cnf
文件,在 [mysqld]
下加入:
default-storage-engine=ROCKSDB
然后重启 MySQL 服务即可。