osdn - 増税に立ち向かえ、俺が”コンテナ” を”pacemaker”と...
TRANSCRIPT
増税に立ち向かえ、俺が”コンテナ”を”Pacemaker”と”DRBD”を使って
無償で冗長化してやる
2019/11/24 OSC Tokyo/Fall
Linux-HA Japan プロジェクト
三浦 貴紀
1
三浦 貴紀(みうら たかのり)
強気なタイトルですが、強気なタイプではありません。
普段はNTT OSSセンタという所で高信頼技術をやってます。
自己紹介
2
Pacemakerとは?
PacemakerはオープンソースのHAクラスタソフトウェア
High Availability →高可用性
3
Pacemakerの概要(1/2)
サーバ#1 サーバ#2
サーバ・アプリの故障監視
サービスの起動・監視
サーバ間の監視・制御
4
Pacemakerの概要(2/2)
サーバ#1 サーバ#2
サーバ間の監視・制御
故障検知時に自動的にフェイルオーバ
ダウンタイムの最小化
STONITHによるデータの安全性確保
サービスの起動・監視
サーバ間の監視・制御
5
コンテナ
サーバ
Pacemakerの適用領域
物理 仮想 クラウド
Docker
+
物理
今回はコンテナの話をします
6
PacemakerでのコンテナHA
Pacemakerのbundle機能を用いてコンテナHAの実現が可能
bundleとは
• コンテナ管理に必要な機能をまとめたPacemakerのリソース• コンテナとコンテナ内のアプリの起動・終了・監視が可能• STONITH機能や既存のリソースエージェントと併せて利用可能• Pacemaker-1.1.17以降で利用可能
7
bundleのアーキテクチャ
bundle
Apache RA
Pacemaker-remote
仮想IP
bundle
Apache RA
Pacemaker-remote
仮想IP
サーバ#1 サーバ#2
PostgreSQL RA
Pacemaker-remote
仮想IP
レプリカ数の制御
コンテナの起動・制御
サービスの起動・監視
8
bundle設定例
<bundle id="httpd-bundle">
<docker image="pcmktest:http" replicas=“2" replicas-per-host= “2" options="--log-driver=journald"/>
<network ip-range-start="192.168.33.200" host-interface="eth1" host-netmask="24">
<port-mapping id="httpd-port" port="80"/>
</network>
<storage>
<storage-mapping id="httpd-root"
source-dir-root="/var/local/containers"
target-dir="/var/www/html"
options="rw"/>
<storage-mapping id="httpd-logs"
source-dir-root="/var/log/pacemaker/bundles"
target-dir="/etc/httpd/logs"
options="rw"/>
</storage>
<primitive class="ocf" id="httpd" provider="heartbeat" type="apache">
<operations>
<op name="start" interval="0s" timeout="60s" on-fail="restart" id="httpd-start-0s"/>
<op name="monitor" interval="10s" timeout="60s" on-fail="restart" id="httpd-monitor-10s"/>
<op name="stop" interval="0s" timeout="60s" on-fail="block" id="httpd-stop-0s"/>
</operations></primitive>
</bundle>
コンテナ
ネットワーク
ストレージ
コンテナ内アプリ
9
コンテナの種類
ステートレスコンテナ
• データを保存する必要が無いコンテナ• Webサーバ、APサーバ等が対象
ステートフルコンテナ
• データを保存する必要が有るコンテナ フェイルオーバ時にはSby側へのデータ引継ぎが必要
• データベースサーバ、ファイルサーバ等が対象
今回はステートフルコンテナに着目します。
10
通常のステートフルコンテナのHA構成
コンテナのデータを共有ストレージに保存しSby側へのデータの引継ぎを行う
サーバ#1 サーバ#2
ステートフルコンテナとしてPostgreSQLを例にしています。
11
ここから本編今回のモチベーション
共有ストレージの調達にはお金がかかる
基本100万円以上します。
「・・・・」
だから共有ストレージを使わずにステートフルコンテナHAを実現したい
プライベートでは無理ですね。 12
ここでDRBD
DRBDを用いることで共有ストレージを使わずにSby側へのデータ引継が可能
DRBDとは
• ネットワーク越しにレプリケーションを行うOSS• ブロックデバイス単位でレプリケーションを行うためデー
タの形式に依存しない
13
加えてLINSTOR
LINSTORを用いることでコンテナへのDRBD領域のマッピングが簡単に実施可能
LINSTORとは
• DRBD9の管理ツール• DRBD領域の追加や変更等がコマンドラインで実施可能• DRBD9に利用可能
linstor-docker-volumeというプラグインを入れることでDRBD領域のdockerへのマッピングが簡単にできるようです。
LINSTORを使うので今回使用するDRBDのバージョンは”9”となります。
LINSTORを入れると動的にDRBD領域が追加できます。
14
今回のステートフルコンテナHA構成(共有ストレージ無にて)
サーバ#1 サーバ#2
DRBDでAct側からSby側へのデータを引継ぎ
LINSTORでDRBD領域をコンテナにマッピング
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
Master Slave
この構成を目指します!!
15
ここからは以下の流れで構築した流れを紹介します。
LINSTORでDRBD領域をコンテナにマッピング
1. linstor-docker-volumeによるコンテナへのDRBDマッピング2. bundleへのlinstor-docker-volumeの応用
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
1. DRBD9の冗長化2. LINSTORの冗長化3. PostgreSQLコンテナの冗長化
前のスライドにあった「DRBDでAct側からSby側へのデータを引継ぎ」はDRBDを起動することで実現できるため割愛します。
16
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
DRBD9の冗長化
Master Slave
Master Slave
OS
mount昇格
Act側がMasterに昇格するようにPacemaker(DRBD RA)側で制御
mountされる側がMasterに昇格するようにDRBD9側で制御
DRBD9の冗長化は2パターンの方式が可能
①DRBD RA方式 ②自動プロモーション方式
机上検討ではどちらでも良さそうでした
が、今回は慣れているDRBD RA方式で実現します。
自動プロモーション機能はDRBD9から搭載された機能です。
17
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
LINSTORの冗長化(1/4)
1. linstor-controllerデーモンの冗長化2. LINSTORの管理コマンド(linstor-client)の発行先を常にlinstor-
controllerデーモンが動いているノードに向ける3. linstor DBデータの冗長化
linstor-controller
linstor-satellite
linstor-client
linstor-satellite
linstor-client
linstor DBにはDRBD9の管理情報が格納されています。
1ノードでのみ動作するlinstor-controllerとlinstor DBを冗長化する必要があります。
LINSTORの冗長化のポイントは3つ
一口にlinstorといっても色々な要素が絡んでいます。
LINSTOR-DB
18
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
LINSTORの冗長化(2/4)
1. linstor-controllerデーモンの冗長化2. LINSTORの管理コマンド(linstor-client)の発行先を常にlinstor-
controllerデーモンが動いているノードに向ける3. linstor DBの冗長化
linstor-controllerの起動・監視・停止を制御するRAを作成
linstor-controllerはsystemd経由で制御できるのでそこを上手く使ってRAを作ります
19
systemdで起動済となってもlinstor-controllerがサービスを提供できるようになるには10秒程度時間を要するため、そこを上手く制御できるようにします
systemd経由の起動
プロセス存在確認
DRBD領域監視確認(linstor resource list)
OK
今回作ったRAの起動フロー
サービス開始待ちを考慮
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
LINSTORの冗長化(3/4)1. linstor-controllerデーモンの冗長化2. LINSTORの管理コマンド(linstor-client)の発行先を常にlinstor-
controllerデーモンが動いているノードに向ける3. linstor DBの冗長化
linstor-controller
linstor-satellite linstor-satellite
VIP
# cat /etc/linstor/linstor-client.conf[global]controllers=<VIP>
① linstor-controller用VIPを追加し、Pacemakerで制御する
② linstorコマンド(linstor-client)の発行先を①のVIPに指定する
フェイルオーバする際にはlinstor-controllerとVIPは一緒に移動します
クライアントは常にVIPに繋げることになるため、linstor-controllerがどこで動いているが意識する必要がありません 20
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
LINSTORの冗長化(4/4)1. linstor-controllerデーモンの冗長化2. LINSTORの管理コマンド(linstor-client)の発行先を常にlinstor-
controllerデーモンが動いているノードに向ける3. linstor DBの冗長化
①DRBDレプリケーション方式 ②PostgreSQLレプリケーション方式(PG-REX)
linstor-controller
LINSTOR-DB
linstor-controller
LINSTOR-DB
DRBD上に配置し、DRBDのレプリケーションで冗長化する方式
PostgreSQL上に配置しPostgreSQLのレプリケーション機能で冗長化する方式
DRBDレプリケーション方式ではLINSTORを構築する前にDRBD領域が利用できるよう、LINSTOR管理外のDRBD設定が必要となります。
PostgreSQLレプリケーション方式では全てのDRBD領域がLINSTOR管理となりますが、LINSTOR管理のためにPostgreSQLを両系に構築する必要があります。今回はDRBDレプリケーション方式に
します。 21
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
PostgreSQLコンテナの冗長化
<bundle id="postgres-bundle"><docker image="container-ha:postgresql12" replicas="1" replicas-per-host="1" options="-v data:/dbfp/pgdata -v wal:/dbfp/pgwal
-v arc:/dbfp/pgarch --volume-driver=linstor --log-driver=journald -e PCMK_logfacility=local1"/>
<storage><storage-mapping id="postgresql-log" source-dir="/var/log/pg_log" target-dir="/var/log/pg_log" options="rw"/><storage-mapping id="postgresql-locale" source-dir="/usr/share/zoneinfo/Asia/Tokyo" target-dir="/etc/localtime" options="ro"/><storage-mapping id="postgres-ra-log" source-dir="/dev/log" target-dir="/dev/log" options="rw"/>
</storage>
<primitive class="ocf" id="postgres" provider="heartbeat" type="pgsql"><meta_attributes id="postgres-meta_attributes">
<nvpair name="migration-threshold" value="INFINITY" id="postgres-meta_attributes-migration-threshold"/></meta_attributes><instance_attributes id="postgres-attrs">
<nvpair id="pgctl-attrs" name="pgctl" value="/usr/pgsql-12/bin/pg_ctl"/><nvpair id="psql-attrs" name="psql" value="/usr/pgsql-12/bin/psql"/><nvpair id="pgdata-attrs" name="pgdata" value="/dbfp/pgdata/data"/><nvpair id="pgdba-attrs" name="pgdba" value="postgres"/><nvpair id="pgport-attrs" name="pgport" value="5432"/><nvpair id="pgdb-attrs" name="pgdb" value="template1"/>
</instance_attributes><operations>
<op id="postgres-start" name="start" interval="0s" timeout="300s" on-fail="fence"/><op id="postgres-monitor" name="monitor" interval="10s" timeout="60s" on-fail="fence"/><op id="postgres-stop" name="stop" interval="0s" timeout="300s" on-fail="fence"/>
</operations></primitive>
</bundle>
<network ip-range-start="192.168.1.103" host-interface="ens4" host-netmask="24"><port-mapping id="postgres-port" port="5432"/>
</network>
PostgreSQLコンテナのbundle設定
コンテナ
ネットワーク
ストレージ
PostgreSQL
22
LINSTORでDRBD領域をコンテナにマッピング
linstor-docker-volumeによるコンテナへのDRBDマッピング
「linstor-docker-volume」プラグインにより、コンテナからLINSTORを通じてDRBD領域のマッピングが可能
【使い方の例】# docker run -ti --rm --name=postgres -v data:/dbfp/pgdata -v wal:/dbfp/pgwal -v arc:/dbfp/pgarch --volume-driver=linstor container-ha:postgresql12 /bin/bash
青:コンテナ内のパス緑:DRBD領域(DRBDリソース)
--volume-driverにlinstorを指定できるようになり、DRBD領域をコンテナにマッピングできるようになります
linstor-docker-volumeが無い場合には、必要なDRBD領域をAct側にマウントしてからコンテナにマッピングしなければなりません
23
次のページでbundleに応用する方法を紹介します
LINSTORでDRBD領域をコンテナにマッピング
bundleへのlinstor-docker-volumeの応用
bundleにてlinstorのvolume-driverを使用
【bundle設定の抜粋】<bundle id="postgres-bundle">
<docker image="container-ha:postgresql12" replicas="1" replicas-per-host="1" options="-v data:/dbfp/pgdata -v wal:/dbfp/pgwal -v arc:/dbfp/pgarch --volume-driver=linstor --log-driver=journald -e PCMK_logfacility=local1"/>
<network ip-range-start="192.168.1.103" host-interface="ens4" host-netmask="24"></bundle>
青:コンテナ内のパス緑:DRBD領域(DRBDリソース)
コンテナ
bundleでコンテナ起動時のオプションを指定することが可能です。
24
これで要件を全て満たすことができました
サーバ#1 サーバ#2
DRBDでAct側からSby側へのデータを引継ぎ
LINSTORでDRBD領域をコンテナにマッピング
PacemakerでDRBD9/LINSTOR/コンテナを冗長化
Master Slave
25
サーバ#1 サーバ#2
起動の流れ(1/5)
Pacemaker起動
26
サーバ#1 サーバ#2
起動の流れ(2/5)
PacemakerによるDRBD起動
今回はDRBD RAを使ってDRBD9の制御をしています。
27
サーバ#1 サーバ#2
起動の流れ(3/5)
Pacemakerによるサーバ#1のDRBDのMaster昇格
Master Slave
28
サーバ#1 サーバ#2
起動の流れ(4/5)
DRBD上のlinstor DBをマウントし、LINSTOR(linstor-controller)を起動
Master SlaveLINSTOR-DB
29
サーバ#1 サーバ#2
起動の流れ(5/5)
linstorを通じてコンテナへDRBDのPostgreSQL DB領域をマッピングしPostgreSQLを起動
Master SlavePostgreSQL-DB
30
Pacemaker上の見え方Stack: corosyncCurrent DC: node_A (version 1.1.21-1.el7-f14e36f) - partition with quorumLast updated: Tue Nov 5 20:33:53 2019Last change: Tue Nov 5 20:33:13 2019 by hacluster via crmd on node A
3 nodes configured18 resources configured
Online: [ node_B node_A ]GuestOnline: [ postgres-bundle-0@node_A ]
Active resources:
Resource Group: LINSTOR-groupprmFsLINSTORDB (ocf::heartbeat:Filesystem): Started node_AprmLINSTOR-VIP (ocf::heartbeat:IPaddr2): Started node_Aprmlinstor-controller (ocf::osc:linstor-controller): Started node_A
Master/Slave Set: msDrbd [drbd]Masters: [ node_A ]Slaves: [ node_B]
Docker container: postgres-bundle [container-ha:postgresql12]postgres-bundle-0 (192.168.1.103) (ocf::heartbeat:pgsql): Started node_A
Clone Set: clnDiskd1 [prmDiskd1]Started: [ node_Bnode_A ]
Clone Set: clnDiskd2 [prmDiskd2]Started: [ node_Bnode_A ]
Clone Set: clnPing [prmPing]Started: [ node_Bnode_A ]
31
コンテナ
コンテナ内のPostgreSQL
LINSTOR
DRBD
サーバ#1 サーバ#2
ちなみにコンテナがフェイルオーバすると?
コンテナがフェイルオーバしてもコンテナとDRBDをマッピングすることが可能です。
Master Slave
32
どこからでもlinstorコマンドが実行できるようになった恩恵です!
サーバ#1 サーバ#2
サーバ#1が死んでも?
サーバ#1が死んでもLINSTORが冗長化できているのでサービス継続可能です。
Master
33
linstor DB、linstor-controllerを冗長化できたことによる恩恵です!
ここまでで構築の話は終わりです。
34
最後にこの構成の長所をアピールしたいと思います。
35
俺が作った構成の長所
めっちゃ安上がり!!→共有ストレージなんていらない
Kubernetesみたいに5台もノードが必要とか言わない!!
→2台で事足りるし、小規模にイイね
36
コミュニティ紹介
37
38
Linux-HA Japan URL
http://linux-ha.osdn.jp/
Pacemaker関連の最新情報を日本語で発信
Pacemakerのダウンロードもこちらからどうぞ(インストールが楽なリポジトリパッケージを公開しています)
https://ja.osdn.net/projects/linux-ha/
39
•ML登録用URLhttp://linux-ha.osdn.jp/の「メーリングリスト」をクリック
•MLアドレス[email protected]
日本におけるHAクラスタについての活発な意見交換の場として「Linux-HA Japan日本語メーリングリスト」も開設しています
Linux-HA-Japan MLでは、Pacemaker、CorosyncDRBDなど、HAクラスタに関連する話題は歓迎!
※スパム防止のために、登録者以外の投稿は許可制です
予告
40
Linux-HA Japanでは、RHEL 8/CentOS 8 以降OS同梱のPacemakerをベースに、クラスタ界隈を
より盛り上げていこうと準備しています。
41
開発コミュニティ(ClusterLabs)では現在Pacemaker-2.0系の開発が進んでいます。
RHEL 8 のHA Add-Onでも採用されています。
詳細は OSC2020 Tokyo/Spring にて!!!!
参考資料
Pacemakerで学ぶHAクラスタ(OSC 2019 Tokyo/Spring)http://linux-ha.osdn.jp/wp/wp-content/uploads/OSC2019_Tokyo-Spring.pdf
コンテナを止めるな!(OSC 2018 Tokyo/Fall)https://www.slideshare.net/ksk_ha/pacemakerhakubernetes-121194991
PacemakerでDockerコンテナをクラスタリング(OSC 2017 Tokyo/Spring)http://linux-ha.osdn.jp/wp/wp-content/uploads/OSC2017_Tokyo_Spring.pdf
42
ご清聴ありがとうございました
43