etcd を起動 (インストール) してみた

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は、分散 KVS である etcd について検証してみました。(※以下の内容は etcd 3.3.11/CentOS 7.6 にて検証しています。)

■はじめに

etcd は最近流行りの Kubernetes でも利用されている KVS であり、名前を聞いたことがある方も多いのではないでしょうか。

また、昨年の 12月に CNCF にプロジェクトが寄与されたことが記憶に新しい製品であると思います。

ということで、今回はその etcd を単体で動かしてみました。

■検証

それではさっそく検証してみます。

まずはインストールですが、etcd は Go 言語で書かれているので、基本的にはバイナリをダウンロードすればコンパイル等をしなくてもそのまま利用できます。

[root@etcd ~]# ETCD_VER=v3.3.11
[root@etcd ~]# 
[root@etcd ~]# DOWNLOAD_URL=https://storage.googleapis.com/etcd
[root@etcd ~]# 
[root@etcd ~]# curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10.8M  100 10.8M    0     0  2656k      0  0:00:04  0:00:04 --:--:-- 2656k
[root@etcd ~]# 
[root@etcd ~]# tar xzf /tmp/etcd-v3.3.11-linux-amd64.tar.gz -C /tmp/
[root@etcd ~]# 
[root@etcd ~]# ls -l /tmp/etcd-v3.3.11-linux-amd64/
total 34296
drwxr-xr-x 11 1000 1000     4096 Jan 11 20:33 Documentation
-rw-r--r--  1 1000 1000    38864 Jan 11 20:33 README-etcdctl.md
-rw-r--r--  1 1000 1000     7262 Jan 11 20:33 README.md
-rw-r--r--  1 1000 1000     7855 Jan 11 20:33 READMEv2-etcdctl.md
-rwxr-xr-x  1 1000 1000 19237536 Jan 11 20:33 etcd
-rwxr-xr-x  1 1000 1000 15817472 Jan 11 20:33 etcdctl
[root@etcd ~]# 
[root@etcd ~]# cp /tmp/etcd-v3.3.11-linux-amd64/etcd* /usr/local/bin/
[root@etcd ~]# 
[root@etcd ~]# ls -l /usr/local/bin/
total 34236
-rwxr-xr-x 1 root root 19237536 Feb  5 05:46 etcd
-rwxr-xr-x 1 root root 15817472 Feb  5 05:46 etcdctl
[root@etcd ~]# 
[root@etcd ~]# etcd --version
etcd Version: 3.3.11
Git SHA: 2cf9e51d2
Go Version: go1.10.7
Go OS/Arch: linux/amd64
[root@etcd ~]# 
[root@etcd ~]# etcdctl --version
etcdctl version: 3.3.11
API version: 2

では、ダウンロードしたバイナリを使って etcd を起動してみます。(バイナリを実行するとフォアグラウンドで動作するため、以降の作業は別ターミナルから行なっています。)

