Blog
Go言語実装 オープンソース 分散ストレージ・システム Torus その実力とは Part 1
アドテク本部の成尾です。
Torus について検証をしているので、数回に分けてご紹介していきたいと思います。
今回は、構築と実際にI/Oがどうなのかベンチ結果までをご紹介していきます。
まず、 Torus は Go言語で実装された etcd という KVS 上で動作する分散ストレージ・システムです。
個人的に特徴をあげるとしたら、ネットワークブロックデバイス(ブロックデバイスをネットワーク経由でマウント可能)が利用できる事です。
Torus のリポジトリを見ると Initial public release が 2016/06/02 となっているので
オープンソースとして公開されてからまだ間もないので、日本語の情報は少ないようですが
バックエンドとして使われている etcd 自体は kubernetes でも使われていたりするためいくつか記事が見つかります。
検証環境
弊社プライベートクラウド上で以下インスタンスを作成し行っています。
CPU: 4 Core
Memory: 14 GB
SSD: 128 GB
OS: Ubuntu 16.04.1 LTS
今回は 3台 用意しました。
nario-torus-test01 (10.4.1.114)
nario-torus-test02 (10.4.1.115)
nario-torus-test03 (10.4.1.117)
当初 CentOS 6.8 にて検証を行っていたのですが、ネットワークブロックデバイスをマウントするために nbd というモジュールが必要となり
CentOS 6.8 では kernel のソースからコンパイルできるのですが
バージョンが古く正常にマウントできなかったため Ubuntu を最終的に利用しています。
etcd
Version 3 以降が必要だったので etcd-v3.0.7-linux-amd64.tar.gz を利用しました。
今回は検証目的だったので簡易的にシンボリックリンクで設定しています。
1 2 3 4 5 6 |
cd /usr/local/src wget https://github.com/coreos/etcd/releases/download/v3.0.7/etcd-v3.0.7-linux-amd64.tar.gz tar zxvf etcd-v3.0.7-linux-amd64.tar.gz mv etcd-v3.0.7-linux-amd64 /usr/local/share/ ln -s /usr/local/share/etcd-v3.0.7-linux-amd64/etcd /usr/bin/ ln -s /usr/local/share/etcd-v3.0.7-linux-amd64/etcdctl /usr/bin/ |
etcd 設定
各サーバーで以下コマンドにて起動しています
※このまま実行するとフォアグラウンドで動作します。
nario-torus-test01
1 2 3 4 5 6 7 8 9 10 |
etcd \ --name "nario-torus-test01" \ --data-dir "/data/nario-torus-test01.etcd" \ --advertise-client-urls "http://10.4.1.114:2379" \ --listen-client-urls "http://0.0.0.0:2379" \ --listen-peer-urls "http://0.0.0.0:2380" \ --initial-advertise-peer-urls "http://10.4.1.114:2380" \ --initial-cluster-token "test-cluster001" \ --initial-cluster "nario-torus-test01=http://10.4.1.114:2380,nario-torus-test02=http://10.4.1.115:2380,nario-torus-test03=http://10.4.1.117:2380" \ --initial-cluster-state "new" |
nario-torus-test02
1 2 3 4 5 6 7 8 9 10 |
etcd \ --name "nario-torus-test02" \ --data-dir "/data/nario-torus-test02.etcd" \ --advertise-client-urls "http://10.4.1.115:2379" \ --listen-client-urls "http://0.0.0.0:2379" \ --listen-peer-urls "http://0.0.0.0:2380" \ --initial-advertise-peer-urls "http://10.4.1.115:2380" \ --initial-cluster-token "test-cluster001" \ --initial-cluster "nario-torus-test01=http://10.4.1.114:2380,nario-torus-test02=http://10.4.1.115:2380,nario-torus-test03=http://10.4.1.117:2380" \ --initial-cluster-state "new" |
nario-torus-test03
1 2 3 4 5 6 7 8 9 10 |
etcd \ --name "nario-torus-test03" \ --data-dir "/data/nario-torus-test03.etcd" \ --advertise-client-urls "http://10.4.1.117:2379" \ --listen-client-urls "http://0.0.0.0:2379" \ --listen-peer-urls "http://0.0.0.0:2380" \ --initial-advertise-peer-urls "http://10.4.1.117:2380" \ --initial-cluster-token "test-cluster001" \ --initial-cluster "nario-torus-test01=http://10.4.1.114:2380,nario-torus-test02=http://10.4.1.115:2380,nario-torus-test03=http://10.4.1.117:2380" \ --initial-cluster-state "new" |
etcd 確認
Cluster 状態の確認
1 2 3 4 5 6 |
etcdctl cluster-health member 240c91bb48a71dc3 is healthy: got healthy result from http://10.4.1.117:2379 member 3ced201644c21ebe is healthy: got healthy result from http://10.4.1.114:2379 member 93915bb50e5f87a8 is healthy: got healthy result from http://10.4.1.115:2379 cluster is healthy |
Leader の確認
1 2 3 |
curl http://localhost:2379/v2/stats/leader {"leader":"93915bb50e5f87a8","followers":{"240c91bb48a71dc3":{"latency":{"current":0.000803,"average":0.0022567304471951,"standardDeviation":0.0034661721065505505,"minimum":0.000542,"maximum":1.125438},"counts":{"fail":1833,"success":281622}},"3ced201644c21ebe":{"latency":{"current":0.001243,"average":0.002268842426667608,"standardDeviation":0.002620384416407292,"minimum":0.000532,"maximum":0.837591},"counts":{"fail":0,"success":297379}}}} |
Member の確認
1 2 3 4 5 |
etcdctl member list 240c91bb48a71dc3: name=nario-torus-test03 peerURLs=http://10.4.1.117:2380 clientURLs=http://10.4.1.117:2379 isLeader=false 3ced201644c21ebe: name=nario-torus-test01 peerURLs=http://10.4.1.114:2380 clientURLs=http://10.4.1.114:2379 isLeader=false 93915bb50e5f87a8: name=nario-torus-test02 peerURLs=http://10.4.1.115:2380 clientURLs=http://10.4.1.115:2379 isLeader=true |
Torus
検証時点最新の torus_v0.1.1_linux_amd64.tar.gz を利用しています。
今回は検証目的だったので簡易的にシンボリックリンクで設定しています。
1 2 3 4 5 6 7 |
cd /usr/local/src wget https://github.com/coreos/torus/releases/download/v0.1.1/torus_v0.1.1_linux_amd64.tar.gz tar zxvf torus_v0.1.1_linux_amd64.tar.gz mv torus_v0.1.1_linux_amd64 /usr/local/share/ ln -s /usr/local/share/torus_v0.1.1_linux_amd64/torusd /usr/bin/ ln -s /usr/local/share/torus_v0.1.1_linux_amd64/torusblk /usr/bin/ ln -s /usr/local/share/torus_v0.1.1_linux_amd64/torusctl /usr/bin/ |
Torus 設定
各サーバーで以下コマンドにて起動しています。
※test01 サーバーのみ初期化コマンドを実行しています。
※このまま実行するとフォアグラウンドで動作します。
nario-torus-test01
1 2 |
torusctl init torusd --etcd 127.0.0.1:2379 --peer-address http://10.4.1.114:40000 --data-dir /mnt/torus1 --size 20GiB --auto-join |
nario-torus-test02
1 |
torusd --etcd 127.0.0.1:2379 --peer-address http://10.4.1.115:40000 --data-dir /mnt/torus1 --size 20GiB --auto-join |
nario-torus-test03
1 |
torusd --etcd 127.0.0.1:2379 --peer-address http://10.4.1.117:40000 --data-dir /mnt/torus1 --size 20GiB --auto-join |
Torus ボリューム作成
1 |
torusctl volume create-block myVolume 5GiB |
ボリュームのマウント
1 2 3 4 5 |
modprobe nbd torusblk --etcd 127.0.0.1:2379 nbd myVolume /dev/nbd0 mkfs.ext4 /dev/nbd0 mkdir -p /mnt/torus mount /dev/nbd0 -o discard,noatime /mnt/torus |
Torus 確認
Volumeの確認
1 2 3 4 5 6 7 |
torusctl volume list +-------------+---------+-------+ | VOLUME NAME | SIZE | TYPE | +-------------+---------+-------+ | myVolume | 5.0 GiB | block | +-------------+---------+-------+ |
Clusterの状態確認
1 2 3 4 5 6 7 8 9 10 |
torusctl list-peers +-------------------------+--------------------------------------+--------+---------+--------+---------------+--------------+ | ADDRESS | UUID | SIZE | USED | MEMBER | UPDATED | REB/REP DATA | +-------------------------+--------------------------------------+--------+---------+--------+---------------+--------------+ | http://10.4.1.114:40000 | 80517c00-7581-11e6-ae4e-fa163ea8de2e | 20 GiB | 3.0 GiB | OK | 2 seconds ago | 0 B/sec | | http://10.4.1.115:40000 | 88a94cf8-7581-11e6-9d8a-fa163e0ce822 | 20 GiB | 2.9 GiB | OK | 2 seconds ago | 0 B/sec | | http://10.4.1.117:40000 | 8b618e73-7581-11e6-95bd-fa163e894134 | 20 GiB | 2.7 GiB | OK | 2 seconds ago | 0 B/sec | +-------------------------+--------------------------------------+--------+---------+--------+---------------+--------------+ Balanced: true Usage: 14.20% |
Ringの状態
1 2 3 4 5 6 7 8 9 10 |
torusctl ring get Ring torusctl ring get Ring: Ketama Replication:2 Peers: uuid:"80517c00-7581-11e6-ae4e-fa163ea8de2e" total_blocks:40960 uuid:"88a94cf8-7581-11e6-9d8a-fa163e0ce822" total_blocks:40960 uuid:"8b618e73-7581-11e6-95bd-fa163e894134" total_blocks:40960 |
ベンチマーク
Torus 公式には fio での ベンチマーク結果 が掲載されています。
今回は Oracle ORION を利用し
Read 100% Write 0% から Read 20% Write 80% までをローカルディスクとマウントした領域とで比較してみました。
Torus | Maximum Large MBPS 最大データ転送帯域(MB/sec) |
Maximum Small IOPS 最大IO回数(IOPS) |
Minimum Small Latency 最小応答遅延時間(msec) |
read 100% | 5889.88 | 318501 | 0 |
read 80% write 20% | 437.21 | 61998 | 0.02 |
read 60% write 40% | 131.61 | 25534 | 0.04 |
read 40% write 60% | 94.8 | 2548 | 0.39 |
read 20% write 80% | 74.85 | 1215 | 1.63 |
Local Disk | Maximum Large MBPS 最大データ転送帯域(MB/sec) |
Maximum Small IOPS 最大IO回数(IOPS) |
Minimum Small Latency 最小応答遅延時間(msec) |
read 100% | 5167.45 | 318264 | 0.01 |
read 80% write 20% | 2481.2 | 44152 | 0.02 |
read 60% write 40% | 1305.58 | 22271 | 0.05 |
read 40% write 60% | 887.68 | 14995 | 0.07 |
read 20% write 80% | 665.55 | 11315 | 0.09 |
上記は、複数回実施の中で一番良い結果だけを列挙したものですが
Read 60% Write 40% までであれば Localと変わらないか、ケースによっては良い数値が出ているように見えますね
しかし細かく複数回のデータを見ていくと、Local Disk では安定していますが
Torus 側だと write の割合が増えるにつれて安定しなくなっているのがわかるかと思います。
Torus | 1 回目 | 2 回目 | 3 回目 |
read 100% | 268727 | 293435 | 307266 |
read 80% write 20% | 61718 | 61998 | 58960 |
read 60% write 40% | 25534 | 1813 | 885 |
read 40% write 60% | 2548 | 1894 | 995 |
read 20% write 80% | 441 | 1215 | 884 |
Local Disk | 1 回目 | 2 回目 | 3 回目 |
read 100% | 313507 | 316071 | 318264 |
read 80% write 20% | 42281 | 44100 | 44152 |
read 60% write 40% | 22271 | 21784 | 21997 |
read 40% write 60% | 14850 | 14916 | 14995 |
read 20% write 80% | 11239 | 11059 | 10869 |
今後は条件を変えて更にベンチマークを取ると共に
チューニング、障害試験等々、実用に耐えうるかを深く検証していく予定です。
Author