話題のデータストア!? Dragonfly をサクっと使ってみた

# はじめに
最近、[Redis互換で25倍高速とする「Dragonfly」が登場。2022年の最新技術でインメモリデータストアを実装](https://www.publickey1.jp/blog/22/redis25dragonfly2022.html)が[Publickey](https://www.publickey1.jp/)に掲載されていて、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公表のベンチマーク](https://camo.githubusercontent.com/5b61f6e95e72c834b09386cd163d88eafb27d3c2a001f9901e05313f1dfc6527/687474703a2f2f6173736574732e647261676f6e666c7964622e696f2f7265706f2d6173736574732f6177732d7468726f7567687075742e737667)


# Dragonfly の特徴
Dragonfly は、次のような特徴があります。

* Build with C++
* Redis API と互換
* マルチスレッドアーキテクチャ
* 非同期 I/O を使用
* いくつかのクライアントライブラリをサポート
* HTTPプロトコルとRedisプロトコルで Dragonfly と接続可能
* シンプルでメモリ効率の良いキャッシング・アーキテクチャ
* Linux kernel 5.10 以上の Linux OS で動作
* [BSL](https://dragonflydb.io/license/)ライセンス


# Dragonfly をソースコードからビルドして実行
Linux kernel 5.10 以上が Dragonflyの動作条件になっているので、kernelのバージョンが 5.10 以上であることを確認します。

```bash
$ uname -r
5.15.0-41-generic
```

Dragonfly GitHub リポジトリをローカルのディレクトリにクローンします。

```bash
$ git clone --recursive https://github.com/dragonflydb/dragonfly
```

ビルドに必要なパッケージをインストールします。Dragonfly は ninja というビルドシステムを使用しています。

```bash
$ sudo apt install ninja-build libunwind-dev libboost-fiber-dev libssl-dev autoconf-archive libtool cmake g++
```

以下のコマンドで Dragonfly をビルドします。

```bash
$ cd dragonfly
./helio/blaze.sh -release
$ cd build-opt
$ ninja dragonfly
```

それでは Dragonfly を実行しましょう。  
alsologtostderrオプションは、ログメッセージはログファイルに加え、標準エラーにも出力されます。

```bash
$ ./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つの方法は、公式ドキュメントの以下のページを参照して下さい。 
* [Quick Start](https://github.com/dragonflydb/dragonfly/tree/main/docs/quick-start)
* [Dragonfly DB with Docker Compose](https://github.com/dragonflydb/dragonfly/tree/main/contrib/docker)

# Dragonfly を使ってみる
Redisクライアントの redis-cli を起動して、Dragonflyに接続します。事前に[【入門】Redis](https://qiita.com/wind-up-bird/items/f2d41d08e86789322c71)を参考に Redis がインストールしておきます。

```bash
$ 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のコマンドを実行します。問題なく実行されることが確認できます。

```bash
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 で接続できるか確認します。

```bash
$ $ 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 をシャットダウンします。

```bash
$ redis-cli
127.0.0.1:6379> shutdown
OK
127.0.0.1:6379> exit
$
```

以下のようなログが出力され問題なく Dragonfly がシャットダウンされました。
```bash
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を試してみる](https://zenn.dev/quiver/articles/0fdc22e9076551)の投稿では、redis-benchmark が実行できているので、バージョンの違いなのか・・・。

```bash
$ 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倍のスループットについては、残念ながら確認できませんでした。たぶん、環境に問題があると思います。こちらは後日、別途、調査して報告したいと思います。

もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。

# 参照

以下の情報を参考にさせて頂きました。

- [dragonfly](https://github.com/dragonflydb/dragonfly)
- [Redisの25倍のスループットDragonflyを試してみる](https://zenn.dev/quiver/articles/0fdc22e9076551)
- [【入門】Redis](https://qiita.com/wind-up-bird/items/f2d41d08e86789322c71)
- [memcachedコマンド操作](https://qiita.com/TatsuNet/items/5c89a2dbce57be28aef7)