分散ストレージを用いた 実行環境とデータの分離

分散ストレージを用いた
実行環境とデータの分離
TIS 株式会社
2016/02/24
License
This Document is licensed under a Creative Commons Attribution 4.0 International
Public License.
License Summary: http://creativecommons.org/licenses/by/4.0/
1. はじめに .................................................................................................................. 5
2. 背景 ......................................................................................................................... 6
2.1.
Blue Green Deployment................................................................................. 6
2.1.1.
2.2.
Blue Green Deployment のメリット・デメリット .................................. 6
Immutable Infrastructure ............................................................................. 7
2.2.1.
Immutable Infrastructure のメリット・デメリット ............................... 7
3. 課題 ......................................................................................................................... 8
4. 検証の目的 ............................................................................................................... 8
5. 分散ストレージを用いた実行環境とデータの分離 ................................................... 9
5.1.
分散ストレージ ............................................................................................... 9
5.2.
分散ストレージを用いたデータ分離の概要 ..................................................... 9
6. 比較検証するソフトウェア .................................................................................... 10
6.1.
DRBD9 ......................................................................................................... 10
6.1.1.
概要と特徴 ............................................................................................. 10
6.1.2.
アーキテクチャ ...................................................................................... 10
6.2.
GlusterFS ..................................................................................................... 12
6.2.1.
概要と特徴 ............................................................................................. 12
6.2.2.
アーキテクチャ ...................................................................................... 12
6.3.
Ceph ............................................................................................................. 13
6.3.1.
概要と特徴 ............................................................................................. 13
6.3.2.
アーキテクチャ ...................................................................................... 13
6.4.
3 製品の機能比較 .......................................................................................... 14
7. 検証内容 ................................................................................................................ 15
7.1.
運用環境切り替え検証................................................................................... 15
7.1.1.
想定する運用フロー ............................................................................... 15
7.2.
拡張性検証 .................................................................................................... 17
7.3.
耐障害性検証................................................................................................. 17
7.4.
性能検証 ........................................................................................................ 18
7.4.1.
ファイルシステムへの Read/Write 性能検証 ......................................... 19
7.4.2.
PostgreSQL の実行可能トランザクション数 ......................................... 20
8. 環境情報 ................................................................................................................ 21
8.1.
ハードウェア環境.......................................................................................... 21
8.2.
OS 情報 ......................................................................................................... 21
8.3.
ソフトウェアのバージョン情報 .................................................................... 21
8.4.
各ソフトウェアの検証時の基本構成 ............................................................. 22
9. 検証結果 ................................................................................................................ 24
9.1.
運用環境切り替え検証................................................................................... 24
9.1.1.
DRBD9................................................................................................... 24
9.1.2.
GlusterFS .............................................................................................. 25
9.1.3.
Ceph....................................................................................................... 26
9.1.4.
3 つのストレージを比較した考察 ........................................................... 28
9.2.
拡張性検証 .................................................................................................... 29
9.2.1.
DRBD9................................................................................................... 29
9.2.2.
GlusterFS .............................................................................................. 29
9.2.3.
Ceph....................................................................................................... 30
9.2.4.
3 つのストレージを比較した考察 ........................................................... 31
9.3.
耐障害性検証................................................................................................. 32
9.3.1.
DRBD9................................................................................................... 32
9.3.2.
GlusterFS .............................................................................................. 35
9.3.3.
Ceph....................................................................................................... 38
9.3.4.
9.4.
3 つのストレージを比較した考察 ........................................................... 40
性能検証 ........................................................................................................ 41
9.4.1.
ファイルの Read / Write 性能 ................................................................ 41
9.4.1.1.
実データの位置の違いによる性能変化 ................................................ 41
9.4.1.2.
台数拡張による性能変化 ..................................................................... 47
9.4.1.3.
非同期並列数による性能変化 .............................................................. 52
9.4.2.
分散ストレージ上の PostgreSQL ........................................................... 56
9.4.2.1.
実行トランザクション総数 ................................................................. 56
9.4.2.2.
台数拡張による実行トランザクション総数の変化 .............................. 58
9.4.3.
性能検証全体の考察 ............................................................................... 60
10. まとめ .................................................................................................................. 61
1. はじめに
近年、Blue Green Deployment や Immutable Infrastructure という、本番環境への修正・
変更を本番環境に対して直接行わない運用の考え方が注目されている。特に、Immutable
Infrastructure は、本番環境の構築をコード化することで自動化して、修正・変更点を適用
した環境が容易に作成できるようにすることで、修正・変更適用前の環境の入れ替え・破
棄できるようになり、環境の破棄と生成が容易であるクラウド上での運用に向いている。
Immutable Infrastructure を実現した運用では、本番環境を止めずに新しい環境のテスト
ができる、障害復旧が容易である、テスト環境と本番環境の差異を無くす、などのメリッ
トがある。
しかし、Immutable Infrastructure は変更の度に新しい環境を構築しているため、log や
DB などの、継続利用したいデータが存在する場合はデータを新しい環境に移行する必要が
ある。
この問題を解決する方法として、継続利用したいデータを共有ディスク上に格納して、
本番環境とデータを分離するという方法が考えられる。また、データ共有の方法として分
散ストレージが注目されている。しかし、Immutable Infrastructure と分散ストレージを
組み合わせた運用方法や、運用上の課題などは現在明らかにされていない。
この文書は、分散ストレージの性能・拡張性・耐障害性などの実運用上の課題を Immutable
Infrastructure をユースケースとして検証を行い、結果をまとめたものである。今回、分散
ストレージを実現する OSS として DRBD9、GlusterFS、Ceph の 3 種類を用いて比較検
証した。
2. 背景
運用中
ver.1
2.1. Blue Green Deployment
Blue Green Deployment は、同じ環境が構築された
Blue と Green という 2 つの環境を用意して、本番環
ルーター
ユーザ
待機中
1
境を修正・変更の適用された環境へルータなどを用い
ルーター
ユーザ
2
Blue 環境
修正を反映する
確認を行う。Blue 環境の動作確認後、ルータによって、
ルータで運用環境
を切り替える
ユーザのリクエストを受け付ける運用環境を Green 環
境から Blue 環境へ切り替えて、更新が反映された
Blue 環境での運用を始める(図 1)。
もし、動作確認では見つからなかった予期せぬ不具
ver.2
Green 環境
ver.1
ルーター
ユーザ
3
図1
Blue 環境
ver.2
合が、Blue 環境で本番環境に昇格後発覚した場合は、
以前に稼働していた Green 環境に切り戻すことが可
ver.1
ver.1
Green 環境が本番環境で運用中に、修正・変更があ
く、待機している Blue 環境に変更を適用して、動作
Blue 環境
Green 環境
て切り替える運用の考え方である。
った場合は、稼働中の Green 環境に適用するのではな
Green 環境
Blue Green Deployment
能である。
Blue Green Deployment を実現した運用を行うことで、動作テスト環境をそのまま本番
環境に昇格することが可能であるため、サービス停止時間を通常の運用よりも短くするこ
とが可能である。また、障害復旧も今まで動いていた環境に切り戻すことでサービスを再
開することが可能であるため、障害復旧時間も短くすることができる。
この Blue Green Deployment を発展させたアプローチとして Immutable Infrastructure
がある。
2.1.1. Blue Green Deployment のメリット・デメリット

メリット

サービスを運用しながら、本番環境へ影響を与えずに動作確認を行うことができ
る。


サービスの停止時間を短くできる。

動作確認した新環境をそのまま本番環境にすることが可能

不具合が起こった場合、旧本番環境に戻すことが可能
デメリット

運用状況によっては、環境を二つ用意することになるため、単純に費用が二倍に
なる。

待機している環境への更新方法が、通常の運用と同じであるため、自動化するこ
とが難しい。
2.2. Immutable Infrastructure
Immutable Infrastructure はマシンに環境を構築したら、ソフトウェア構成は直接変更を
行わないという考え方である。マシン内の環境に修正・更新が必要になった場合、別のマ
シンに修正・更新を適用した新環境を一から構築する。その後、Blue Green Deployment
のように新環境の動作確認ができたら、新環境を本番環境に昇格させる。旧環境は新環境
の動作確認が終了次第、破棄する。本番環境に異常が発生した場合は、新たに環境を構築
しなおすことで対応する。
この運用方法は、環境構築のコードによる自動化を前提としており、マシンの生成・破棄
を容易に行うことができるクラウド上で用いられることが多い。
従来
変更
変更
変更・修正があるたびに
現在の環境に反映させる
マシンA
構築
更新
修正
時間
変更・修正があるたびに
変更を反映させた
新しい環境を再構築する
破棄
マシンA
再構築!
破棄
再構築!
マシンB
マシンC
Immutable Infrastructure
変更後に不具合がなければ
以前の環境を破棄する
不具合があれば
前環境にロールバックする
図 2 Immutable Infrastructure
2.2.1. Immutable Infrastructure のメリット・デメリット

メリット

実質的な運用コストが 1 環境のみですむ

コード化による自動化が可能

環境再構築を毎回 1 から行っているため、環境構築の理解に属人性がない

サーバの切り戻し・障害復旧が容易

動作確認した新環境をそのまま本番環境にすることが可能であるため、サービス
の停止時間を短くできる

デメリット

運用環境をマシンごと切り替えるため、DB などの継続的に利用したいデータが破
棄されてしまう。

データをバックアップするなどの対策が必要
3. 課題
Immutable Infrastructure を 実 現 し た 運 用 を 行 い た い 。 し か し 、 Immutable
Infrastructure に DB などを対象とすると継続利用したいデータが破棄されてしまうとい
う問題がある。この問題を解決する方法として、バックアップを取る方法がある。しかし、
バックアップ作成にデータ量によっては時間がかかる、バックアップを展開する新環境で
のバージョン間互換を考える必要がある、バックアップ対象外のデータ(log 等)があるとそ
れらのデータは消えてしまう、という問題が新たに考えられる。
問題を解決する別の方法として、継続利用したいデータを共有ディスク上に格納して、
本番環境とデータを分離するという方法が考えられる。そして、現在注目されているデー
タ共有の方法として分散ストレージがある。今回、分散ストレージを使用しデータ共有を
行う方法を考える。
4. 検証の目的
Immutable Infrastructure を実現する運用で分散ストレージを用いて、実行環境とデ
ータの分離を実現する。実現するにあたっての性能・実運用上の課題である以下の項目に
ついて検証を行う。

分散ストレージを用いて、実行環境とデータの分離を実現することができるのか。

分散ストレージ環境の構築方法、および分散ストレージクラスタの拡張方法の確認

分散ストレージを利用した場合の、読み込み書き込み性能の確認。

