Facebookが公開した新しいMySQL用ストレージエンジン「MyRocks」を試してみる 〜インストール編〜

FacebookはMySQL用の新しいストレージエンジン「MyRocks」をオープンソースで公開しました。
http://www.publickey1.jp/blog/16/facebookmysqlmyrocks.html

MyRocksは、InnoDBがフラッシュストレージと組み合わせたときに書き込まれるデータ量の効率性を改善するためにFacebookが取り組んだストレージエンジンです。
2013年にキーバリューストアとして公開したRocksDBをMySQLに統合させたものを基盤としています。

ストレージ効率の面で非常に優れていて、圧縮機能を用いたInnoDBとの比較でもMyRocksは書き込まれるデータ量が圧倒的に小さいそうな。

うむ、気になる。てなわけで早速試してみましょう(☝ ՞ਊ ՞)☝

MyRocksを使用する方法はfacebookのgithubのwikiに記載してあります。
https://github.com/facebook/mysql-5.6/wiki/Getting-Started-with-MyRocks

MySQLをソースから落としてビルドする形ですね。

これに従ってやっても良いんですが、、
もうちょっとさくっと試したいな〜どっかにMyRocksのDockerイメージ転がってないかな〜 :kissing: 
と思ったらホントにありました :raised_hands: 
https://www.percona.com/blog/2016/09/06/myrocks-docker-images/

perconadbさんが作ってくれてましたね。感謝！

ではではDockerイメージを落として使ってみます。

既にDocker for Macを入れてある前提で
DockerレジストリからのDockerイメージのダウンロードをします。

```
docker pull perconalab/myrocks
```

完了したらイメージからコンテナを作成します。

```
docker run -d --name myr -P  perconalab/myrocks
```

そして手順通りMacからmysqlコマンドで接続

```
mysql -h127.0.0.1
RROR 1130 (HY000): Host 'gateway' is not allowed to connect to this MySQL server
```
・・んん？普通にエラった(*´д｀)　接続許可がされてないですね
仕方ないからコンテナに入って接続
(mysqlコマンドのパスが通ってなかったので後で通すことにします)

```
$ docker exec -it  myr bash
[root@84e0d99b1244 /]# /usr/local/mysql/bin/mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.27 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
接続したらMyRocksのストレージエンジンが存在するか確認しましょう。

```
mysql> show engines;
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ROCKSDB    | DEFAULT | RocksDB storage engine                                         | YES          | YES  | YES        |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MyISAM     | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE    | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| FEDERATED  | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| InnoDB     | NO      | Supports transactions, row-level locking, and foreign keys     | NULL         | NULL | NULL       |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
```


ROCKSDBがあったらOKです :+1: 

ここで再びgithubの[wiki](https://github.com/facebook/mysql-5.6/wiki/Getting-Started-with-MyRocks)に戻り、wikiに書いてある通りテーブルを作成してみます

```sql

CREATE TABLE `linktable` (
 `id1` bigint(20) unsigned NOT NULL DEFAULT '0',
 `id1_type` int(10) unsigned NOT NULL DEFAULT '0',
 `id2` bigint(20) unsigned NOT NULL DEFAULT '0',
 `id2_type` int(10) unsigned NOT NULL DEFAULT '0',
 `link_type` bigint(20) unsigned NOT NULL DEFAULT '0',
 `visibility` tinyint(3) NOT NULL DEFAULT '0',
 `data` varchar(255) NOT NULL DEFAULT '',
 `time` bigint(20) unsigned NOT NULL DEFAULT '0',
 `version` int(11) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (link_type, `id1`,`id2`) COMMENT 'cf_link_pk',
 KEY `id1_type` (`id1`,`link_type`,`visibility`,`time`,`version`,`data`) COMMENT 'rev:cf_link_id1_type'
) ENGINE=RocksDB DEFAULT COLLATE=latin1_bin; 
```

一応テーブル情報の確認。

```
mysql> show table status \G
*************************** 1. row ***************************
           Name: linktable
         Engine: ROCKSDB
```


インストール編なのでここまで！
ベンチマークを取ったりとかはまた後日ということで。