世界最速のデータベース、memsqlを試してみる
昔、試してみようと思っていて忘れていたインメモリデータベース、memsqlについて話を触れてみたいと思います。このDBMS半年前くらいからあったのですが、「MySQLのメモリエンジンと何が違うの?」と思いつつ結局、後手後手に回り、ついでに存在自体忘れてしまったデータベースなんですけど。Slashdotにて、話題が挙がってきたので、「とりあえず試してみような?」と思ったのが今回のきっかけです。このmemsql、元FACEBOOKの社員が作ったものらしくMySQLより、30倍高速とのことです。社員も募集中みたいので我こそはと思うかたは、ぜひチャレンジしてみてはいががでしょうか?
http://memsql.com/about/careers/
slashdotの内容を抜粋しますと MemSQL は MySQL 互換でありながら、データの読み書きを「信じられないスピード」で実行できるという。MemSQL を紹介するビデオでは、MySQL と MemSQL で同様のクエリを実行してその速度の違いを見せているが、たとえば MySQL で毎秒 3,500 回実行できるクエリを MemSQL で実行すると、毎秒 80,000 回も実行できるという。 ・・とのことです。。でも、これだけだと、MySQLの何のエンジンと比較して?・・というところが謎すぎて、真偽のほどが定かではな感じなのですが試してみる価値はありそうなので、インストールと起動だけはしてみようかと。
memsqlは商用版と、開発版があり、開発版のDeveloper Editionは無償で使えるけど、10GBの制限があるようです。でもインメモリなんて、10GBもあれば充分じゃない?ってことで、Developer Editionで試してみることにしました。
▼環境(これは失敗) CENTOS5系では動かなかった・・よく読んでなかったです。 ・チェック 環境をチェックしてくれて、以下のコマンドでCENTOS5.8で動くかどうか確認してくれます・・あらららら、CENTOS6.0じゃないとダメだよって怒られております。ついでに、GLIBC_2.11が無いって言ってますね。どうしたもんか。 [shell] [root@sqdbm03 memsqlbin]# ./check_system Warning: The version of CentOS that you're using (5.8) is too low. MemSQL supports versions 6.0 and up. /usr/local/memsqlbin/objdir/usr/local/bin/memsql-g++: /lib64/libc.so.6: version `GLIBC_2.11' not found (required by /usr/local/memsqlbin/objdir/usr/local/bin/memsql-g++) [/shell]
・再度チェック もう根本から手順が変わってしまったのですが、CENTOS6.2で再度チェックを行います。あと、よくよく見たら要求する最低限のシステムが以下のURLに記載されていました。凹む。 http://developers.memsql.com/docs/1b/requirements.html
というわけで、CENTOS 6.2に変更して再度インストールを試してみます
▼環境 CENTOS6.2 mem: 2.0GB
▼ダウンロード ダウンロードは以下のサイトから行えます。お名前とメールアドレスを入れてください。
上記にて「DOWNLOAD」をクリックすると、ファイルがダウンロードされる・・・ではなく、ライセンスキーを取得できます。このライセンスキーをメモ帳か何か保存しておきます。
▼環境 こちらの環境は、CENTOS5.8のメモリ1GBという相変わらずのロースペックサーバなのですが、これで試してみます。 [shell] [root@sqdbm03 ~]# free -m total used free shared buffers cached Mem: 1024 260 763 0 7 128 -/+ buffers/cache: 124 899 Swap: 1055 0 1055 [root@sqdbm03 ~]# cat /etc/redhat-release CentOS release 5.8 (Final) [root@sqdbm03 ~]# uname -a Linux sqdbm03.squad.local 2.6.18-308.1.1.el5xen #1 SMP Wed Mar 7 04:57:35 EST 2012 x86_64 x86_64 x86_64 GNU/Linux [/shell]
▼インストール それではさっそくインストールの手順を説明します。
・ファイルのダウンロード ダウンロード先は、 http://download.memsql.com/+[レジストキー]+memsqlbin_amd64.tar.gzになります。レジストキーにつきましては先ほど説明したとおり、「DOWNLOAD」ボタンをクリックした後の画面で確認できます。または、登録時のメールに送られているので確認してみてください。 [shell] [root@sqdbm03 ~]# cd /usr/local/ [root@sqdbm03 local]# wget http://download.memsql.com/a6c8ae32e81c47bb8cfeb8dd54b0e316/memsqlbin_amd64.tar.gz [/shell]
・ファイルの解凍 ダウンロードファイルのバイナリファイルなので、そのまま特にインストールする作業なくそのまま利用できます。 [shell] [root@sqdbm03 local]# tar -xzf memsqlbin_amd64.tar.gz [root@sqdbm03 local]# cd memsqlbin [root@sqdbm03 memsqlbin]# pwd /usr/local/memsqlbin [/shell]
・起動チェック 正常に起動できるか確認します [shell] [root@sqdbm03 memsqlbin]# ./check_system /usr/bin/ld: cannot find -lrt collect2: ld returned 1 exit status This environment is missing the tools necessary for code generation. You can install the necessary tools by running the following command: $ sudo yum install gcc-c++ Would you like to run the command now [Y/n]? y [/shell]
・最後にこんなメッセージがでました。(最低でも8GB以上のメモリが必要だよ)って感じですかね?これはこれでしょうがないのであきらめます。 [shell] Complete! Warning: The recommended configuration for MemSQL is at least 8 GB of RAM [/shell]
▼いよいよ起動・・とその前に mysqlにmy.cnfがあるように、memSQLには、memsql.cnf というものがあります。 特筆するものはとくには、ないのですが、その中でもmemsql固有の情報について触れてみたいと思います。 デフォルトですと以下のような、設定ファイルになっているはずです。 [shell] [root@sqdbm03 memsqlbin]# cat memsql.cnf [server]
; ----------------------------- ; MemSQL configuration options: ; -----------------------------
; Possible values: on, off ; If durability if off, no data is saved to disk, but database ; and table definitions are persisted. durability = on
; The transaction buffer is a per-database, in-memory buffer of the ; transaction log. By default, it is asynchronously flushed to disk. ; You can set it to 0 for synchronous durability (transactions are ; flushed on commit). A positive value sets the size of the buffer. transaction-buffer = 128m
; snapshot-trigger-size indicates the size of the transaction ; log at which MemSQL starts a snapshot and truncates the log snapshot-trigger-size = 2g ; --------------------------------- ; MySQL-style configuration options ; ---------------------------------
basedir = . tmpdir = /tmp lc-messages-dir = ./share socket = /tmp/memsql.sock port = 3307 lock_wait_timeout = 60 bind-address = 0.0.0.0 [/shell]
[shell]
root@sqdbm03 memsqlbin]# ./memsqld -u root --port 3307 264449 2012-07-02 13:43:12 WARNING: SSE4.2 is not supported. Resorting to software CRC32C. Warning: The recommended configuration for MemSQL is at least 8 GB of RAM 611544 2012-07-02 13:43:12 INFO: Log level changed to 0 120702 13:43:13 [Note] ./memsqld: ready for connections. Version: '1b' socket: '/tmp/memsql.sock' port: 3307 [/shell]
・durability OFFの場合、メモリに蓄えられたデータは、完全に消滅します。しかし、データベース情報と、テーブル情報は保存されます。 ONは、まあ、その逆です。
・transaction-buffer 指定した容量以上のトランザクションはディスクに(非同期で)フラッシュします。
・snapshot-trigger-size memsqlが開始されてから取得されるスナップショットのサイズです。指定した容量を超えると、ログはトランケートされます
▼じゃあ今度こそ起動
それでは早速起動してみます。相変わらずメモリ足りないよって出てますが、きにしないきにしない。
[shell]
[root@sqdbm03 memsqlbin]# ./memsqld -u root --port 3307
263087 2012-07-02 14:49:41 WARNING: SSE4.2 is not supported. Resorting to software CRC32C.
Warning: The recommended configuration for MemSQL is at least 8 GB of RAM
603357 2012-07-02 14:49:42 INFO: Log level changed to 0
607918 2012-07-02 14:49:42 INFO: Started recovery of database memsql
683204 2012-07-02 14:49:42 INFO: /usr/local/memsqlbin/data/memsql_snapshot_a is valid: version 10 (expected 10), header CRC OK, file id 0, opened 2012-07-02 13:43:12, closed 2012-07-02 13:43:12.
683282 2012-07-02 14:49:42 WARNING: Snapshot /usr/local/memsqlbin/data/memsql_snapshot_b
of database memsql
is missing.
683681 2012-07-02 14:49:42 INFO: Replaying snapshot '/usr/local/memsqlbin/data/memsql_snapshot_a' of database memsql
.
683986 2012-07-02 14:49:42 INFO: Replaying log '/usr/local/memsqlbin/data/memsql_log_a' of database memsql
.
685408 2012-07-02 14:49:42 INFO: Successfully recovered database memsql
.
120702 14:49:42 [Note] ./memsqld: ready for connections.
Version: '1b' socket: '/tmp/memsql.sock' port: 3307
[/shell]
▼他クライアントから接続できるか確認する。 上記で起動したはずなので、他のホストから接続できるか検証してみます。尚、接続クライアントは、MySQLを利用します。 あと、mysqlとmemsqlの区別がつかなくなってしまうので、プロンプトを、memsql > といったか形に変更しております。
[shell] $ mysql -h 192.168.0.43 -u root --password='' -P 3307 --prompt="memsql> " Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 253 Server version: 5.5.8 MemSQL source distribution
Copyright (c) 2000, 2011, 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. [/shell]
・データベース一覧 [shell] memsql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | memsql | +--------------------+ 2 rows in set (0.01 sec) [/shell] ・memsqlにどんなテーブルが入っているか見たかったけど、なんも入っておりませんでした。
・memSQL環境変数 特筆すべきものは特にないのですが、こんな感じになっております。 [shell] memsql> show global variables; +--------------------------+---------------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------------+ | autocommit | ON | | basedir | . | | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/memsqlbin/share/charsets/ | | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | | compile_only | OFF | | connect_timeout | 10 | | core-file | OFF | | critical_diagnostics | ON | | date_format | %Y-%m-%d | | datetime_format | %Y-%m-%d %H:%i:%s | | general_log | OFF | | hostname | sqdbm03.squad.local | | interactive_timeout | 28800 | | lc_messages | en_US | | lc_messages_dir | /usr/local/memsqlbin/share/ | | lc_time_names | en_US | | lock_wait_timeout | 60 | | locked_in_memory | OFF | | max_allowed_packet | 1048576 | | max_connections | 151 | | max_user_connections | 0 | | maximum_memory | 992 | | maximum_table_memory | 992 | | net_buffer_length | 16384 | | net_read_timeout | 30 | | net_retry_count | 10 | | net_write_timeout | 60 | | pid_file | /usr/local/memsqlbin/data/sqdbm03.pid | | port | 3307 | | protocol_version | 10 | | secure_file_priv | | | socket | /tmp/memsql.sock | | sql_quote_show_create | ON | | system_time_zone | JST | | thread_cache_size | 0 | | thread_handling | one-thread-per-connection | | thread_stack | 1048576 | | time_format | %H:%i:%s | | time_zone | SYSTEM | | tmpdir | /tmp | | tx_isolation | READ-COMMITTED | | version | 5.5.8 | | version_comment | MemSQL source distribution | | version_compile_machine | x86_64 | | version_compile_os | Linux | | wait_timeout | 28800 | | warn_level | WARNINGS | +--------------------------+---------------------------------------+ 55 rows in set (0.00 sec) [/shell]
インストールから起動、接続までを説明しました。結果からいうと、やっぱメモリが乗っかってないと、まともにうごかんわね(汗)って感じです。最低条件として、8GB以上のRAMって言っているので、そのあたりでないと効果は発揮できないかもしれません。ちなみに、1GBのRAMで、wordpressを移行してみたけど、とんでもない遅さでした。何か設定があるのかもしれません。