はじめに
最近、Redis互換で25倍高速とする「Dragonfly」が登場。2022年の最新技術でインメモリデータストアを実装がPublickeyに掲載されていて、Dragonfly がかなり気になったので、サクっとインストールして使ってみました。備忘録として残します。
Dragonfly の概要
Dragonfly は、Linux上で動作するフリーのインメモリデータストアです。スレッドパーコア・アーキテクチャを採用し、低レイテンシーを実現しています。Dragonfly は Redis や Memcached と互換性があります。KeyDBの代替品として適しています。 また、Dragonflyは垂直方向に拡張でき、1つのインスタンスで数百万QPS(queries per second)と数百GBのメモリを処理できます。この Dragonfly は、2022年の最新技術を用いて設計、実装することで、Redis/memcached互換を実現しつつRedisの25倍高速を達成した。と Dragonfly の webサイト、GitHub リポジトリの README.md で語っています。
以下のグラフは、開発コミュニティで公開しているベンチマークの結果です。
Dragonfly の特徴
Dragonfly は、次のような特徴があります。
- Build with C++
- Redis API と互換
- マルチスレッドアーキテクチャ
- 非同期 I/O を使用
- いくつかのクライアントライブラリをサポート
- HTTPプロトコルとRedisプロトコルで Dragonfly と接続可能
- シンプルでメモリ効率の良いキャッシング・アーキテクチャ
- Linux kernel 5.10 以上の Linux OS で動作
- BSLライセンス
Dragonfly をソースコードからビルドして実行
Linux kernel 5.10 以上が Dragonflyの動作条件になっているので、kernelのバージョンが 5.10 以上であることを確認します。
$ uname -r
5.15.0-41-generic
Dragonfly GitHub リポジトリをローカルのディレクトリにクローンします。
$ git clone --recursive https://github.com/dragonflydb/dragonfly
ビルドに必要なパッケージをインストールします。Dragonfly は ninja というビルドシステムを使用しています。
$ sudo apt install ninja-build libunwind-dev libboost-fiber-dev libssl-dev autoconf-archive libtool cmake g++
以下のコマンドで Dragonfly をビルドします。
$ cd dragonfly
./helio/blaze.sh -release
$ cd build-opt
$ ninja dragonfly
それでは Dragonfly を実行しましょう。
alsologtostderrオプションは、ログメッセージはログファイルに加え、標準エラーにも出力されます。
$ ./dragonfly --alsologtostderr
I20220718 19:51:55.958289 14139 init.cc:56] ./dragonfly running in opt mode.
I20220718 19:51:55.958747 14139 dfly_main.cc:169] Starting dragonfly df-dev
........
I20220718 19:51:55.960114 14140 listener_interface.cc:79] sock[9] AcceptServer - listening on port 6379
ソースコードからビルドする方法以外に、Dockerを使用する方法、Docker Compose を利用する方法があります。2つの方法は、公式ドキュメントの以下のページを参照して下さい。
Dragonfly を使ってみる
Redisクライアントの redis-cli を起動して、Dragonflyに接続します。事前に【入門】Redisを参考に Redis がインストールしておきます。
$ redis-cli
127.0.0.1:6379> info
# Server
redis_version:df-dev
redis_mode:standalone
arch_bits:64
.....
INFO コマンドでサーバー状況を確認すると、redis_version が df-dev と表示され、Dragonfly に接続していることが確認できます。
次にいくつか Redisのコマンドを実行します。問題なく実行されることが確認できます。
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set test "HELLo, World!!"
OK
127.0.0.1:6379> keys *
1) "test"
127.0.0.1:6379> get test
"HELLo, World!!"
127.0.0.1:6379> exit
次に memcached と同じように telnet で接続できるか確認します。
$ $ telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get test
$14
HELLo, World!!
set test1 "Dragonfly"
+OK
get test1
$11
"Dragonfly"
quit
+OK
Connection closed by foreign host.
$
Dragonfly をシャットダウン
Redis と同様に redis-cli で shutdown コマンドを実行して、Dragonefly をシャットダウンします。
$ redis-cli
127.0.0.1:6379> shutdown
OK
127.0.0.1:6379> exit
$
以下のようなログが出力され問題なく Dragonfly がシャットダウンされました。
I20220718 21:57:13.075809 14752 listener_interface.cc:146] Listener stopped for port 6379
$
Dragonfly をベンチマーク!?
「Redis/memcached互換を実現しつつRedisの25倍高速を達成」と言っているので、ベンチマークを実施してみました。Redis をビルドすると作成される redis-benchmark というツールでベンチマークができます。実際に実行すると、ZPOPINコマンドでエラーとなります。Dragonfly の webサイト で、ZPOPINコマンドは Unsupported になることは納得なのですが、Redisの25倍のスループットDragonflyを試してみるの投稿では、redis-benchmark が実行できているので、バージョンの違いなのか・・・。
$ redis-benchmark -q
PING_INLINE: 45850.53 requests per second, p50=0.551 msec
PING_MBULK: 39936.10 requests per second, p50=0.663 msec
SET: 47169.81 requests per second, p50=0.599 msec
GET: 49726.51 requests per second, p50=0.567 msec
.........
Error from server: ERR unknown command `ZPOPMIN`
$
次に memtier_benchmark という ReidsLabs が開発するRedisベンチマークツールで、Redis と Dragonfly をそれぞれ測定しました。詳細は省略しますが、レイテンシ、スループットもほぼ同じような測定結果となりました。仮想マシンを使っているので環境問題なのか、設定問題なのか・・・。次回までにもう少し深堀してみます。
まとめ
話題のデータストア Dragonfly をサクっと使ってみました。redis-cli から Dragonfly に接続して、Redisコマンドが実行できることを確認しました。
ただ、Redisの25倍のスループットについては、残念ながら確認できませんでした。たぶん、環境に問題があると思います。こちらは後日、別途、調査して報告したいと思います。
もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。
参照
以下の情報を参考にさせて頂きました。