分散ストレージの耐障害性・可用性の確認
5. 分散ストレージを用いた実行環境とデータの分離
5.1. 分散ストレージ
近年、ネットワークで接続された複数のストレージ群、もしくはストレージを持つ複数
のマシンを一つのストレージとして見せることができる、分散ストレージソフトウェアが
多数開発されている。これらのソフトウェアは、オープンソースで開発されているものも
ある。分散ストレージは、拡張性に優れている。例えば、小さな構成で始めて、容量を増
やしたくなった場合、分散ストレージクラスタへマシンを追加して容量を増やすことが可
能である。分散ストレージは複数ノードで、1 つのストレージを構成するために、クラスタ
内のノードが 1 つ落ちても、別のノードに Replication されているデータを使うことが可能
であり、可用性が高いといえる。また、分散ストレージ上のデータは各ノードへ再配置可
能であり、負荷分散を行うことも可能である。
5.2. 分散ストレージを用いたデータ分離の概要
サービス実行環境と log や DB などのデータを分離する。構築した新環境が、分散ストレ
ージをマウントすることで、本番環境で使用していた DB 等のデータを引き継ぎ、利用す
ることを可能にする。分散ストレージを用いることで、1 ボリューム内のデータに複数ノー
ドからアクセスすることができれば、本番環境切り替え時にサービス停止時間無しで移行
できると考える。
6. 比較検証するソフトウェア
比較検証を行う、ソフトウェアの詳細を示す。
6.1. DRBD9
6.1.1. 概要と特徴
DRBD (Distributed Replicated Block Device)は LINBIT 社によって開発された、ネット
ワークを介して、ブロックデバイスのリアルタイムレプリケーションを実現可能としたソ
フトウェアである。2015 年 6 月に DRBD の最新バージョンとしてリリースされたのが
DRBD9 である。DRBD8 までは 1 対 1 の単純な Replication であったが、DRBD9 からは
複数ノード間の Replication が可能になった。さらに新機能としてマウント処理と連動した
自動昇格、などが実装されている。また、DRBD8 では実装されていなかった、local storage
を持たず、他ノードにあるデータへアクセス可能なノードである drbd client が利用できる
ようになった。DRBD は、GPLv2 ライセンスで提供されている。
6.1.2. アーキテクチャ
DRBD9 を構成する要素を以下に挙げる。
Resource
特定の複製されたデータセットの総称。
Resource name と Volumes を持つ
Volumes
クライアントがアクセスできる仮想ボリューム。Volume 単
位でレプリケートされる
drbdctrl volume
DRBD の管理情報が格納されている Volume。
server node
Resource が割り当てられているストレージノード。
client node
drbdctrl volume を持つ、または drbdctrl volume と通信が
できるサーバ。上記のノードと通信を行い、ファイル操作
を行う。
Primary role
client node からのデータ読み書きを受け付ける node
クラスタ内に基本的に一台のみ
Secondary role
Primary からの同期処理のみを受け付ける node
DRBD
client node
drbdctrl
block device
mount
drbdctrl
server1
Secondary
DRBD
drbdctrl
server2
Secondary
server 0
Primary
図 3 DRBD9 の構成
DRBD9 は、
基本的には作成した Resource 内の Volumes(仮想ブロックデバイスとして見
える)へファイルシステムを構築してから使用する。ファイルシステム構築後、Volumes を
マウントすることでデータの読み書きを行う。この時、マウントしたノードは Primary role
である。Primary と Secondary の変更は、ノードが Volumes をマウント、アンマウント
する時に変更され、Volumes をマウントしているノードが Primary となる。Primary が
Volumes にデータを書き込むと、書き込んだ内容が Secondary のストレージに Replication
される。Volumes からデータを読み込むときは、複数の Secondary から分散読み込みを行
うことができる。DRBD9 は Volumes 単位で Replication される。
6.2. GlusterFS
6.2.1. 概要と特徴
GlusterFS は、Red Hat 社により開発されている、ファイルベースの分散ファイルシス
テムを実現したソフトウェアである。GlusterFS はオープンソース版だけでなく、商用版
の Red Hat Gluster Storage が発売・サポートされている。オープンソースの GlusterFS
は LGPLv3 と GPLv2 のデュアルライセンスで提供されている。
6.2.2. アーキテクチャ
GlusterFS を構成する要素を以下に挙げる。
Volume
各ノードのデータ格納領域を論理的に 1 つにまとめて、
1 ファイルシステムとして扱う仮想ボリューム
Volume は以下の 4 種類を組み合わせて作成できる。
Distribute, Replicated, Striped, Disperse
Brick
各ノードが持つデータ格納領域(ファイルシステム内のデ
ィレクトリ)ファイルはこの Brick 内に格納される。
server node
Brick を持つストレージノード。
client node
上記のノード内のデータにアクセスを行い、ファイル操作
を行う。
Volume
GlusterFS は、各 Server node 上の複数
の Brick を論理的に一つにまとめることで、
Volume を作成する。作成された Volume
は client node からマウントされることで
利用可能になる。
Volume に対しては GlusterFS client、
Server node
client node
nfs client
or
gluster client
もしくは nfs client からアクセス可能であ
Brick
server 1
Server node
る。
Volume は Brick のまとめ方により、複数
server 0
のタイプの構成を作成することができる。
Brick
server2
4 つの volume タイプは以下のような特徴
を持つ
図 4 GlusterFS の構成

Distributed:保存したファイルが、Volume 内の Brick のいずれか一つに格納される。

Replicated:保存したファイルが、Volume 内の全ての Brick に格納される。

Striped:保存したファイルが、指定したストライプ数に分割・分散され格納される。

Disperse:保存したファイルが RAID5 のように分散配置される。
この 4 タイプをそれぞれ組み合わせることで自身の望む分散ストレージを構築可能である。
GlusterFS は Brick 単位で Replication される。
6.3. Ceph
6.3.1.
概要と特徴
Ceph は、Red Hat 社により開発されている、ブロック、オブジェクト、ファイルシステ
ムの 3 種類のインターフェースに対応した分散ストレージを実現するソフトウェアである。
Ceph はオープンソース版だけでなく、商用版の Red Hat Ceph Storage が発売・サポート
されている。オープンソース版の Ceph は一部のファイルを除いて LGPLv2.1 ライセンス
で提供されている。
6.3.2. アーキテクチャ
Ceph を構成する項目を以下に挙げる。
OSD(Object Storage Device)
ファイルデータやメタデータをオブジェクトとして格納
される。
実際にデータの読み書きを行うプロセスは Object
Storage Daemon (osd)という。
Monitor
クラスタ全体を監視するプロセス。1 クラスタ内に 3 ノー
ド以上稼働させて、冗長化することを推奨されている。
MDS(Meta Data Server)
CephFS のディレクトリの階層構造などのメタデータを
OSD に格納するプロセス。CephFS を使用する時に必要。
client node
OSD、Monitor、MDS と通信を行い、ファイル操作を行
う。
Ceph は、ファイルデータやメタ
データをオブジェクト単位で管理し
ている。すべてのデータは,OSD 上に
格納される。Monitor はデータの場
所やクラスタ内のプロセスの死活情
報など、のクラスタの情報を管理し
ている。
client node は、まず Monitor にク
ラスタの情報を問い合わせてから、
OSD に対してデータの操作を行う。
Ceph では、ブロックデバイスとし
図 5 Ceph の構成
てアクセスできる CephRBD と Ceph が提供しているファイルシステムである CephFS の 2
種類のデータアクセス方法がある。
CephFS では、MDS を用いて、ファイルシステムの階層構想などのメタデータを OSD に
格納している。
6.4. 3 製品の機能比較
DRBD9、GlusterFS、Ceph の 3 点について、機能面で比較した表を以下に示す。
DRBD9
GlusterFS
Ceph
Linux
Linux
Linux
クライアントの ブロックデバイス
ファイルシステム、
ファイルシステム、
アクセス方法
nfs
ブロックデバイス
Replication 方 完全ミラーリング
ボリュームの組み合わ オブジェクト単位
式
せによる
Replication 単 ボリューム
ブリック
オブジェクト単位
稼働する OS
位
(ブロックデバイス)
同期単位
同期・非同期
同期・非同期
同期・非同期
選択可能
選択可能
選択可能
データ再配置
手動
手動
自動
最小構成
2台
2台
3 台(設定で変更可能)
スナップショ
有
有
有
drbdmanage
複数のコマンド群
Ceph-deploy
LINBIT クラスタスタッ
Red Hat Gluster Storage Red Hat Ceph Storage
ット
設定管理ツー
ル
商用サポート
ク
7. 検証内容
今回の検証では、運用環境切り替え検証、拡張性検証、耐障害性検証、性能検証の 4 つ
の検証を行う。
7.1. 運用環境切り替え検証
分散ストレージを用いて、データと実行環境を分離した運用を行う。今回の検証では、
7.1.1 の 2 つの想定した運用フローに沿って、Immutable Infrastructure の考え方に基づい
た運用における環境切り替えが実現可能かどうか検証を行う。
具体的には、PostgreSQL のバージョンを 9.4.4 から 9.4.5 へのアップデートを行い、そ
の後不具合が見つかったという想定で切り戻しを行う。
運用フローを通して、以下の点の調査を行う。

異なるノード間でデータの引き継ぎが可能か。

引き継いだデータに対して、Read・Write 可能か。

環境移行時のサービス停止時間があるか。
7.1.1. 想定する運用フロー
今回想定するサービス運用環境は、一台のみで PostgreSQL が動いている。
今回の運用フローは、環境構築や切り替えを自動化するコードの作成は省略し、すべて手
作業で行った。
前提条件として以下の 4 点がある。
前提条件 1:DB サーバ 1 台、分散ストレージクラスタ 3 台の構成で運用している
前提条件 2:分散ストレージ上に継続使用したいデータが格納されている
前提条件 3:PostgreSQL の新旧のバージョン間には互換性がある
前提条件 4:運用中のノードは極力止めずに、新しい変更を適用済みのノードへ切り替える
今回の検証で想定した運用フローを以下に示す。
i.
変更を新環境に適用し正常な動作確認後、旧環境からの切り替えを行う運用
PostgreSQL のマイナーバージョンアップを行う。
運用中のノードはノード A、新しい環境を適用済みのノードはノード B とする。
① ノード B 上に同一の環境を構築して更新を適用する。
② ノード A で使用している分散ストレージボリュームを、ノード B にもマウントする。
③ ノード B で分散ストレージボリューム上の、本番データに対して、読み込み・書き込
み可能がテストする。
④ ノード B からデータが正常に読み込み・書き込み可能であることを確認後、ユーザの
アクセス先をノード A からノード B に切り替える。
⑤ サービス運用環境がノード B に移行後、問題がなければノード A のサービスを停止す
る。
⑥ ノード A の分散ストレージボリュームをアンマウントする。
ii.
本番環境に切り替え後に問題が発生した場合に、旧環境に切り戻しする運用
i. の作業の続きで、環境切り替え後に、ノード B からのデータ操作に異常が発見された
前提とする。また、旧運用環境のノード A は廃棄してないものとする。
① ノード B で実行中のサービスを停止し、分散ストレージボリュームをアンマウントす
る。
② ノード A へ分散ストレージボリュームをマウントする。
③ ノード A へ分散ストレージ上のデータを読み込み・書き込みが可能か確かめる。
④ ノード A をサービス運用ノードに変更する。
⑤ ノード B の環境を削除する。
7.2. 拡張性検証
分散ストレージにデータを書き込みながら、サービスの停止時間無しで、分散ストレー
ジクラスタにノードを追加することができるか確認する。
今回の検証では、分散ストレージクラスタ 3 台の構成に、ノードを 1 台クラスタへ追加
する。ノード追加時には、分散ストレージクラスタ外から pg_bench を用いて、常時分散ス
トレージへ書き込み続けている状態にする。
pg_bench が異常終了もしくは応答待ち状態になれば、分散ストレージへ新規ノードを追
加時に稼働中のサービスに影響が出たものとする。また、pg_bench が正常終了、且つ実行
トランザクションに漏れがなければ、リアルタイムに新規ノードの追加が可能と判断する。
7.3. 耐障害性検証
サービスが分散ストレージへデータを書き込み中に、障害が発生した時の影響と障害か
らの復旧方法を検証する。検証環境の分散ストレージクラスタの構成台数は 3 台で行う。
今回は以下のケースで確認した。

