はじめに
KVS(Key Value Store)として利用できるRedisとetcdのうち、どちらがより簡単に使い始められるか、シンプルな導入として適しているかを検証しました。
どちらもDockerコンテナの形式で起動し、Pythonからの操作と、GUIでの操作を試しています。
環境
- Ubuntu 16.04
- Docker version 18.06.0-ce
- docker-compose version 1.24.1
- etcd:3.4.3
- redis:5.0.7
etcd
まずはetcdです。
コンテナとして構築
下記のDockerHubにあるdocker-compose.ymlをダウンロードします。
https://hub.docker.com/r/bitnami/etcd/
$ curl -LO https://raw.githubusercontent.com/bitnami/bitnami-docker-etcd/master/docker-compose.yml
ダウンロードしてきたら、中身を以下のように書き換えます。
version: '3.5' services: etcd: image: bitnami/etcd:3.4.3 environment: - ALLOW_NONE_AUTHENTICATION=yes - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379 ports: - 2379:2379 - 2380:2380 networks: - etcdtest myapp: # etcd操作用のコンテナを追加 image: python:3.6 command: tail -f /dev/null networks: - etcdtest networks: # コンテナ同士を通信させるためにネットワークを追加 etcdtest: name: etcdtest driver: bridge
etcd
コンテナに加えてpythonからetcdを操作するためにmyapp
コンテナも起動する設定にしています。commandで/dev/nullをtail -f
させておき、コンテナが起動し続けられるようにしています。
また、内部ネットワークとしてetcdtest
を作成し、コンテナ同士が疎通できるようにしています。
では作成したdocker-compose.ymlをもとにコンテナを起動させます。
$ sudo docker-compose up -d Creating network "etcdtest" with driver "bridge" Creating etcdtest_etcd_1 ... done Creating etcdtest_myapp_1 ... done
コンテナが二つ立ち上がればOKです。
pythonからetcdを操作
コンテナが二つ立ち上がったので、実際にPythonでetcdを操作してみます。
まずはmyapp
コンテナにログインしてetcdのpython sdkとなるetcd3
をインストールします。
$ sudo docker exec -ti etcdtest_myapp_1 bash root@83cbcbc628f8:/# pip install etcd3
続いて、そのままコンテナにログインした状態でpythonのインタプリタを起動し、etcd3をimportします。
root@83cbcbc628f8:/# python Python 3.6.9 (default, Oct 17 2019, 06:34:57) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import etcd3 >>>
実際にetcdに接続し、データの書き込みと読み込みをしてみます。
>>> client = etcd3.client(host='etcd' port=2379) >>> client.put('lang', 'python') header { cluster_id: 14841639068965178418 member_id: 10276657743932975437 revision: 4 raft_term: 2 } >>> client.get('lang') (b'python', <etcd3.client.KVMetadata object at 0x7f1fc95afa90>) >>> for i in client.get_all(): ... print(i) ... (b'python', <etcd3.client.KVMetadata object at 0x7f1fcb3ba668>)
接続の方法はシンプルにhostとportを指定するだけでできました。また、keyとvalueの設定や取り出しもput
やget
で簡単にできました。
ただ、keyとvalueの一覧はget_all()
を使ってイテレータを取得する形になるため、表示させるにはfor文とprintを使う必要があります。
GUIからの操作
続いてGUIでの操作を試すために、ETCD Managerというツールを使ってみます。(これしか見つからなかった)
GitHub - icellmobilsoft/etcdmanager: A cross-platform GUI for ETCD
アクセス元のクライアントにインストールして使うタイプのツールのため、今回はMac OS用のインストールファイルをダウンロードします。
githubのreadme.mdにインストールファイルのリンクがあります。
ダウンロードしてきたら、ダブルクリックして開きます。
よくあるインストールページとして下記の画面が開きますので、etcd-managerのアイコンをApplicationsにドラック&ドロップしてください。
ぱっと見、反応がないですが、Applicationsにちゃんと追加されていました。クリックして起動します。
初回起動時はMacのデフォルトの動作としてセキュリティに引っかかって起動させてくれません。「システム環境設定 > セキュリティとプライバシー」の画面を開いて、下記のように”このまま開く”をクリックします。
これでETCD Managerが起動するはずです。
起動したら、Settings > ETCD を押します。下記のように接続先を入力する画面になりますので、etcdコンテナが起動しているホストのIPアドレスとポート番号2379
を入力し、SAVEしてください。
右上に緑のダイアログが表示されればOKです。
この状態で左のメニューから「Manage keys」に移動すると、先ほど入力したkeyとvalueが表示されるのが分かります。
GUIのツールインストールと操作は非常に簡単にできることがわかりました。見た目も分かりやすいし、サクサク動きます。
ただ、クライアント側にインストールするタイプのツールであるため、開発者ごとにインストールしないといけない点がイマイチです。
Redis
続いてredisを構築して操作してみます。
コンテナとして構築
まずはdocker-compose.ymlファイルを作成します。
version: '3.5' services: redis: image: redis:5.0.7 ports: - 6379:6379 volumes: - ./data/reis:/data - ./redis.conf:/etc/redis/redis.conf command: redis-server /etc/redis/redis.conf networks: - redistest myapp: image: python:3.6 command: tail -f /dev/null networks: - redistest networks: redistest: name: redistest driver: bridge
etcdの時と同様、my app
コンテナを用意しています。一つ異なる点は、Redisの設定ファイルである redis.conf
をボリュームマウント形式でコンテナに渡している部分です。
そのため、redis.confを下記のように作成しておく必要があります。
port 6379 bind 0.0.0.0
Redisコンテナにアクセスするためのホストとポートの設定をしているだけです。
では作成したdocker-compose.ymlをもとにコンテナを起動させます。
$ sudo docker-compose up -d Creating network "redistest" with driver "bridge" Creating redistest_redis_1 ... done Creating redistest_myapp_1 ... done
コンテナが二つ立ち上がればOKです。
pythonからredisを操作
コンテナが二つ立ち上がったので、実際にPythonで操作してみます。
まずはmyapp
コンテナにログインしてredisのpython sdkとなるredis
をインストールします。
$ sudo docker exec -ti redistest_myapp_1 bash root@fe8d915cd26b:/# pip install redis
続いて、そのままコンテナにログインした状態でpythonのインタプリタを起動し、接続、書き込み、読み込みなどの操作をしてみます。
>>> import redis >>> r = redis.Redis(host='redis', port=6379, db=0) >>> r.set('hoge',123) True >>> r.get('hoge') b'123' >>> r.keys() [b'hoge']
接続やkey/valueの取り出しはetcdと同じく非常にシンプルにできました。また、etcdとは異なり、r.keys()
の一文でvalueを取ってこれました。
GUIからの操作
続いてGUI操作のためのツールを使ってみます。
こちらはコンテナとしてサーバを起動してブラウザからアクセスできるタイプです。そのため、Macなどのローカル環境にインストールする必要はありません。
Installing RedisInsight on Docker | Redis Labs Documentation Center
シンプルにコマンドでコンテナを起動させます。
docker run -d -v redisinsight:/db -p 8001:8001 --name redisinsight redislabs/redisinsight
問題なく起動したら、ブラウザから <ホストのIPアドレス>:8001
にアクセスしてみます。
最初は下記のようなシンプルな画面が表示されます。
「ADD REDIS DATABASE > ADD DATABASE」を選択して、redisコンテナに接続します。
Nameは何でもOKです。HostはホストのIPアドレスを入力し、Portには6379
を入力します。
接続に成功したら、Redisコンテナにアクセスできるようになります。
実際に左のメニューにある「Browser」を確認すると、python sdkで追加したkeyとvalueを確認できます。
etcdと同じくGUIのツールインストールと操作は非常に簡単にできました。
おわりに
etcdはKubernetesで利用されているため、KVSとしてだけでも使っておいたら理解が深まり、一石二鳥かと思いましたが、Redisの方が使いやすく感じました。ただ、それぞれ得意な場面があり、用途に応じて使い分けられるのがベストだと思います。
今回の目的である、どちらがより簡単に使い始められるか、シンプルな導入として適しているか、という意味ではRedisが適している!と言えそうです。