DRBD9のdocker連携機能の紹介

DRBD9のDocker Volumeプラグイン

 

docker docsを見ると確認できるのですが、DRBD9はdockerのボリュームプラグインを提供しています。

Dockerはソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアです。(docker自体の詳細な説明は割愛いたします)

dockerはストレージ利用については課題がありました。コンテナを停止すると、基本的にはデータがすべて消えてしまう点です。
一応dockerではホスト上のディレクトリをコンテナのストレージに使用することで永続的なストレージとする事が可能です。しかしこれではコンテナをこのホストとは別のホストで起動する際にはデータにアクセスができないなどデータ共有においては問題となります。また実運用するのであれば可用性を上げるためデータ冗長化もしておきたいでしょう。

そこで、Doker1.8以降ではVolumeプラグイン機能が提供されています。このVolumeプラグインとしてDRBDをご利用いただけます。本記事ではこのDRBD Dockerプラグインについてご紹介いたします。

本プラグインを使うことで、DockerコマンドでDRBDのボリュームを自動的に作成することが可能になります。

※DRBD8は未対応で、DRBD9からの対応となります。

利用イメージは以下のようになります。

DRBD9 Docker Volumeプラグイン 手動操作イメージ

  1. DockerホストにDRBD9とDRBD Manageのインストールを行い初期設定します。
  2. doker volume createコマンドにボリュームプラグインのオプションを付けてDocker volumeを作成します。すると2ホスト間で冗長化されたDockerデータボリュームが作成されます。
    例:

    # docker volume create -d drbdmanage --name=dmvol --opt fs=xfs --opt size=200

  3. docker runコマンドで先ほど作成したデータボリュームを指定してコンテナを起動します(同時にDocker VolumeがDRBDとしてプライマリになります)。何かの作業をしてデータが書き込まれます。
    例:

    # docker run -ti --name=cont -v dmvol:/data --volume-driver=drbdmanage busybox sh

  4. 用が済んだらCtrl+Cなどで抜けてコンテナは消します。(同時にDocker VolumeがDRBDとしてセカンダリになります)
  5. 次に別のホストでコンテナを起動します(同時にDocker VolumeがDRBDとしてはプライマリになります)。同じ環境で先ほど行った作業の結果を保っていることが確認できます。
    例:

    # docker run -ti --name=cont -v dmvol:/data --volume-driver=drbdmanage busybox sh

また、Docker Composeを使って複数コンテナを一緒に動かす方法について以下のLINBITのブログで紹介しています。ご興味のある方はこちらもご覧ください。

Persistent and Replicated Docker Volumes with DRBD9 and DRBD Manage

 

PacemakerでDcokerリソースエージェントとDocker Volumeプラグインを使う

上記の例では手動操作を行っていますが、Pacemakerで自動化できます。

PacemakerはDockerリソースエージェントをサポートしているため、コンテナを自動フェイルオーバーさせるHAクラスタが構築できます。

しかも、ここでDRBD9のDocker Volume Pluginを使う場合、設定がとても簡単です。

もともとDRBDを使ったHA構成では、1台のディスクを複数のサーバで共有する共有ディスク方式と比較して、同時アクセスによってファイルシステムを破壊することを防止するためのフェンシング(STOHITHなど)の仕組みが必須ではないという特徴がありました。

この点に加えて、DRBD9 Docker Volumeプラグインを使用した場合には、dockerリソースのオプションで操作が行えるため
・DRBDリソース
・DRBDデバイスをマウントするためのファイルシステムリソース
の設定をする必要がありません。

PacemakerとCorosyncの設定をしたうえで、上述の手動操作手順の1.のDockerボリュームの作成を行った後、Pacemakerを起動して以下の設定内容を投入すれば、もうDockerクラスタの完成です。

# crm configure
# crm configurecrm(live)configure# property no-quorum-policy=ignore
crm(live)configure# property stonith-enabled=false
crm(live)configure# primitive docker-container docker \
   > params image="docker.io/busybox" \
   > run_opts="-ti -v dmvol:/data --volume-driver=drbdmanage" \
   > reuse=false \
   > op start interval=0s timeout=60s on-fail=restart \
   > op monitor interval=30s timeout=60s on-fail=restart \
   > op stop interval=0s timeout=60s
crm(live)configure# commit

内容を補足すると・・・
    > crm(live)configure# primitive docker-container docker
プリミティブリソースとしてのdockerリソース
    > params image=”docker.io/busybox”
dockerイメージにdocker.io/busyboxを使用
    > run_opts=”-ti -v dmvol:/data –volume-driver=drbdmanage”
run_optでオプションを指定。コンテナの/dataにDocker Volumeのdmvolを、drbdmanageドライバを使ってマウント。
    > reuse=false
コンテナ終了時にコンテナを完全に削除する。

コンテナのオーケストレータとしてのPacemaker

dockerコンテナのオーケストレータとしてはDocker SwarmやKubernetesが代表的で、コンテナ管理でPacemakerを使うというのは少数派であるとは思います。それでも、スケールアウト予定がない比較的小規模な構成で、ステートフルなコンテナの可用性を重視する場合にはコンテナ管理にPacemakerを利用することにメリットがあります。

ぜひPacemakerを使った構成もご一考ください。

参考資料:PacemakerでDockerコンテナをクラスタリング(Linux-HA Japan)

 

 

Apache MesosでDRBDボリュームを使う

Apache Mesosを使った構成でDockerコンテナを使用する際に、DRBD Dcoker Volumeプラグインをボリュームの永続化・冗長化・ノード間データ共有に利用できます。

DockerプラグインはDRBDクライアントにも対応しているため、ノードにローカルディスクがなくてもデータにアクセスできる特徴があります。

Apache Mesosでのストレージ利用においてはDRBDプラグインを通じたDRBDの利用をぜひご検討ください。

 

Kubernetesで使用するボリュームにDRBDを使う

Kubernetesに対しては、DRBDは別途Flex Volumeプラグインを用意しています。DRBDのKubernetes Flex Volumeプラグインについては、また後日ご紹介いたします!

 

まとめ

Dockerコンテナの利用において、DRBD Docker Volumeプラグインを使うメリットには以下の点が挙げられます。

  • 共有ディスクと違って単一障害点にならず、安価なサーバでシステムを構築できる
  • Pacemakerでdockerコンテナを利用する時に設定が簡単
  • Dockerコマンドから操作できるためDocker composeやApache Mesosなどと組み合わせた運用が行える
  • DRBDクライアントを使用することでディスクのないノードでもDRBDデバイスにアクセスできる。
  • 低いオーバーヘッドと高速なアクセス
  • NFSやiSCSIを使った構成よりも容易な設定,構成とスケーラビリティ

Dockerをご利用の際にはDRBD9もご一緒にいかがでしょうか!?