NIC 障害
サービスが分散ストレージへデータを書き込み中に、分散ストレージクラスタ内のノー
ドの NIC を落とした場合の検証を行う。NIC は ifdown コマンドを用いて落とす。NIC を
落とすノードのパターンとしては、以下のパターンを行う。


分散ストレージクライアントがマウントしている 1 ノード

前記以外の 1 ノード

全ノード
正常シャットダウン
サービスが分散ストレージへデータを書き込み中に、分散ストレージクラスタ内の全て
のノードが正常シャットダウンされた時の確認を行う。シャットダウンは shutdown コマ
ンドを用いた。

1 ノード異常終了
サービスが分散ストレージへデータを書き込み中に、分散ストレージクラスタ内のノー
ドが、電源を物理的に切断された時の確認を行う。異常終了させるノードのパターンは以
下のケースで確認した。

分散ストレージクライアントがマウントしている 1 ノード、

前記以外の 1 ノード
7.4. 性能検証
今回の性能検証では、分散ストレージに対してリアルタイムに数 MB~数十 GB 程度のフ
ァイルが読み書きされる場合と、分散ストレージ上で PostgreSQL を動かしたした場合を
ユースケースとして考える。
上記ユースケースのもとで、各ソフトウェアで構築したストレージに対して、ファイル
システムへの Read/Write 性能と、
PostgreSQL の実行可能トランザクション数を計測した。
今回の検証では、本番環境も含めて分散ストレージクラスタを構築している時と分離し
ている時の性能の違い(図 6)と、分散ストレージクラスタの台数拡張による性能変化につい
て計測した(図 7)。
検証用
アプリケーション
検証用
アプリケーション
分散ストレージクラスタ
分散ストレージクラスタ
図 6 検証イメージ:ストレージクラスタ内・外での性能変化
検証用
アプリケーション
検証用
アプリケーション
分散ストレージクラスタ
分散ストレージクラスタ
検証用
アプリケーション
分散ストレージクラスタ
図 7 検証イメージ:台数変化による性能変化
今回行った性能検証時の、性能にかかわるパラメータの設定は、すべてデフォルト値で
行った。そのため、Ceph の Replication 数はデフォルト値の 3 で固定され、GlusterFS と
DRBD9 は、台数拡張に伴って Replication 数が増えている。
7.4.1. ファイルシステムへの Read/Write 性能検証
分散ストレージ上へのファイル書き込みと読み込みについて計測を行った。
計測にはベンチマークツールの fio を使用した。
以下に、fio を用いてファイルサイズ 10GB
の単一ファイルを読み込む時のコマンド例を示す。
fio -name=random-read_10G
-ioengine=libaio ¥
-group_reporting ¥
--directory=/mnt/t_volume ¥
--output=/result/ random_read_10G.txt ¥
--rw=randread ¥
--iodepth=16 ¥
-numjobs=1 ¥
--direct=1 ¥
--bs=4k ¥
--runtime=180 ¥
--size=10g ¥
今回の検証では、ファイルサイズを変更した場合と、非同期アクセス数を変更した場合の
検証を行った。
A) ファイルサイズ変更時
ファイルアクセス方法 (rw)
sequential read/write, random read/write
ファイルサイズ (size)
10240MB, 5120MB, 1024MB, 512MB, 16MB
非同期アクセス数 (iodepth)
16
同時書き込み数 (numjobs)
1
ブロックサイズ (bs)
4KB
実行時間 (runtime)
3分
B) 非同期 Read/Write 数による違いの計測
ファイルアクセス方法 (rw)
random read/write
ファイルサイズ (size)
1024MB
非同期アクセス数 (iodepth)
1, 16, 32
同時書き込み数 (numjobs)
1
ブロックサイズ (bs)
4KB
実行時間 (runtime)
3分
上記に明記しなかった値は fio のデフォルト値を用いた。
7.4.2. PostgreSQL の実行可能トランザクション数
分散ストレージ上にデータがある PostgreSQL の 3 分間に実行されたトランザクション
数の計測を行う。さらに、分散ストレージクラスタの台数拡張による性能変化と、分散ス
トレージのクライアントが、分散ストレージクラスタ内にいる場合と、クラスタ外にいる
場合の性能変化も調べた。
計測には、ベンチマークツールの pg_bench を用いた。実行するトランザクションは、以
下の SQL である。
i.
pgbench_accounts を 1 件更新
ii.
pgbench_accounts から 1 件検索
iii.
pgbench_history に 1 件行を追加
DB への同時接続数の違いによる性能変化を計測するため、セッション数が 1, 5, 10, 50,
100 の場合で計測を行った。
8. 環境情報
今回の検証で用いた環境情報を以下に示す。
8.1. ハードウェア環境

CPU:Intel(R) Xeon(R) CPU E5506 @ 2.13GHz

4 core/8 thread

Memory Size:48GB

SSD250GB

ストレージは RAID 0 を上記 SSD2 枚で構成している。
8.2. OS 情報

CentOS

CentOS Linux release 7.1.1503

kernel version 3.10.0-229.20.1.el7.x86_64
8.3. ソフトウェアのバージョン情報

DRBD9
今回、DRBD9 の git の master branch から clone したものを使用した。

DRBD version 9.0.0 11 月 1 日更新
(git_hash=ece72f515db06d78f1603c452d38d1f943648eb4)

drbdmanage version 0.5.0 9 月 29 日更新
(git_hash=c5f39e2511d40329ae66783e6476a6c41c273440)

drbd-utils version 8.9.4 11 月 1 日更新
(git_hash=13f1450d0aa5af7466977f4c8be77794817b578e)


GlusterFS



ブロックデバイス上のファイルシステムは ext4 を用いた。
GlusterFS version 3.7.6
Ceph

ceph version 0.94.3

ceph-deploy version 1.5.26
PostgreSQL

version 9.4.5

運用検証時のみ 9.4.4 も同時に使用した

ブロックデバイス上のファイルシステムは ext4 を用いた。
8.4. 各ソフトウェアの検証時の基本構成

DRBD9

PostgreSQL を実行する環境も含めて、すべてのノードが drbdctrl ボリュームを
持つ。
client
PostgreSQL
DRBD9
fio
CentOS
drbdctrl
マウント
Server
分散ストレージクラスタ
DRBD9
DRBD9
DRBD9
CentOS
CentOS
CentOS
drbdctrl
data
drbdctrl
data
drbdctrl
図 8 DRBD9 の検証時基本構成
data

GlusterFS

各ノードは一つのブリックを持つ
client
PostgreSQL
GlusterClient
fio
CentOS
マウント
Server
分散ストレージクラスタ
Gluster Server
Gluster Server
Gluster Server
CentOS
CentOS
CentOS
Brick
Brick
Brick
図 9 GlusterFS の検証時基本構成

Ceph

各ノードで、OSD、Monitor を動かす

CephFS を使用する時は上記 2 つに加えて、MDS を動かす
client
PostgreSQL
Ceph client
fio
CentOS
マウント
Server
分散ストレージクラスタ
Monitor
OSD
CentOS
data
Monitor
OSD
CentOS
Monitor
OSD
CentOS
data
図 10 Ceph の検証時基本構成
data
9. 検証結果
今回行った、運用環境切り替え検証、拡張性検証、耐障害性検証、性能検証の 4 つの検証
結果を示す。
9.1. 運用環境切り替え検証
3 つの分散ストレージソフトウェアについて、想定した運用フロー通りに運用環境を切り
替えることができたか結果を示す。
9.1.1. DRBD9
DRBD9 で デ ー タ と 実行 環 境 の 分 離 を 行 っ た。 想 定 し た 運 用 フ ロ ーは 、 実 行 中 の
PostgreSQL のプロセスを止め、
Volume にどのノードからもマウントされていないという、
制約付きで実現可能であることを確認した。
DRBD9 は、想定した運用フローを実現するために、以下の制約が必要となった。

DRBD9 の制約事項

DRBD9 は 1 ボリュームに対して、複数ノードからの通常マウントは現在(2015
年 12 月)許容されていない。このため、マウントするノードを切り替える時、ボ
リュームはどのノードからもマウントされていない状態でなければならない。

アンマウントするときに PostgreSQL のプロセスが動いているとボリュームのア
ンマウントができないため、マウントするノードを切り替える時、PostgreSQL
のプロセスは停止しなければならない。
DRBD9 は複数ノードからの書き込みができないため、運用環境切り替え時に、サービス
の停止時間がどうしても発生する。なので、想定した Immutable Infrastructure を実現す
る運用はできないと思われる。
サービス停止時間を許容する運用フローならば、サービス停止時間や障害発生時の環境の
切り戻しは Volume のアンマウント、マウントを行うだけであるため、短時間で行うことが
できる。
表 1 DRBD9:運用フロー実行結果
検証結果
データの引き継ぎ
可能
引き継ぎ後のデータの Read
可能
引き継ぎ後のデータの Write
可能
サービス停止時間
有
運用環境の切り戻し
可能
運用環境の切り戻し時間
有
備考
今回の検証では約 1 分未満
サービス停止時間と同じ
9.1.2. GlusterFS
GlusterFS でデータと実行環境の分離を行った。想定した運用フローは、実行中の
PostgreSQL のプロセスを止めるという制約付きで、実現可能であることを確認した。今回
発生した制約は、GlusterFS ではなく PostgreSQL 側の問題であることも確認した。
GlusterFS に対して、想定した運用フローを実現するために、制約は必要でなかった。
しかし、PostgreSQL は GlusterFS 上で動かすとき、以下の制約が必要であることがわか
った。

