日本語記事初!?Dockerを活用したオーケストレーションツールNodeFabric

とうとう最終日まで来ました[TIS Engineer Advent Calendar](http://qiita.com/advent-calendar/2015/tis)！
あらためて見てみると、Excelの話から言語系の話、インフラ系の話、とてもバラエティに富んだ内容ではなかったでしょうか？

TISはいわゆるSIerで、様々な業種の顧客向けに多種多様なものを扱っています。
中にはとてもレガシーなシステムもあり、保守的なシーンもありますが、根底としてはやはり***よりよいものを提供したい***という思いがあるのが事実です。
そのために新しい技術に対しても非常にポジティブにとらえてチャレンジしています。初日の[こちらの記事](http://qiita.com/shiraco/items/3de1e1a05425e96ee90c)でも紹介されている[Tech-Circle](http://techcircle.connpass.com/)はまさにその姿を表した形となっています。
ということで、興味をもった方はぜひ私達と一緒に何かやりましょう！！

それでは今日の本題に入ります。
最終日も新しい技術との接触のお話。
***[NodeFabric](http://opennodecloud.com/products/nodefabric.html)***ってご存知ですか？

***

# NodeFabricって何？

## 概要

おそらく日本では知っている人が非常に少ないのではないでしょうか？
日本からは遠く離れた地**エストニア**のOpenNodeという会社で開発されているツールです。ラトビアで開催された[Zabbix Conference](http://www.zabbix.com/jp/conference2015.php)に参加した時に知り合った方がこのOpenNodeのFounderで、その方からご紹介いただいたことをきっかけに今回試してみました。

NodeFabricはDockerの技術を根底とし、高可用なDBシステムおよび分散ファイルストレージをソリューション提供する仕組みです。
複数サーバに跨った構成を作るのって結構大変だったりするので、そこをうまい具合にオーケストレーションして自動化してくれるようなツールです。

## メリット

具体的にはMariaDBの[Galera Cluster](https://mariadb.com/kb/en/mariadb/what-is-mariadb-galera-cluster/)を使った複数ノード間でのDBレプリケーション構成や、[Ceph](http://ceph.com/)を使った分散ファイルストレージをワンオペレーションで構築できます。

仕組みはこんな形になっていて、中では[HAProxy](http://www.haproxy.org/)や[Consul](https://www.consul.io/)を使って自動化を実現しています。

![NodeFabric-Cluster-Overview.png](https://qiita-image-store.s3.amazonaws.com/0/45851/598fb49a-9156-a22c-e759-c2d4969d56d5.png)
※引用: http://nodefabric.readthedocs.org/en/latest/guide/intro.html

HAProxyやConsul、GaleraCluster、CephそれらすべてのプロセスはDockerのコンテナとしてそれぞれ稼働し、最下層の環境がAWSやOpenStack、KVM、VMwareもしくは物理マシンなんでも関係なく適用可能な仕組みで提供されています。

動かしたいアプリケーションをDockerコンテナ上で稼働させるだけでDBとストレージは高可用な仕組みのものが簡単に利用可能になるというものです。

# 使い方

使い方は非常に簡単。Dockerがインストールされていて・全て設定済みのイメージが公開されているのでそれを使えばすぐに利用可能です。
今回は試しにAWS上に環境を作ってみました。
詳しくは[公式のドキュメント](http://nodefabric.readthedocs.org/)をご覧ください。
手順は以下。

## 1. HashicorpのATLASアカウント登録

まず[ATLAS](https://atlas.hashicorp.com/)でアカウント登録し、パーソナルページにてTokenを発行します。このTokenを使ってATLAS上にEnvironmentを自動作成してここで稼働状態を管理できるようにします。

![atlas_token.png](https://qiita-image-store.s3.amazonaws.com/0/45851/2895104b-8787-340f-690b-3ba7d69fc209.png)


こちらの[Environments](https://atlas.hashicorp.com/environments)のページにてGitHubのアカウントとリンク付けが必要なので事前に設定しておいてください。

## 2. AWS上でNodeFabricのAMIを使ってベースのインスタンス起動

AWS MarketplaceにNodeFabricのAMIが公開されています。

![aws_ami_nodefabric.png](https://qiita-image-store.s3.amazonaws.com/0/45851/744f3d9d-7ce6-7df3-a0e9-50b82114257d.png)

これを使ってインスタンスを作ります。

HA構成を組む想定なのでインスタンス数は最低でも3台必要です。

![aws_instance.png](https://qiita-image-store.s3.amazonaws.com/0/45851/f872a484-6c61-6b75-a87b-6a3c28c77f87.png)

台数指定しておけば勝手にネットワーク設定等は行ってくれます。

必要な設定としては、「高度な詳細」を開いてユーザデータを記入することだけです。
インスタンス起動時に最初に登録したATLASとの自動連携を実現するため、このユーザデータ欄に、ATLASのToken情報と、Environments指定を行います。
以下の図のように、ATLAS_TOKEN=にToken情報を、ATLAS_ENVNAME=にATLAS上で管理したいEnvironmentの名前を適当につけて設定します。

![userdata.png](https://qiita-image-store.s3.amazonaws.com/0/45851/8072d349-a6b0-3483-e332-4e7c38575849.png)

ストレージはCeph用に少し追加で設定しておきます。

![storage.png](https://qiita-image-store.s3.amazonaws.com/0/45851/5a63b7e7-61f5-0386-1c15-b8e8412b7772.png)

セキュリティグループは以下のデフォルト設定でOKです。
アプリケーションで何か必要なポートがある場合には追加で設定すればOK。

![security_group.png](https://qiita-image-store.s3.amazonaws.com/0/45851/55c4cb06-1541-6a3c-1321-dcf7bd4d6977.png)

これでインスタンス起動すると、3台のEC2インスタンスが稼働し、各インスタンス内でDockerやその上のコンテナ等すべて自動構築されます。
環境情報はATLASにも自動連携され、以下のように情報を見ることが可能です。

![atlas_environment.pnp.png](https://qiita-image-store.s3.amazonaws.com/0/45851/9ce3af64-2d87-1d4b-663b-45b42550435e.png)

# 3. サービスの有効化

インスタンスを起動しただけだと、NodeFabricのコアのサービスだけが稼働している状態なので、MariaDBのGalera ClusterやCephの分散ストレージのサービスが動いていません。
利用したいサービスを有効化して使える状態にする必要があります。

作成したインスタンスにログインしてnodefabric-statusというコマンドを打つとNodeFabricでの管理状況が見れます。

```shell-session
$ sudo nodefabric-status
```

![nodefabric_status_init.png](https://qiita-image-store.s3.amazonaws.com/0/45851/ef9d5246-aeed-0ecd-9d9d-54f140ff1fcc.png)

Galera Clusterを有効化してみます。

```shell-session
$ sudo nf-galera-ctl enable
```

![galera_enable.png](https://qiita-image-store.s3.amazonaws.com/0/45851/a3799a60-20c5-b089-b961-6ec5cbd7c0c2.png)


enable化すると、まずは使える準備ができます。使えるようにするにはこの状態に対してbootstrapコマンドを実行する必要があります。
実行後しばらくすると各インスタンス上のMariaDB Galera Cluster用のコンテナが起動し、クラスタ構成が完了します。

```shell-session
$ sudo nf-galera-ctl bootstrap
```
![galera_ok.png](https://qiita-image-store.s3.amazonaws.com/0/45851/145ab2c6-2521-eadd-a656-ff311f8aa0fd.png)

RUNNING状態になればOKです。

各インスタンスの中では以下のようにNodeFabricの機能のベースとなるコンテナと、今回有効にしたGalera Cluster用のコンテナの全4コンテナが稼働した状態となります。

```shell-session
# docker ps
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS               NAMES
d1777dc5ef8e        opennode/nf-consul        "/bin/start -server    About an hour ago   Up About an hour                        nf-consul
3cc3baa4c183        opennode/nf-galera        "/start.sh"            About an hour ago   Up About an hour                        nf-galera
532e850d9d62        opennode/nf-haproxy       "/startup.sh"          About an hour ago   Up About an hour                        nf-haproxy
2f05e9e79cdc        opennode/nf-registrator   "/bin/registrator co   About an hour ago   Up About an hour                        nf-registrator
```

# 4. サービスを使う

MariaDBのGaleraClusterが動いている状態なので、インスタンス内で以下のようにコマンドを実行してDBにアクセスし、試しにDBを作ってみます。

```shell-session
# mysql -uroot -hlocalhost
MariaDB [(none)]> create database sample;
Query OK, 1 row affected (0.00 sec)
```
もちろんレプリケーション構成になっているので別インスタンス内のDBコンテナのDBでも同じDBが作られているのがわかります。

```shell-session:別インスタンスでの確認例
# mysql -uroot -hlocalhost
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
+--------------------+
4 rows in set (0.00 sec)
```

非常に簡単にクラスタ構成のDB環境が手に入りました！！

# まとめ

今回、ほんのちょっと触った程度なので、まだまだこのツールのメリット感が体験できていないですが、Dockerの特性をうまく活用して高可用なデータベースやファイルストレージをソリューション型で展開するという面白いアプローチかと思います。
私達は、要件にマッチした環境をいかにコストをかけることなく、安心できるものを提供するのかを常に考えています。
最近の流れとしては***サービス化***というところが大きなところかと思いますが、すべてをパブリックなサービスでカバーできなくて、自前で提供するというシーンも少なからずあると思います。こういったシーンでNodeFabricのような、コンテナ技術をうまく活用したソリューション化というのが効果的かもしれませんね。

ちょっと長い記事になってしまいましたが、いかがでしたでしょうか？
TISはこんないろんなことやっている会社です。また来年もどうぞよろしくお願いします！
来年早い段階で[Tech-Circle](http://techcircle.connpass.com/)も開催します。
次はおそらく[Terraform](https://terraform.io/)をテーマにしたハンズオンになる予定です。

それでは皆さん、ハッピークリスマス！！
![christmaslogo_red.png](https://qiita-image-store.s3.amazonaws.com/0/45851/6b5869b5-dc3f-bf1d-7258-33b7cf5f5a29.png)