[root@etcd ~]# mkdir /tmp/etcd-data-dir
[root@etcd ~]# 
[root@etcd ~]# cd /tmp/etcd-data-dir/
[root@etcd etcd-data-dir]# 
[root@etcd etcd-data-dir]# etcd
2019-02-05 06:03:43.232802 I | etcdmain: etcd Version: 3.3.11
2019-02-05 06:03:43.232886 I | etcdmain: Git SHA: 2cf9e51d2
2019-02-05 06:03:43.232895 I | etcdmain: Go Version: go1.10.7
2019-02-05 06:03:43.232902 I | etcdmain: Go OS/Arch: linux/amd64
2019-02-05 06:03:43.232910 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2019-02-05 06:03:43.232936 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2019-02-05 06:03:43.233516 I | embed: listening for peers on https://localhost:2380
2019-02-05 06:03:43.233686 I | embed: listening for client requests on localhost:2379
2019-02-05 06:03:43.235272 I | etcdserver: name = default
2019-02-05 06:03:43.235293 I | etcdserver: data dir = default.etcd
2019-02-05 06:03:43.235303 I | etcdserver: member dir = default.etcd/member
2019-02-05 06:03:43.235310 I | etcdserver: heartbeat = 100ms
2019-02-05 06:03:43.235317 I | etcdserver: election = 1000ms
2019-02-05 06:03:43.235328 I | etcdserver: snapshot count = 100000
2019-02-05 06:03:43.235342 I | etcdserver: advertise client URLs = https://localhost:2379
2019-02-05 06:03:43.235351 I | etcdserver: initial advertise peer URLs = https://localhost:2380
2019-02-05 06:03:43.235363 I | etcdserver: initial cluster = default=https://localhost:2380
2019-02-05 06:03:43.248709 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32
2019-02-05 06:03:43.248757 I | raft: 8e9e05c52164694d became follower at term 0
2019-02-05 06:03:43.248802 I | raft: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2019-02-05 06:03:43.248815 I | raft: 8e9e05c52164694d became follower at term 1
2019-02-05 06:03:43.252739 W | auth: simple token is not cryptographically signed
2019-02-05 06:03:43.254072 I | etcdserver: starting server... [version: 3.3.11, cluster version: to_be_decided]
2019-02-05 06:03:43.254634 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10)
2019-02-05 06:03:43.255168 I | etcdserver/membership: added member 8e9e05c52164694d [https://localhost:2380] to cluster cdf818194e3a8c32
2019-02-05 06:03:43.349265 I | raft: 8e9e05c52164694d is starting a new election at term 1
2019-02-05 06:03:43.349317 I | raft: 8e9e05c52164694d became candidate at term 2
2019-02-05 06:03:43.349380 I | raft: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2
2019-02-05 06:03:43.349404 I | raft: 8e9e05c52164694d became leader at term 2
2019-02-05 06:03:43.349417 I | raft: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2
2019-02-05 06:03:43.349793 I | etcdserver: setting up the initial cluster version to 3.3
2019-02-05 06:03:43.350544 N | etcdserver/membership: set the initial cluster version to 3.3
2019-02-05 06:03:43.350606 I | etcdserver: published {Name:default ClientURLs:[https://localhost:2379]} to cluster cdf818194e3a8c32
2019-02-05 06:03:43.350653 I | etcdserver/api: enabled capabilities for version 3.3
2019-02-05 06:03:43.350742 I | embed: ready to serve client requests
2019-02-05 06:03:43.351541 N | embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!

特にオプション等を指定しない場合は、カレントディレクトリ配下に default.etcd というディレクトリが作成され、その配下に etcd のデータ (関連する各ファイル) が格納されるようです。

[root@etcd ~]# ls -lR /tmp/etcd-data-dir/default.etcd/
/tmp/etcd-data-dir/default.etcd/:
total 0
drwx------ 4 root root 29 Feb  5 06:03 member

/tmp/etcd-data-dir/default.etcd/member:
total 0
drwx------ 2 root root 16 Feb  5 06:03 snap
drwx------ 2 root root 64 Feb  5 06:03 wal

/tmp/etcd-data-dir/default.etcd/member/snap:
total 20
-rw------- 1 root root 20480 Feb  5 06:03 db

/tmp/etcd-data-dir/default.etcd/member/wal:
total 125000
-rw------- 1 root root 64000000 Feb  5 06:03 0.tmp
-rw------- 1 root root 64000000 Feb  5 06:45 0000000000000000-0000000000000000.wal
[root@etcd ~]# 

それでは、標準で提供されているクライアントツールである etcdctl コマンドを使い、起動した etcd に対してデータの作成/参照/更新/削除を実施してみます。

[root@etcd ~]# etcdctl mk test_key "test value"
test value
[root@etcd ~]# 
[root@etcd ~]# etcdctl ls
/test_key
[root@etcd ~]# 
[root@etcd ~]# etcdctl get test_key
test value
[root@etcd ~]# 
[root@etcd ~]# etcdctl set test_key "new value"
new value
[root@etcd ~]# 
[root@etcd ~]# etcdctl get test_key
new value
[root@etcd ~]# 
[root@etcd ~]# etcdctl rm test_key
PrevNode.Value: new value
[root@etcd ~]# 
[root@etcd ~]# etcdctl ls
[root@etcd ~]# 

各サブコマンドの詳細等は割愛しますが、etcdctl コマンドの利用方法につては etcdctl help コマンドで確認することができます。

[root@etcd /]# etcdctl help
NAME:
   etcdctl - A simple command line client for etcd.

WARNING:
   Environment variable ETCDCTL_API is not set; defaults to etcdctl v2.
   Set environment variable ETCDCTL_API=3 to use v3 API or ETCDCTL_API=2 to use v2 API.

USAGE:
   etcdctl [global options] command [command options] [arguments...]
   
VERSION:
   3.3.11
   
COMMANDS:
     backup          backup an etcd directory
     cluster-health  check the health of the etcd cluster
     mk              make a new key with a given value
     mkdir           make a new directory
     rm              remove a key or a directory
     rmdir           removes the key if it is an empty directory or a key-value pair
     get             retrieve the value of a key
     ls              retrieve a directory
     set             set the value of a key
     setdir          create a new directory or update an existing directory TTL
     update          update an existing key with a given value
     updatedir       update an existing directory
     watch           watch a key for changes
     exec-watch      watch a key for changes and exec an executable
     member          member add, remove and list subcommands
     user            user add, grant and revoke subcommands
     role            role add, grant and revoke subcommands
     auth            overall auth controls
     help, h         Shows a list of commands or help for one command

~(以下略)~

また、etcd ではディレクトリの作成及び、パス形式での key の指定が可能です。etcdctl ls –recursive コマンドで、再起的にディレクトリ及び key の一覧を確認することも可能です。

[root@etcd ~]# etcdctl mk key1 "test value1"
test value1
[root@etcd ~]# 
[root@etcd ~]# etcdctl get key1
test value1
[root@etcd ~]# 
[root@etcd ~]# etcdctl mkdir /hoge/fuga
[root@etcd ~]# 
[root@etcd ~]# etcdctl mk /hoge/key2 "test value2"
test value2
[root@etcd ~]# 
[root@etcd ~]# etcdctl mk /hoge/fuga/key3 "test value3"
test value3
[root@etcd ~]# 
[root@etcd ~]# etcdctl ls -p --recursive
/key1
/hoge/
/hoge/fuga/
/hoge/fuga/key3
/hoge/key2
[root@etcd ~]# 
[root@etcd ~]# etcdctl get /hoge/key2
test value2
[root@etcd ~]# 
[root@etcd ~]# etcdctl get /hoge/fuga/key3
test value3

ディレクトリを削除する場合は etcdctl rmdir を実行します。

[root@etcd ~]# etcdctl rm key1
PrevNode.Value: test value1
[root@etcd ~]# 
[root@etcd ~]# etcdctl ls -p --recursive
/hoge/
/hoge/fuga/
/hoge/fuga/key3
/hoge/key2
[root@etcd ~]# 
[root@etcd ~]# etcdctl rm /hoge/fuga/key3
PrevNode.Value: test value3
[root@etcd ~]# 
[root@etcd ~]# etcdctl ls -p --recursive
/hoge/
/hoge/fuga/
/hoge/key2
[root@etcd ~]# 
[root@etcd ~]# etcdctl rmdir /hoge/fuga
[root@etcd ~]# 
[root@etcd ~]# etcdctl ls -p --recursive
/hoge/
/hoge/key2
[root@etcd ~]# 

また、基本的に削除するディレクトリは空 (key がない) である必要があり、ディレクトリ内に key が残っていると以下の様なエラーになります。

[root@etcd ~]# etcdctl rmdir /hoge
Error:  108: Directory not empty (/hoge) [13]

etcdctl rm –recursive を利用すると再帰的かつディレクトリ内に含まれる key もまとめて削除することができます。(Linux でいうところの rm -rf コマンドの様な処理になるので、慎重に実行した方が良さそうです…)

[root@etcd ~]# etcdctl ls -p --recursive
/hoge/
/hoge/key2
[root@etcd ~]# 
[root@etcd ~]# etcdctl rm --recursive /hoge
[root@etcd ~]# 
[root@etcd ~]# etcdctl ls -p --recursive
[root@etcd ~]# 

■まとめ

今回は etcd を単体で起動し、基本的な DB 操作を実行してみました。

今回の様に単体で動作させることも可能ですが、最初に記載した通り etcd は “分散 KVS” であるため、etcd 自体にクラスタリングの機能が備わっています。

次回は etcd のクラスタリングの動作検証を実施してみようと思います。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です