PostgreSQL の制約事項
複数ノードからマウントされている状態で、PostgreSQL をそれぞれのノードで起動する
と、PostgreSQL の data ディレクトリ内の.pid ファイルの整合性が取れなくなり、
PostgreSQL の操作ができなくなってしまう。このため、環境を切り替える時、PostgreSQL
のプロセスは、すべてのノードで停止しなければならない。
上記、pid ファイルの整合性の対策として、pid ファイルを data ディレクトリから分離
することを考えた。しかし、他ノードからの DB への書き込みは、書き込んだノード以外
から読み込むことができなかったため、他の対策が必要である。
GlusterFS は 、 PostgreSQL を ユ ー ス ケ ー ス と し た 場 合 、 想 定 し た Immutable
Infrastructure を実現する運用はできないと思われる。PostgreSQL 以外のユースケースな
らば実現できる可能性があるかもしれない。
今回の結果は GlusterFS クライアントでマウントする時、NFS マウントする時のどちら
でも同様の実行結果だった。
複数ノードからの同時マウントは、1 ファイルに同時書き込みを行おうとすると、結果が
時系列的に更新の新しい方を優先されてしまい、時系列的にそれ以前のものは破棄される
という結果を得た。つまり、無理に複数ノードから書き込みをせずに、書き込みを行って
いるノード以外は読み込みしか行わないという運用ルールが必要であると考える。
表 2 GlusterFS:運用フロー実行結果
検証結果
データの引き継ぎ
可能
引き継ぎ後のデータの Read
可能
引き継ぎ後のデータの Write
可能
サービス停止時間
有
備考
PostgreSQL が原因で発生
今回の検証では約 1 分未満
運用環境の切り戻し
可能
運用環境の切り戻し時間
有
サービス停止時間と同じ
9.1.3. Ceph
想定した運用フローは CephFS では GlusterFS と同じ、実行中の PostgreSQL のプロセ
スを止めるという制約付きで、実現可能であることを確認した。
Ceph RBD では、複数ノードからの書き込みを行うと、データに不整合が発生したため
DRBD9 と同じ制約付きで、実現可能であることを確認した。

CephFS
CephFS マウントでは GlusterFS の制約事項と同じ PostgreSQL が原因で、環境を切り
替える時、PostgreSQL のプロセスをすべてのノードで停止しなければならない。
CephFS は 、 PostgreSQL を ユ ー ス ケ ー ス と し た 場 合 、 想 定 し た Immutable
Infrastructure を実現する運用はできないと思われる。PostgreSQL 以外のユースケースな
らば実現できる可能性があるかもしれない。
表 3 Ceph(CephFS):運用フロー実行結果
検証結果
データの引き継ぎ
可能
引き継ぎ後のデータの Read
可能
引き継ぎ後のデータの Write
可能
サービス停止時間
有
備考
PostgreSQL が原因で発生
今回の検証では約 1 分未満
運用環境の切り戻し
可能
運用環境の切り戻し時間
有
サービス停止時間と同じ
Ceph RBD

Ceph RBD では、RBD マウントを複数ノードから行うと、1 ノードでのファイル更新はす
べてのノードに適用されず、データに不整合が発生するため、以下の制約が必要となる。


Ceph RBD の制約事項
RBD でマウントするノードを切り替える時、ボリュームがどのノードにもマウント
されていない状態でなければならない。
CephRBD は複数ノードからの書き込みを行うとデータに不整合が発生する。複数ノードか
らの書き込みを防止するために、サービスの停止時間がどうしても発生する。なので、想
定した Immutable Infrastructure を実現する運用はできないと思われる。
表 4 Ceph(RBD):運用フロー実行結果
検証結果
データの引き継ぎ
可能
引き継ぎ後のデータの Read
可能
引き継ぎ後のデータの Write
可能
サービス停止時間
有
運用環境の切り戻し
可能
運用環境の切り戻し時間
有
備考
今回の検証では約 1 分未満
サービス停止時間と同じ
9.1.4. 3 つのストレージを比較した考察
DRBD9 と CephRBD といった、ブロックデバイスへマウントを行う場合、複数ノードか
らの Write を同時に行うことができない。しかし、クラスタ内に Primary がいない場合に
限って Read Only で複数ノードからマウントできることを確認した。このため、Immutable
Infrastructure を実現する運用はできないが、データの読み込みのみを行うことは可能で
あるため、ユースケースによっては実現できるかもしれないと考える。
GlusterFS client、GlusterFS nfs、CephFS は、今回の PostgreSQL の場合にサービス
停止時間が発生してしまう。このため、PostgreSQL をユースケースとした場合は、厳密な
Immutable Infrastructure を実現する運用はできない。しかし、複数ノードからのデータ
操作を許容するサービスならば、Immutable Infrastructure を実現する運用が実現できる
と考える。
7.1.1 で示した、今回の運用フローでは、環境移行前のチェックに本番環境が読み書きし
ている分散ストレージ上の領域を新規環境から並行して参照している。このため、格納さ
れているデータはエラーが発生すると汚染されてしまう可能性がある。データ汚染回避の
対策として、テストをデータの Read だけにすることが考えられる。それ以外の対策として、
各分散ストレージでスナップショット等のバックアップをあらかじめ作成する、検証環境
に、本番環境で使用しているブロックデバイスのコピーを行うこともデータ汚染対策とし
て考えられる。
結論として、分散ストレージを使用した Immutable Infrastructure を実現する運用は難
しく、実現できるのは限られた場合のみになると考えられる。
9.2. 拡張性検証
3 つの分散ストレージソフトウェアについて、クラスタへのノードの追加がサービス無停
止で可能であるか検証した結果を示す。
9.2.1. DRBD9
DRBD9 はサービス無停止で、ノードの追加が可能であることを確認した。拡張中もデー
タの読み書きが正常に行われていることも確認できた。

拡張手順
DRBD9 でのノードの拡張手順を示す。
i.
ii.
クラスタ内のノードが、クラスタへ新規にノードを追加する(add-node)。
追加ノードに移したいボリュームを割り当てる(assign)。
iii.
データの同期が終わるまで待つ。
iv.
領域を解放したいノードは、追加ノードに割り当て済みのボリュームを未割り当て
(unassign)にする。
今回の手順では、各ノードが持つデータ量を均一にするためにデータの再配置も行った。
これは、DRBD9 は自動でデータの再配置を行わないためである
拡張後のデータ同期の時間は、40GB のボリュームでは約 5~8 分程度の時間がかかった。
今回の拡張検証で起こった現象として、unassign を実行する操作で、pg_bench トラン
ザクションで内の pg_history への insert 処理が約 10 秒間待たされる現象が発生した。こ
の原因は、unassign したノードからの keep-alive packet の受信待ちが原因で発生したと考
えられる。約 10 秒の待ち時間以外は、読み書きの性能は低下していなかった。
9.2.2. GlusterFS
GlusterFS はサービス無停止で、ノードの追加が可能であることを確認した。拡張中も
データの読み書きが正常に行われていることも確認できた。GlusterFS マウント、nfs マウ
ントのどちらの場合でも同様の結果を得ることができた。
今回の検証では、Replication モードでクラスタを組み拡張を行った。

拡張手順
GlusterFS でのノードの拡張手順を示す。
i.
ii.
クラスタへ新規にノードを追加する(peer)。
追加ノードで、ブリック用のディレクトリを作成する。
iii.
ボリュームに追加ノードを割り当て。(add-brick と Replication 数を 4 に増やす)
iv.
データの同期を待つ。
GlusterFS は同期の進捗状況を出力する方法が確認できなかった。このため、データ同
期の可否は、追加ノードのブリック内にファイルがあるかどうかで確かめた。
実際に拡張を行い、特に問題なくノード拡張を行うことができた。データの同期時間は、
計測できなかったが、同期が行われていることは確認した。
9.2.3. Ceph
Ceph はサービス無停止で、ノードの追加が可能であることを確認した。CephFS、RBD
のどちらも、拡張が可能であることを確認した。しかし、トランザクションの処理性能が、
ノードの追加後のデータ再配置を行う間、性能低下することを確認した。

拡張手順
Ceph でのノードの拡張手順を示す。
i.
新規に追加するノードで、Ceph 用のユーザ作成、Ceph 用ディレクトリを作成する
ii.
ceph-deploy を行うノードで、hosts ファイルの編集、新規追加ノードへ鍵の配布を
行う。
iii.
ceph-deploy を行うノードが新規に追加するノードに、Monitor の作成、OSD の作
成・起動を行う。
iv.
データの同期を待つ。
Ceph でノードを拡張した直後から、pg_bench の秒間実行トランザクション数が減少し
ていた。具体的には、ノード追加前は約 111 トランザクション/sec で処理していたが、ノー
ドを追加した直後から約 5 トランザクション/sec になってしまっていた。この原因としては、
データの再配置がクラスタ内で行われていたためと考えられる。
9|
2|
3|
1 | 78430 | -871 | 2015-11-25 11:31:13.997294 |
1 | 6545 | 1072 | 2015-11-25 11:31:14.000818 |
1 | 43748 | -1477 | 2015-11-25 11:31:14.00452 |
1|
3|
9|
6|
7|
8|
10 |
1|
4|
6|
1|
5|
8|
9|
1 | 65051 | 4070 | 2015-11-25 11:31:14.4214
|
1 | 51055 | -2440 | 2015-11-25 11:31:14.549549 |
1 | 5702 | 2580 | 2015-11-25 11:31:14.952268 |
1 | 47368 | 1155 | 2015-11-25 11:31:15.129388 |
1 | 7294 | 1215 | 2015-11-25 11:31:15.409634 |
1 | 76919 | -1980 | 2015-11-25 11:31:15.597786 |
1 | 56773 | 4159 | 2015-11-25 11:31:15.702991 |
1 | 79827 | -4835 | 2015-11-25 11:31:15.913404 |
1 | 25253 |
74 | 2015-11-25 11:31:16.120762 |
1 | 70723 | 2546 | 2015-11-25 11:31:16.294528 |
1 | 11048 | 658 | 2015-11-25 11:31:16.455919 |
1 | 15096 | -555 | 2015-11-25 11:31:16.65371 |
1 | 6563 | -1959 | 2015-11-25 11:31:16.825237 |
1 | 27071 | 4998 | 2015-11-25 11:31:17.000395 |
…
pg_bench の実行後、データの再配置にかかった時間は、今回の検証で用意した 40GB の
ボリュームに対して、約 5~7 分の時間がかかった。
今回、3 分間 pg_bench を実行したため、観測できなかったが、より長い時間計測すると、
データの再配置終了後にトランザクション実行性能が元に戻る可能性がある。
9.2.4. 3 つのストレージを比較した考察
DRBD9 は現在データの自動再配置機能は存在しないため、他のソフトウェアと比べて手
間がかかる。さらに、ボリュームの再配置による領域の確保は、あらかじめ使用するボリ
ュームを細かく分けておく必要がある。同期時間は DRBD9 のデータボリュームのサイズ
によって変化していると考える。理由として、ボリューム内にデータが入っていない場合
でも、今回の検証ではデータ同期に 5 分程度の時間がかかっていたためである。
GlusterFS は今回、何も問題なくノードの拡張ができた。今回検証を行わなかったが
Replicated に Distributed や Striped モードを組み合わせた場合や、Disperse モードを使
用した場合にはデータの再配置を手動で行う必要がある。このデータの再配置を行う時、
Ceph と同様にデータの再配置による処理性能低下が発生する可能性がある。
Ceph は、秒間の実行トランザクション数が大きく減少するという結果が出た。性能低下の
理由は、Ceph がデータの自動再配置が原因である可能性が高い。性能低下してしまうので、
Ceph のクラスタを拡張する時は、処理性能の低下による影響の少ない夜中などに行うこと
が望ましいと考えられる。
9.3. 耐障害性検証
3 つの分散ストレージソフトウェアについて、以下の観点で耐障害性と障害復旧方法を検証
した。今回、障害が発生したノードは障害ノードと呼ぶ。

