スマートスタイル TECH BLOG

ベンチマーク MySQL Memcachedプラグイン vs Memcached vs Redis

MySQL では 「InnoDB Memcached」プラグインを使うことで、Memcached プロトコルを使ってテーブルデータに直接アクセスすることができるようになります。

参考:MySQL :: MySQL 5.7 Reference Manual :: 14.20 InnoDB memcached Plugin

今回はキャッシュストアとしてよく使われる Redis と Memcached 、そしてMySQLの InnoDB Memcached プラグインのベンチマークをとって比較してみたいと思います。

このシリーズの他の記事はこちら

  • MySQLでMemcachedプロトコルを使う
  • ベンチマーク MySQL Memcachedプラグイン vs Memcached vs Redis
  • PHP+MySQLでMemcachedプラグインを使うと高速化するか調べてみた
  • ベンチマーク環境

    AWS の m4.2xlarge インスタンスを使用しました。

    スペック

    項目
    vCPU 8 core
    MEM 32GB
    DISK 16GB

    バージョン

    項目 バージョン
    MySQL 5.7.20
    Redis 4.0.2
    Memcached 1.5.3

    ベンチマークツールは Redis と Memcached プロトコルが使える memtier-benchmark を使用しました。
    公式サイト : https://github.com/RedisLabs/memtier_benchmark

    AWSなのでネットワークのスループットは十分に出ると思いますが、KVSでは比較的ネットワークがボトルネックになることが多いため、今回はベンチマークツールも同一マシン上で動かすことにしました。

    Memcached

    Memcached はメモリ上にしかデータを持たないため、ディスクへのアクセスがほとんどありません。そのため、高速ではあるものの、データが永続化されないため、インスタンスが停止するとデータが消えてしまいます。

    -t はスレッド数です。今回のCPUのコア数に合わせて 8 とします。

    Redis

    Redis は2つの方法でデータをディスクに保存して永続化します。

    • 指定したタイミングでデータのスナップショットをディスクに保存 (RDB)
    • 更新記録をディスクに追記して保存(AOF)

    RDBはMySQLのバックアップファイルのようなイメージで、取得したタイミングのデータが記録されます。
    AOFはMySQLのバイナリログのようなイメージで、更新処理の記録が追記されているため、Point-in-time recovery も可能です。

    RDB、AOF共にディスクに書き出すタイミングを指定できますが、RDBはデフォルトのまま、AOFは更新を常に同期させる(appendfsync always)の2つのパターンでベンチマークを計測しました。

    MySQLの InnoDB Memcached プラグイン

    データはInnoDBのテーブルに格納されるため、データの永続化は基本的にはMySQLの設定に準拠します。
    (例えば、innodb_flush_log_at_trx_commit はデフォルト 1 なのでコミットのたびにディスクにフラッシュされ、クラッシュしてもコミット済みのデータが消失することはありません)

    今回のベンチマークでは、以下の2通りの設定で行いました。

    データの安全性重視

    速度重視

    Memcached プラグインの設定でも高速化することは可能ですが、弊社の検証環境ではこれらの設定を変更すると安定性が極端に低くなったため、デフォルトのままにしています。

    参考

    ベンチマーク方法

    memtier-benchmark をインストールして以下の設定でベンチマークを行いました。

    項目
    スレッド数 8
    クライアント数 15 (スレッド単位なので合計120)
    テスト時間 30秒

    Redisの場合

    Memcached と MySQLのMemcachedプラグインの場合

    テスト結果

    Memcached

    Redis (RDB設定)

    Redis (AOF設定)

    MySQL (データ安全設定)

    MySQL (速度重視設定)

    項目 Sets Gets
    Memcached 28099.01 280969.68
    Redis (RDB) 11805.49 118032.86
    Redis (AOF) 5418.64 54165.53
    MySQL (安全) 1687.43 16853.49
    MySQL (速度) 18994.62 189927.61

    まとめ

    やはりディスクアクセスが無い分、Memcached が最も高速でした。
    MySQL も速度重視の設定にすればそれなりのパフォーマンスを発揮しましたが、innodb_* の設定はインスタンス全体で共通のため、通常のMySQLとしての使い方とMemcachedプラグインを併用する場合は注意が必要になります。

    次回はPHPを使ったSQLとMemcachedプロトコルのベンチマーク比較です。

    このシリーズの他の記事はこちら

  • MySQLでMemcachedプロトコルを使う
  • ベンチマーク MySQL Memcachedプラグイン vs Memcached vs Redis
  • PHP+MySQLでMemcachedプラグインを使うと高速化するか調べてみた

  • MySQL

     

    Return Top