NIC 障害

分散ストレージクライアントがマウントしている 1 ノードで発生

DRBD9 と CephRBD は除く

前記以外の 1 ノードで発生

全ノードで発生

正常シャットダウン

1 ノード異常終了

分散ストレージクライアントがマウントしている 1 ノードで発生


DRBD9 と CephRBD は除く
前記以外の 1 ノードで発生
9.3.1. DRBD9

1 ノード NIC 障害
1 ノード NIC 障害の場合、障害発生による、クラスタへの影響は観測されず、pg_bench
は正常終了した。障害が発生したノードは NIC の回復後に drbdmanage server の再起動を
行うと、クラスタの状態が復旧することを確認した。
NIC を止めると、正常に動作しているクラスタ内のノードで`drbdmanage list-node` コ
マンドを実行すると、障害ノードの State が OFFLINE になっていることが確認できる。
障害ノードで NIC の ifup を行い、回復しても State に変化はなかった。
復旧方法は、drbdmanage shutdown コマンドと drbdmanage startup コマンドを実行
すると障害ノードの State が正常に戻り、データの同期が開始された。
pg_bench の pgbench_history を確認したところ、トランザクション実行時のタイムスタ
ンプが障害発生直後から 10 秒ほど待ちが発生し、その後正常に読み書きされていることが
確認できた。この 10 秒という時間は DRBD9 の keep-alive packet の送信間隔と一致して
いた。設定で keep-alive packet の送信間隔を変更すると、変更した時間と同じ時間だけ、
タイムスタンプの飛びを確認できた。

全ノード NIC 障害
全ノードで NIC を止めると、client node は Volume にアクセスできなくなり、pg_bench
は異常終了し、PostgreSQL も異常停止していた。すべてのノードで NIC の回復と
drbdmanage server プロセスの再起動を行い、
PostgreSQL を再起動することで復旧した。
全ノード NIC 障害時のログ
node-pclient01 で pg_bench を実行している間に、node-01,node-02,node-03 の NIC を止める
``````````````````````````````````````````````````````````````````````````````````````````````````````````
`````````````````````````
bash-4.2$ /usr/pgsql-9.4/bin/pgbench -c 1 -T 360 test
starting vacuum...end.
Client 0 aborted in state 13: PANIC: ログファイル 00000001000000080000000D を fdatasync できませんでした: 入
力/出力エラーです
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 360 s
number of transactions actually processed: 2220
latency average: 162.162 ms
tps = 61.184189 (including connections establishing)
tps = 61.190113 (excluding connections establishing)
bash-4.2$ exit
exit
[root@node-pclient01 inamoto]# drbdsetup status
.drbdctrl role:Secondary
volume:0 disk:UpToDate
volume:1 disk:UpToDate
node-01 connection:Connecting
node-02 connection:Connecting
node-03 connection:Connecting
pg_volume role:Primary
disk:Diskless
node-01 connection:Connecting
node-02 connection:Connecting
node-03 connection:Connecting
t_volume role:Secondary
disk:Diskless
node-01 connection:Connecting
node-02 connection:Connecting
node-03 connection:Connecting
````````````````````````````````````````````````````````````````````````````````````````
一度 unmount としてから、再度マウントすると、node-pclient01 から PostgreSQL を止めることができる
PostgreSQL を停止し、再び起動すると、またデータを触ることができるようになる。
`````````````````````````````````````````````````````````````````````````````````````````````
[root@node-pclient01 inamoto]# umount /var/lib/pgsql/9.4/
[root@node-pclient01 inamoto]# mount /dev/drbd100 /var/lib/pgsql/9.4/
[root@node-pclient01 inamoto]# su postgres
[root@node-pclient01 inamoto]# su postgres
bash-4.2$ cd
bash-4.2$ /usr/pgsql-9.4/bin/pg_ctl -D /var/lib/pgsql/9.4/data/ -l logfile start
pg_ctl: 他のサーバが動作中の可能性がありますが、とにかく postmaster の起動を試みます。
サーバは起動中です。
クライアントノード以外の全てのノードで NIC を止めると、ストレージに書き込むこと
ができなくなり、pg_bench は I/O エラーで停止する。また、PostgreSQL のプロセスが停
止しており、マウントしているボリュームが自動的にアンマウントされていた。分散スト
レージ内の全てのノードを 1 ノード NIC 障害の時と同じ手順で回復行い、その後クライア
ントがボリュームを再マウントする。そして、PostgreSQL を起動することで障害前の状態
に戻った。

全ノード正常シャットダウン
分散ストレージクラスタ内の全てのノードが正常シャットダウンされた場合、全ノード
NIC 障害と同様に、client node は Volume にアクセスできなくなり、pg_bench は異常終
了し、PostgreSQL も異常停止していた。
シャットダウンされたノードを再び起動して、全ノード NIC 障害と同じ復旧手順をとるこ
とで、環境は復旧した。

1 ノード異常終了
1 ノード異常終了の場合、1 ノード NIC 障害の場合同様に、障害発生による、クラスタ
への影響は観測されず、pg_bench は正常終了した。
障害ノードの電源を再び起動した後は、他の障害からの復旧と同じで、drbdmanage
server プロセスを起動することで障害前の状態に復旧した。
9.3.2. GlusterFS

1 ノード NIC 障害
1 ノード NIC 障害が発生すると、glusterfs client、nfs client のどちらでも、クラスタは
障害ノードが認識できなくなるが、実行中の pg_bench は正常終了した。障害が発生したノ
ードは NIC の回復と glusterd プロセスの再起動を行うことで、元の状態にクラスタが復旧
した。
1 台の NIC を止めると、
gluster peer status で出てくる障害ノードの State が disconnect
となり、gluster vol status を見ると動作中のプロセス一覧から削除されていた。障害発生
後も pg_bench はトランザクションの消失なしに正常終了した。
障害ノードの NIC を回復すると、障害ノードが gluster peer と gluster vol status どち
らからも認識された。しかし、gluster vol status の Online 項目だけは No になっていた。
NIC 回復後に、
障害ノードで、glusterd を restart すると、
ボリュームのステータスの Online
状況も Yes になり、分散ストレージクラスタが元の状態に戻った。GlusterFS client、nfs
のどちらでも同様の結果になった。
正常な状態
[root@node-01 inamoto]# gluster vol status
Status of volume: pg_volume
Gluster process
TCP Port RDMA Port Online Pid
-----------------------------------------------------------------------------Brick 10.255.195.57:/export/sda3/brick/pg_v
olume
49153
0
Y
16018
Brick 10.255.195.58:/export/sda3/brick/pg_v
olume
49153
0
Y
15320
Brick 10.255.195.59:/export/sda3/brick/pg_v
olume
49153
0
Y
15108
NFS Server on localhost
2049
0
Y
16875
Self-heal Daemon on localhost
N/A
N/A
Y
16883
NFS Server on 10.255.195.60
2049
0
Y
31577
Self-heal Daemon on 10.255.195.60
N/A
N/A
Y
31585
NFS Server on 10.255.195.58
2049
0
Y
15965
Self-heal Daemon on 10.255.195.58
N/A
N/A
Y
15973
NFS Server on 10.255.195.59
2049
0
Y
15710
Self-heal Daemon on 10.255.195.59
N/A
N/A
Y
15718
Task Status of Volume pg_volume
-----------------------------------------------------------------------------There are no active volume tasks
Volume t_volume is not started
NIC 停止直後
[root@node-01 inamoto]# gluster vol status
Status of volume: pg_volume
Gluster process
TCP Port RDMA Port Online Pid
-----------------------------------------------------------------------------Brick 10.255.195.57:/export/sda3/brick/pg_v
olume
49153
0
Y
16018
Brick 10.255.195.58:/export/sda3/brick/pg_v
olume
49153
0
Y
15320
NFS Server on localhost
2049
0
Y
16875
Self-heal Daemon on localhost
N/A
N/A
Y
16883
NFS Server on 10.255.195.60
2049
0
Y
31577
Self-heal Daemon on 10.255.195.60
N/A
N/A
Y
31585
NFS Server on 10.255.195.58
Self-heal Daemon on 10.255.195.58
2049
N/A
0
N/A
Y
Y
15965
15973
Task Status of Volume pg_volume
-----------------------------------------------------------------------------There are no active volume tasks
Volume t_volume is not started
[root@node-01 inamoto]# gluster peer status
Number of Peers: 3
Hostname: 10.255.195.58
Uuid: 2bd9632d-f502-4f54-8f3e-1bd36fc20e4f
State: Peer in Cluster (Connected)
Hostname: 10.255.195.59
Uuid: a8e0d916-7983-41db-aab8-a0f7321a9f45
State: Peer in Cluster (Disconnected)
Hostname: 10.255.195.60
Uuid: e6df1c93-6f37-4bce-a748-39d2af7ce2cf
State: Peer in Cluster (Connected)
[root@node-01 inamoto]#
NIC 復帰直後
[root@node-01 inamoto]# gluster vol status
Status of volume: pg_volume
Gluster process
TCP Port RDMA Port Online Pid
-----------------------------------------------------------------------------Brick 10.255.195.57:/export/sda3/brick/pg_v
olume
49153
0
Y
16018
Brick 10.255.195.58:/export/sda3/brick/pg_v
olume
49153
0
Y
15320
Brick 10.255.195.59:/export/sda3/brick/pg_v
olume
N/A
N/A
N
N/A
NFS Server on localhost
2049
0
Y
16875
Self-heal Daemon on localhost
N/A
N/A
Y
16883
NFS Server on 10.255.195.60
2049
0
Y
31577
Self-heal Daemon on 10.255.195.60
N/A
N/A
Y
31585
NFS Server on 10.255.195.58
2049
0
Y
15965
Self-heal Daemon on 10.255.195.58
N/A
N/A
Y
15973
NFS Server on 10.255.195.59
2049
0
Y
15710
Self-heal Daemon on 10.255.195.59
N/A
N/A
Y
15718
Task Status of Volume pg_volume
-----------------------------------------------------------------------------There are no active volume tasks
Volume t_volume is not started
[root@node-01 inamoto]# gluster peer status
Number of Peers: 3
Hostname: 10.255.195.58
Uuid: 2bd9632d-f502-4f54-8f3e-1bd36fc20e4f
State: Peer in Cluster (Connected)
Hostname: 10.255.195.59
Uuid: a8e0d916-7983-41db-aab8-a0f7321a9f45
State: Peer in Cluster (Connected)
Hostname: 10.255.195.60
Uuid: e6df1c93-6f37-4bce-a748-39d2af7ce2cf
State: Peer in Cluster (Connected)

マウント先ノードの NIC 障害
分散ストレージクラスタのマウント先ノードで NIC 障害が発生した場合、nfs client の時
は pg_bench が待ち状態になることを観測した。glusterfs client の時は pg_bench が待ち状
態になる場合と、正常終了する場合の 2 パターン観測した。復旧方法は、どの場合も障害
ノードで glusterd プロセスの再起動によって復旧する
分散ストレージクラスタのマウント先ノードが NIC 障害の場合、nfs client の時、
pg_bench が応答待ちの状態になってしまい、pg_bench を止めなければ障害復旧できない
状態になった。pg_bench を止めなければ、gluster サーバの各ノードが互いに認識してく
れないため、pg_bench の読み書きの停止は必須である。glusterfs client の時は、pg_bench
が正常終了する場合と pg_bench が待ち状態になる 2 パターンを確認した。
復旧方法はどちらの場合も、障害ノードの glusterd プロセスの再起動を行うことで復旧
する。
しかし、
ここでの glusterd の再起動は systemctl restart では復旧せず、
systemctl stop
と systemctl start を順番に実行することが必要である。
障害発生後、起こる現象が 2 パターン発生した。これは、内部的には分散ストレージク
ラスタ内の 3 台のうちの、どれか 1 台に書き込みを行っていた可能性があると考える。例
えば、マウント先ノードに書き込んでいた場合は pg_bench が待ち状態になり、マウント先
ノードではないところに書き込んでいた場合は正常終了した可能性がある。

全ノード NIC 障害
全ノード NIC 障害の場合、すべてのノードからクラスタを認識できなくなり、pg_bench
は異常終了し、PostgreSQL も異常停止した。復旧方法は、すべての障害ノードで NIC を
回復し、glusterd プロセスの再起動を行う。その後、PostgreSQL を再起動することで復旧
した。
全ノードで NIC 障害が発生すると、すべての障害ノードはクラスタを組んでいる、他ノ
ードを認識できなくなり。pg_bench は障害発生時に I/O エラーを出して、PostgreSQL は
異常終了していた。
すべての障害ノードで NIC を復旧した時、各ノードは互いに認識しているが、Volume
への接続はできていないという状態になった。その後、glusterd プロセスを systemctl stop
と systemctl start で再起動を行うことで、各ノードがクラスタ内の他ノードを認識した。
分散ストレージ側の復旧が終了したら、PostgreSQL を再び起動することで復旧は完了した。

全ノード正常 shutdown
分散ストレージの全ノードを正常 shutdown した時、
全ノード NIC 障害の場合と同様に、
すべてのノードからクラスタを認識できなくなり、pg_bench は異常終了し、PostgreSQL
も異常停止した。復旧も、全ノード NIC 障害の場合と同様の手順で行った。

1 ノード異常終了
1 ノード異常終了の場合、1 ノード NIC 障害と同様に、glusterfs client、nfs client のど
ちらでも、クラスタは障害ノードが認識できなくなるが、実行中の pg_bench は正常終了し
た。障害発生ノードの電源をいれて、glusterd プロセスを起動することで復旧する。
9.3.3. Ceph

1 ノード NIC 障害
1 ノード NIC 障害の場合、ceph クラスタは WARN 状態になったが、pg_bench は正常終
了した。障害発生ノードの NIC を回復するだけで復旧した。
ceph health コマンドで出てくる、ceph の状態が NIC を止めると WARN 状態になる。
これはデフォルトの設定で Monitor と OSD がそれぞれ 3 台以上なければ異常となる設定だ
からである。ceph_health が WARN でも pg_bench は正常に終了した。
pg_bench 終了後、障害ノードの NIC を回復すると、クラスタに認識されデータの同期
が始まり、データ同期が終了すると WARN 状態が解消され復旧が完了した。
今回の検証では CephFS、RBD のどちらでも同様の結果になった。

マウント先ノードの NIC 障害
CephFS マウントの場合、マウントポイントが存在するため、マウント先ノードの NIC
障害を検証した。今回の障害でも、1 ノード NIC 障害と同様に、ceph クラスタは WARN
状態になったが、pg_bench は正常終了した。1 ノード NIC 障害と同様の方法で復旧した。
マウントポイントの NIC を落としても正常に終了した理由としては、Monitor プロセス
を複数ノードで冗長化しているためと考える。

全ノード NIC 障害
全ノード NIC 障害の場合 CephFS、CephRBD のどちらでも、pg_bench が待ち状態にな
った。障害ノードの NIC をすべて回復することで復旧した。
全ノードの NIC を止めると、pg_bench が待ち状態になった。pg_bench の実行は 180 秒
に設定していたが、10 分以上たっても待ち状態のまま、pg_bench は終了されなかった。
pg_bench の待ち状態が続いている間に、全ノードの NIC を回復すると pg_bench の待ち
状態が治ることを確認した。I/O エラーで pg_bench が異常終了という動きはなかった。
ここで、pg_bench を実行時間ではなく、総実行トランザクション数を指定して、同様の障
害を発生させると、障害発生時に同様の待ちが発生した。その後、全ノードの NIC を復旧
すると、復旧してすぐに残りのトランザクションが途中から実行され、指定したトランザ
クション数の実行が完了したことを確認した。
NIC 障害は、NIC を回復するだけで復旧が可能だった。これは、各ノードに Monitor ノ
ードがあるため、Monitor 間で一貫性を保持するアルゴリズムが動作しているためと考える。
今回の検証では CephFS、RBD のどちらでも同様の結果になった。

全ノード正常 shutdown
全ノードを正常シャットダウンすると、CephFS、CephRBD のどちらでも、pg_bench
が待ち状態になった。復旧方法としては、Ceph に関連する、全てのプロセスを全てのノー
ドで再起動を行うことで復旧した。
全ノードを正常シャットダウンすると、全ノード NIC 障害と同様に pg_bench が待ち状
態になった。
全ノードの電源を再び起動しても復旧せず、すべてのノードの osd が down していた。
さらに、データのリカバリが 66%で止まってしまい、待つだけでは復旧できなかった。警
告メッセージとして、障害ノードの Monitor の時刻に差異がある、というものが出ていた
め、ntpd の restart を行ったが治らなかった。最後に Ceph の Monitor プロセスを再起動
することで、
データのリカバリが終わり、
osd の状態が up になった。
今回の検証では CephFS、
RBD のどちらでも同様の結果になった。

1 ノード異常終了
1 ノード異常終了の場合、1 ノード NIC 障害と同様に、Ceph クラスタは WARN 状態に
なったが、pg_bench は正常終了した。復旧方法としては、Ceph に関連する、全てのプロ
セスを全てのノードで再起動を行うことで復旧した。
1 ノードを強制終了後、再び電源を入れると障害ノードの osd の状態は up になるが、
ceph_health は WARN になり「障害ノードの Monitor の時刻に差異がある」
、という警告
メッセージを出していた。この警告メッセージは全ノード正常 shutdown と同様のメッセ
ージであるため、Ceph のプロセスを再起動することで治る。今回の検証では CephFS、RBD
のどちらでも同様の結果になった。
9.3.4. 3 つのストレージを比較した考察
今回の検証では、1 ノード障害の時は PostgreSQL の停止は起こらず、データの破損等は
確認されなかった。また、全ノード障害では、障害発生直前までのデータは DB に格納さ
れていることを確認した。ここから、今回の障害パターンでの耐障害性は DRBD9、
GlusterFS、Ceph ともに高いと考える。
障害復旧に関しては DRBD9、GlusterFS、Ceph どの場合でも、プロセスの再起動で障
害から復旧することを確認した。
9.4. 性能検証
今回の性能検証では、分散ストレージに対してリアルタイムに 1MB~数 GB 程度のファ
イルが読み書きされるファイルサーバとして使用する場合と、分散ストレージ上で
PostgreSQL を動かしたした場合を考える。
計測は、DRBD9、GlusterFS(Replicated モード)、CephRBD、CephFS の 4 種類の分散
ストレージと local-disk の計 5 種類を対象とする。CephFS は Stable では無い(2015 年 12
月現在)ため、ベストなパフォーマンスでは無いが参考値として記載する。
9.4.1. ファイルの Read / Write 性能
DRBD9、GlusterFS、Ceph の 3 つについて、ファイルの Read / Write 性能を実データの
位置の違い、クラスタの台数拡張、非同期アクセス数の 3 つの観点で性能変化を計測した。
9.4.1.1. 実データの位置の違いによる性能変化
本番環境を含めて分散ストレージクラスタを構築している場合と、分散ストレージが完
全に本番環境と分離している場合の性能変化について比較検証を行う。
読み書きを行う単一ファイルのファイルサイズは 1GB と 10GB の 2 パターンとする。今
回の検証では、以下の表のように読み書き方法を設定して計測を行った。
テスト名
ファイルサイズ
アクセス方法
seq_w_1GB
1 GB
sequential write
seq_w_10GB
10 GB
sequential write
seq_r_1GB
1 GB
sequential read
seq_r_10GB
10 GB
sequential read
rand_w_1GB
1 GB
random write
rand_w_10GB
10 GB
random write
rand_r_1GB
1 GB
random read
rand_r_10GB
10 GB
random read

DRBD9
ストレージクラスタ内からのデータアクセスの方が、性能はよい。さらに、local-disk と
比較しても、性能低下が小さいことがわかる。
(IOPS)
35000
DRBD9_out_cluster
30000
DRBD9_in_cluster
25000
local_disk
20000
15000
10000
5000
0
図 11 DRBD9:クラスタ内のデータ位置による性能の違い
(IOPS)
DRBD9_out_cluster
DRBD9_in_cluster
local_disk
seq_w_1GB
9326
12991
13945
seq_w_10GB
9353
13025
13940
seq_r_1GB
22225
27923
29799
seq_r_10GB
21011
29823
29804
rand_w_1GB
7124
8772
13954
rand_w_10GB
5731
6238
7524
rand_r_1GB
22569
27094
29836
rand_r_10GB
21480
28331
29853

GlusterFS
sequential write の性能がストレージクラスタ内からのアクセスの時、
local-disk の write
性能を超えている。sequential read、random write でストレージクラスタ外からのデータ
アクセスが、クラスタ内からのデータアクセス性能に若干勝っている。
(IOPS)
Gluster:gluster_out_cluster
35000
Gluster:gluster_in_cluster
local_disk
30000
25000
20000
15000
10000
5000
0
図 12 GlusterFS:クラスタ内のデータ位置による性能の違い
(IOPS)
Gluster:gluster_out_cluster
Gluster:gluster_in_cluster
local_disk
seq_w_1GB
9558
14325
13945
seq_w_10GB
9560
13697
13940
seq_r_1GB
2436
1922
29799
seq_r_10GB
2464
1906
29804
rand_w_1GB
3987
4299
13954
rand_w_10GB
4071
3849
7524
rand_r_1GB
899
2572
29836
rand_r_10GB
885
2628
29853

Ceph RBD
ストレージクラスタ内からのデータアクセスの方が、性能はよい。
(IOPS)
35000
Ceph:RBD_out_cluster
Ceph:RBD_in_cluster
30000
local_disk
25000
20000
15000
10000
5000
0
図 13 Ceph RBD:クラスタ内のデータ位置による性能の違い
(IOPS)
Ceph:RBD_out_cluster
Ceph:RBD_in_cluster
local_disk
seq_w_1GB
1616
1660
13945
seq_w_10GB
1615
1664
13940
seq_r_1GB
6774
7020
29799
seq_r_10GB
6690
7276
29804
rand_w_1GB
3487
3450
13954
rand_w_10GB
2680
2662
7524
rand_r_1GB
14581
16079
29836
rand_r_10GB
14382
16822
29853

CephFS
参考値として計測したが、良い結果を得ることはできなかった。
(IOPS)
35000
Ceph:ceph_out_cluster
Ceph:ceph_in_cluster
30000
local_disk
25000
20000
15000
10000
5000
0
図 14 CephFS:クラスタ内のデータ位置による性能の違い
(IOPS)
Ceph:FS_out_cluster
Ceph:FS_in_cluster
local_disk
seq_w_1GB
342
362
13945
seq_w_10GB
337
353
13940
seq_r_1GB
1284
1502
29799
seq_r_10GB
1272
1547
29804
rand_w_1GB
329
345
13954
rand_w_10GB
302
313
7524
rand_r_1GB
1075
1319
29836
rand_r_10GB
983
1187
29853

考察
DRBD9 の実データがクラスタ内にある場合は、local-disk と比べてデータアクセス性能
の差はほぼないという結果だった。これは、Read/Write 共にクラスタ内にある場合は、一
番近いローカルにあるデータに Read/Write を行ったためではないかと思われる。また、実
データがクラスタ外にある場合もデータアクセス性能の低下は、クラスタ内にある場合と
比べて 2~3 割程度の低下にとどまっていた。ここから、DRBD9 は性能面からいうと実デ
ータがクラスタ内外どちらにあっても local-disk の代替を十分に果たせると考える。
GlusterFS は、今回の検証では、いくつかの検証項目で実データがクラスタ内にある場
合よりも、クラスタ外にある場合の方が、性能は良いという結果を得た。しかし、差は若
干なので計測時の誤差である可能性が高い。また、今回の検証環境では、GlusterFS は
sequential write 以外は良い結果を得ることができなかった。これは、Replication モード
のみを利用しているため、同期処理に時間がかかったためではないかと考える。
Ceph は、実データがクラスタ内外にある場合の差が少なかったが、やはり、クラスタ内
に実データがある場合の方が、アクセス性能は良かった。しかし、この差も誤差である可
能性が高い。write 時の性能が低い原因としては、データの分散配置を行っているためでは
ないかと考える。
9.4.1.2. 台数拡張による性能変化
分散ストレージクラスタを構成する、ノード数が拡張された時の性能変化を計測した。
台数拡張とともに、Read/Write するファイルサイズを変えた時の性能変化も計測した。

Sequential write の時
台数拡張による sequential write の計測結果が以下のグラフである。
すべてのソフトウェアについて、台数拡張を行うことで性能の低下を計測した。
(IOPS)
12000
16MB
5120MB
512MB
10240MB
1024MB
10000
8000
6000
4000
2000
0
3
4
5
3
DRBD9
4
5
3
GlusterFS
4
5
3
4
CephRBD
5
(台数)
Cephfs
図 15 台数拡張による性能変化:Sequential write
(IOPS)
file size
16MB
512MB
1024MB
5120MB
10240MB
台数
DRBD9
GlusterFS
CephRBD
Cephfs
3
9309
9321
9326
9345
9353
4
7025
7043
7039
7040
7041
5
5610
5627
5625
5626
5617
3
9309
9554
9558
9561
9560
4
7062
7168
7170
7166
7171
5
5680
5734
5736
5734
5728
3
1605
1621
1616
1612
1615
4
1622
1608
1596
1614
1608
5
1529
1585
1576
1586
1565
3
344
342
342
343
337
4
337
341
341
342
337
5
348
348
351
349
346

Sequential read の時
台数拡張による sequential read の計測結果が以下のグラフである。
DRBD9 が若干だが台数拡張による性能向上が見られた。
(IOPS)
30000
16MB
512MB
1024MB
5120MB
10240MB
25000
20000
15000
10000
5000
0
3
4
5
3
DRBD9
4
5
3
GlusterFS
4
5
3
4
CephRBD
5
(台数)
Cephfs
図 16 台数拡張による性能変化:Sequential read
(IOPS)
file size
16MB
512MB
1024MB
5120MB
10240MB
台数
DRBD9
GlusterFS
CephRBD
Cephfs
3
19320
22378
22225
22160
21011
4
21787
25075
25148
25227
24901
5
22382
23848
23100
23933
24628
3
2420
2412
2436
2476
2464
4
2368
2543
2553
2530
2560
5
2435
2458
2478
2588
2660
3
6511
6662
6774
6692
6690
4
6491
6578
6618
6743
6749
5
6390
6198
6165
6192
6298
3
1303
1285
1284
1284
1272
4
1284
1246
1252
1262
1277
5
1263
1294
1298
1300
1285

Random write の時
台数拡張による random write の計測結果が以下のグラフである。Ceph_RBD と、若干
だが Cephfs の 2 つが台数拡張による、性能向上を計測した。これは、Ceph の Replication
数が 3 台から変化していないためである。
(IOPS)
10000
9000
16MB
512MB
5120MB
10240MB
1024MB
8000
7000
6000
5000
4000
3000
2000
1000
0
3
4
5
3
DRBD9
4
5
3
GlusterFS
4
5
3
CephRBD
4
5
(台数)
Cephfs
図 17 台数拡張による性能変化:Random write
(IOPS)
file size
16MB
512MB
1024MB
5120MB
10240MB
台数
DRBD9
GlusterFS
CephRBD
Cephfs
3
9330
7433
7124
6466
5731
4
7001
6227
6153
5714
5028
5
5610
5395
5318
4970
4393
3
3923
4150
3987
4151
4071
4
3424
3907
3565
3702
3538
5
3747
3174
3279
3195
3433
3
2888
3613
3487
3078
2680
4
3126
4165
4042
3520
3158
5
3093
4408
4277
3823
3439
3
330
331
329
313
302
4
340
323
324
301
291
5
342
321
319
306
294

Random read の時
台数拡張による random read の計測結果が以下のグラフである。
GlusterFS 以外は台数拡張による若干の性能向上を確認できた。
(IOPS)
30000
16MB
5120MB
512MB
10240MB
1024MB
25000
20000
15000
10000
5000
0
3
4
5
3
DRBD9
4
5
3
GlusterFS
4
5
3
CephRBD
4
5
(台数)
Cephfs
図 18 台数拡張による性能変化:Random read
(IOPS)
file size
16MB
512MB
1024MB
5120MB
10240MB
台数
DRBD9
GlusterFS
CephRBD
Cephfs
3
21787
21309
22569
21632
21480
4
22021
25352
24403
24614
24639
5
22260
24814
24742
24750
24233
3
1469
940
899
898
885
4
1395
938
881
893
890
5
1479
931
904
894
890
3
11221
14220
14581
14405
14382
4
11941
16381
15076
15937
16041
5
10893
16147
16957
16673
16768
3
1129
1118
1075
992
983
4
1158
1143
1083
1007
995
5
1221
1187
1138
1041
1025

考察
DRBD9 と GlusterFS の二つは、台数拡張に伴って Replication 数を増やした。この
2 つのソフトウェアは、Sequential, Random ともに write 時の性能が低下している。
これは、クラスタ内のノード増加により、ネットワークを介して、他ノードに送信す
るデータ量が増えたため発生したのではないかと考える。ネットワークがボトルネッ
クになっている場合の、性能低下を予防する方法として、ネットワーク帯域をより広
いものにすることが考えられる。もしくは、ファイルの read が頻繁に起こり、write
処理は少ないユースケースならば、local-disk と比較した時の性能低下の影響を最小限
に抑えて利用することができると考える。
CephRBD と、CephFS は台数拡張によって、write の性能も向上している。これは、
Ceph の Replication 数が 3 台から変化していないため、ネットワークのボトルネック
を最小限にできたためではないかと思われる。
DRBD9 は、台数拡張に伴って Read 性能が向上している。これは、DRBD9 は分散
読み込み機能があるためではないかと思われる。このため、より大規模なクラスタを
用いて比較検証する必要がある。
9.4.1.3. 非同期並列数による性能変化
非同期並列アクセス数を変更した時の計測結果を示す。今回の検証では、以下の表のよう
に読み書き方法を設定して計測を行った。
テスト名
rand
非同期並列アクセス数
1
rand-QD16
16
rand-QD32
32
今回の計測では IOPS ではなく平均帯域幅(KB/second)で比較を行った。

Write の時
非同期並列数が増加することで、CephRBD、DRBD の書き込み性能の向上を計測できた。
local-disk と Gluster nfs は非同期数が 1 から 16 に増加した時に、大幅な性能向上を計測
した。しかし、非同期並列数が 16 から 32 に増加した時の性能変化は計測されていない。
平均帯域幅(KB/s)
60000
DRBD9_in
Gluster_in
Gluster_nfs
CephRBD_out
Cephfs_out
50000
DRBD9_out
Gluster_out
CephRBD_in
Cephfs_in
local
40000
30000
20000
10000
0
rand
rand-QD16
rand-QD32
非同期並列書き込み数
図 19 非同期並列書き込み数による違い
(KB/sec)
DRBD9_in
rand
DRBD9_out
Gluster_in
Gluster_out
Gluster_nfs
4772
5909
18489
16552
2108
rand-QD16
35088
28498
17198
15950
9811
rand-QD32
55305
37148
18419
14693
8084
CephRBD_in
CephRBD_out
1304
1235
1397
1316
13757
rand-QD16
13800
13949
1381
1372
55820
rand-QD32
15624
15837
1398
1324
55740
rand
Cephfs_in
Cephfs_out
local

Read の時
Write の時とほぼ同様の傾向が計測された。
平均帯域幅(KB/s)
140000
120000
DRBD9_in
Gluster_in
Gluster_nfs
CephRBD_out
DRBD9_out
Gluster_out
CephRBD_in
Cephfs_in
100000
80000
60000
40000
20000
0
rand
rand-QD16
rand-QD32
非同期並列読み込み数
図 20 非同期読み込み数による違い
(KB/sec)
DRBD9_in
rand
DRBD9_out
Gluster_in
Gluster_out
Gluster_nfs
14244
5777
3501
1833
5289
rand-QD16
108380
90278
10288
3597
47817
rand-QD32
111267
112207
10478
3563
46960
CephRBD_in
CephRBD_out
5126
4411
5184
4487
17403
rand-QD16
64318
58326
5278
4301
119346
rand-QD32
68732
64267
5240
4330
114736
rand
Cephfs_in
Cephfs_out
local

考察
非同期読み書き数が 16 から 32 に変わった時、全体的に読み書き性能の変化が少な
かった。これは、非同期数 16 の時点で、帯域幅がほぼ最大になっていたためだと考え
られる。
非同期アクセス数を増やすことで、DRBD9 と CephRBD は性能の大幅な向上を確認
できた。このため、DRBD9 と CephRBD は非同期アクセスによって、データアクセス
の待ち時間を短くできるユースケースでの利用が向いていると考える。
GlusterFS と CephFS は非同期並列アクセス数を増やすことによる性能向上を観測
できなかった。理由として、どちらもファイルシステムを提供しているためではない
かと思うが、原因はわからない。
9.4.2. 分散ストレージ上の PostgreSQL
DRBD9、GlusterFS、Ceph の 3 つについて、PostgreSQL の 3 分間の実行トランザクショ
ン総数とクラスタの台数拡張に伴う性能変化について検証した。
9.4.2.1. 実行トランザクション総数
3 分間に実行されるトランザクション数について、セッション数を変えた時の結果が以下
のグラフである。
DRBD9 以外はセッション数の増加に伴って性能が向上している。
2500000
3
分
間
の
実
行
ト
ラ
ン
ザ
ク
シ
ョ
ン
総
数
2000000
1500000
1000000
500000
local
Gluster_in
CephRBD_in
Cephfs_out
0
0
10
20
30
DRBD9_in
Gluster_out
CephRBD_out
40
50
60
DRBD9_out
Gluster_nfs
Cephfs_in
70
80
90
100
セッション数
図 21 実行トランザクション数
(3 分間の実行トランザクション総数)
1
5
10
50
100
local
164163
613604
991992
2054566
2040401
DRBD9_in
125235
528134
978573
2044045
1803509
DRBD9_out
118039
500402
890742
1939256
1718944
Gluster_in
47774
140840
278130
916395
1063770
Gluster_out
44914
128199
259101
908733
1103260
Gluster_nfs
64076
221284
425832
1570102
1734222
CephRBD_in
48715
160032
314196
1222669
1304450
CephRBD_out
46681
147292
284975
1184476
1485733
Cephfs_in
49116
161193
319099
1199787
1299788
Cephfs_out
47183
146884
283900
1176312
1456148

考察
DRBD9 のみ性能の低下がセッション数 50 と 100 の間で計測された。このため、DRBD9
は並列数にピークが存在する可能性があると考えた。
試しにセッション数を 10 単位で再計測を行った。結果、セッション数 40 がピークで、セ
ッション数 50 以上では少しずつ性能低下していることがわかった。さらに細かく調べてみ
ると、今回の検証環境ではセッション数 45 か 46 が DRBD9 のピークであることがわかっ
た。DRBD9 は PostgreSQL と組み合わせる場合、性能低下を避けるためにセッション数の
制限を設けるなどの対策が必要になると考える。
2500000
最大
トランザクション数
2000000
1500000
1000000
500000
0
1
10
20
30
40
50
60
70
80
90
100
(セッション数)
図 22 DRBD9:セッション数のピーク
Ceph と GlusterFS については、100 セッションでもピークを観測できなかったが、セッ
ション数 50 から 100 の間の変化量が少ないため、セッション数 100 以上からは、一定値に
収束して性能増加が伸び悩むのではないかと考える。
Ceph は、CephRBD、CephFS のどちらでも、ファイルの Read/Write 性能の時よりも、
local-disk と比べた場合の性能低下の割合が低い。これは、Ceph への Read/Write は、今
回の検証で使用したデフォルトの設定との相性が良かったためかもしれない。
9.4.2.2. 台数拡張による実行トランザクション総数の変化
3 分間に実行されるトランザクション数について、クラスタの台数を拡張した時の結果が
以下のグラフである。Ceph 以外は台数拡張によって性能低下している。
(3分間の実行総トランザクション数)
2500000
1
5
10
3
4
50
100
2000000
1500000
1000000
500000
0
3
4
5
DRBD9
3
4
GlusterFS
5
3
4
5
GlusterFS_nfs
5
3
CephRBD
4
5
(台数)
Cephfs
図 23 台数拡張による実行トランザクション数の違い
(3 分間の実行トランザクション総数)
1
5
10
50
100
3
118039
512272
890742
1939256
1718944
4
107414
455242
785683
1705162
1546984
5
99987
463820
770196
1704952
1556573
3
44914
128199
259101
908733
1103260
4
42211
116041
225097
819789
1018370
5
41917
107002
207418
746991
950170
3
64076
221284
425832
1570102
1734222
4
30804
90643
178675
835060
1089143
5
29378
86014
166562
775024
1031081
3
46681
147292
284975
1184476
1485733
4
46263
145082
280444
1169416
1470150
5
46936
147321
287854
1199648
1500692
3
47183
146884
283900
1176312
1304450
4
46320
145111
281027
1171365
1463925
5
47652
149301
286441
1199047
1499378
セッション数
台数
DRBD9
GlusterFS
GlusterFS_nfs
CephRBD
Cephfs

考察
DRBD9 と GlusterFS の二つは、ノード数増加によって性能が低下している。ノード数
増加による性能低下の原因は、ファイルの読み書きと同じ原因で、クラスタ内のノード増
加により、ネットワークを介した他ノードに送信するデータ量が増えたためと考えられる。
クラスタを構成する台数が増えても、DRBD9 についてはセッション数 50 から 100 に増
加すると性能が低下しているため、セッション数のピーク値に変化はないのではないかと
思われる。
PostgreSQL 動かすにあたって、DRBD9 は台数拡張を行っても、分散 Read による性能
向上が今回の検証では確認できなかった。ここから、DRBD9 上で PostgreSQL を使う場合
は、想定するトランザクションの処理数と Replication 数のバランスを考えて組み合わせる
必要があると思われる。今回は 5 台までしか拡張していないが、台数をさらに拡張すれば
性能が上がり始める可能性があるかもしれない。
GlusterFS は今回の検証環境では read 性能がボトルネックとなって、性能の向上が伸び
悩んだのではないかと思われる。しかし、セッション数が 100 以上の時は DRBD9 以上の
実行トランザクション数だったため 、セッション数が 100 以上と多い場合には、GlusterFS
上で PostgreSQL を動かす組み合わせが、DRBD9 よりもいいのかもしれない。
9.4.3. 性能検証全体の考察
繰り返しになるが、今回の検証ではすべてのソフトウェアについて、処理性能にかかわ
るパラメータはすべてデフォルト値で行った。
そのうえで 3 者を見比べると、DRBD9 は各種パラメータのチューニングを行わなくても、
ファイルの Read Write、実行トランザクション数共に local-disk に迫る性能を出している
ことがわかる。これは、DRBD8 でも高速であった Replication の性能が、複数台の
Replication になった DRBD9 でも有効に働いているためだと思われる。ここから、
local-disk への読み書きとの性能差を極力なくしたい場合には、DRBD9 を使用することが、
有効だと思われる。しかし、複数ノードからの読み込み書き込みがない場合に限る。
GlusterFS は、sequential write の性能が local-disk の書き込みとほぼ同程度の性能であ
る。しかし、read に関しては、今回の環境では local-disk と比べると 1 割程度の read 性能
だった。このため、GlusterFS は sequential write がよく使用され、読み込みよりも書き
込みの方がよく行われるサービスに向いていると考える。また、ボリュームタイプが問題
であるとも考えた。今回使用した Replicated モードでは、データの分散読み込み機能がな
く、分散読み込みを行うには、Distributed モードなどの、別のボリュームタイプを組み合
わせて使用する必要があるのではないかと考える。
Ceph はファイルの Read/Write を行う場合よりも、PostgreSQL と組み合わせて使用し
た方が、local-disk と比較した場合の性能低下の割合が低かった。PostgreSQL のセッショ
ン数の増加と非同期アクセス数の増加傾向を見ると、Ceph は並列度を上げると local-disk
の性能に近づくことがわかった。今回の結果から、Ceph はデータアクセスの並列数が多い
ユースケースで使用することで、性能を限界まで発揮できるのではないかと考える。
10. まとめ
Immutable Infrastructure を実現した運用に分散ストレージを用いて、データと実行環
境の分離を行った場合の検証を行った。結果として、同時書き込みの必要性・可能性がな
いデータでなければ、Immutable Infrastructure を実現した運用が可能であると考えられ
る。GlusterFS、Ceph は同時書き込みや読み込みを行うことが可能であるが、今回の検証
で使用した PostgreSQL は複数ノードからの同時書き込みを行うことができないため、本
番環境の切り替え時に、PostgreSQL を止めてから分散ストレージを付け替えるという制約
が必要であるとわかった。Immutable Infrastructure を実現した運用で分散ストレージを
用いる場合は、分離するデータとしては設定ファイルなどの static なデータや、web サー
ビスでユーザがアップロードしたデータなどの同時書き込みが発生しないデータであれば
有用な使い方が可能であると考えられる。また、DRBD9 は複数ノードからの 1 ボリューム
へのアクセスが許可されていない。このため、今回の PostgreSQL ではない場合でも、同
時マウントができず、サービス停止時間が環境切り替え時にどうしても発生してしまうの
で、Immutable Infrastructure を実現した運用は現時点ではサービス停止無しでは難しい
という結論が出た。
今回使用した各製品を比較すると、DRBD9 は複数ノードから 1 ボリュームに、同時にマ
ウントできない点がネックであると感じた。複数ノードから同時にデータの Read を行うこ
とができれば、待機しているノードが運用中の本番データを用いて、読み込みを行う、と
いう限定的ではあるが動作確認を行うことが可能となり、分散ストレージ上のデータをよ
り柔軟に扱うことが可能になると考える。DRBD9.1 では Dual Primary の機能が安定板と
して実装予定されているので、Immutable Infrastructure を実現した運用にも使えるよう
になるかもしれない。ファイルの Read/Write やトランザクション実行などの性能はデフォ
ルトの設定でも、他の分散ストレージを凌ぎ、local-disk への Read/Write に迫る勢いであ
るので、本番環境の停止が許容されるような運用であれば、データの Read/Write 性能は従
来の local-disk とほぼ変わらずに使用できると考える。
GlusterFS は複数ノードからのデータ書き込みに制約を持たせる必要があると感じた。
GlusterFS は複数ノードからの同時書き込みが、警告は出るが書き込めてしまい、正しく
反映されないという問題がある。このため、複数ノードから書き込みを行う時は同時に行
わない、書き込みは 1 ノードだけに限定する、本番環境からできるデータ操作は Read のみ
を行う、といったデータ操作に制約を持たせることが必要であると考える。Read/Write 性
能に関しては、デフォルト設定では Read 性能が低かったが、fio のブロックサイズ等のチ
ューニングを行うことで Read 性能の向上を確認した。実際に使う場合にはブロックサイズ
等のチューニングを行うことで Read 性能を引き上げることが必要であると考える。今回行
わなかったが、GlusterFS ほかのボリュームグループでの検証も必要であると考える。
Ceph は、同時書き込みを行う場合、CephFS と RBD で違う結果を得た。CephFS の場
合は、複数ノードから同じファイルを開こうとすると、ファイルを開く操作が遅かった方
は Read Only になる。RBD の場合だと、同時書き込みを行うことが可能だが、最終的には
更新した内容はどちらか片方の更新しか反映されていない。このため、複数ノードから使
用する場合は CephFS を利用するのが安全であると考える。
性能面では、デフォルトの設定で、今回の検証で Read/Write 性能が全体的に local-disk
に比べて読み書き性能が低いという問題があると感じた。Ceph RBD は GlusterFS と同等
な Write 性能を出すことができているため、それほど高いスループットが要求されない分
野ならば使用できると考える。Ceph のいい点としては、データの再配置を自動で行うこと
が可能である点、ブロックデバイスとファイルシステムという 2 種類のデータアクセス方
法を用意している点があげられる。CephFS はチューニングを行った場合でもあまり良い性
能を出すことができていなかった。今回の検証の時点では、CephFS はまだ安定版ではない
ので、2016 年にリリース予定の安定版に期待である。