共有ファイルシステムを使いたいというのはとてもよくあるご要望です。共有ファイルシステムは複数アプリケーションが同一のデータにアクセスできるようにしてくれます。また、たとえば複数ユーザーが同時に同一の情報にアクセスする、といったことも可能になります。オンプレミスでは、複数コネクションをサポートするNASやSANデバイスがあれば共有ファイルシステムを使うことができますが、クラウドではどうしたらいいのでしょうか?
iSCSI、NFS、SMBやDRBDといったテクノロジーを用いることで、ブロックデバイスをふたつあるいはそれ以上のクラウドインスタンスで共有することができます。こうしたサービスで複数ユーザーがRead/Writeオペレーションを同時に行うことができるようにするには、Oracle Cluster File System Version 2(OCFS2)やGlusterFSといったクラスターファイルシステムサービスをセットアップする前にいくつか追加の設定をしておくことが必要になります。
Oracle Cloud Infrastructure Block Volumeに新たに追加された
複数インスタンスアタッチの共有ボリュームオプションでは、こうした共有サービスのセットアップは必要ありません。このオプションを用いると単一のブロックボリュームを複数のコンピュートインスタンスにアタッチでき、それらのインスタンスから同一のデータに並列でRead/Writeアクセスをできるようになります。
ブロックボリュームをすべてのインスタンスにアタッチしたら、次のステップはクラスターアウェアな(共有)ファイルシステムを使うことです。このポストではOCSF2を新しい複数インスタンスアタッチのオプションで用いる手順を説明していきます。
アーキテクチャ
以下の図で示しているのが、複数インスタンスにアタッチして共有されたRead/Writeのブロックボリュームのアーキテクチャです。
なんでOCFS2?
OCFS2はクラスター内でストレージのパフォーマンスおよび可用性を向上するために使用することを想定された、汎用用途の共有ディスク・ファイルシステムです。OCFS2はローカルファイルシステム・セマンティクスを提供しているため、ほとんどすべてのアプリケーションで使うことができます。クラスターアウェアなアプリケーションでは、複数クラスターノードからのキャッシュ・コヒーレントなパラレルI/Oを使用してクラスター内のアクティビティを調整することができます。あるいは、あるノードがダウンしたときに、アベイラブル・ファイルシステム機能を使って別のノードにフェイルオーバすることもできます。
OCFS2にはエンタープライズレベルの処理環境でのデプロイメントに適した、多くの機能が備わっています:
- 順序付けされたWrite-Backデータジャーナルログにより、電源障害やシステムクラッシュなどの障害時にファイルシステムの整合性を保護
- 512 byteから4KBまでのブロックサイズに対応し、ファイルシステムのクラスターサイズは4KBから1MBに対応。クラスターサイズが4KBのときにサポートされる最大ボリュームサイズは16TB。クラスターサイズが1MBのときには理論上はボリュームサイズは4PBが可能ですが、テストされていません。
- 非常に大きなファイルの効率的な格納のためのExtent-basedアロケーション
- 疎なファイル、インラインデータ、未書き込み領域、ホールパンチング、reflink、アロケーション予約といった高性能、高効率なストレージのためのアロケーション最適化のサポート
- 非常に多数のオブジェクトが格納されていたとしてもディレクトリに効率的にアクセス可能にするためのディレクトリ・インデックシング
- 破損したinodeとディレクトリを検知するためのメタデータ・チェックサム
- 通常ファイル、ディレクトリ、シンボリックリンクなどのファイルシステムオブジェクトに数の制限なしにname/valueペアを付与するための拡張アトリビュート
- トラディショナルなファイルーアクセスパーミッションモデルに加え、POSIX ACLおよびSELinuxへの拡張されたセキュリティサポート
- ユーザーおよびグループQuotaのサポート
- 32bitと64bit、リトルエンディアン(x86,x86_64,ia64)とビッグエンディアン(ppc64)アーキテクチャの異種混合ノードから成るクラスターのサポート
- クラスターノードからの並列アクセスを管理する分散ロックマネージャ(DLM)を備えた容易に設定できるin-kernelのクラスタースタック(O2CB)
- バッファ、ダイレクト、非同期、スプライスおよびmemory-mapped I/Oのサポート
- ext3ファイルシステムと同様のパラメータを用いるツールセット
はじめてみよう
前述のアーキテクチャのために、大枠では以下の設定ステップが必要になります:
- Oracle Cloud Infrastructure Block Volumeを複数インスタンスにアタッチ
- OCFS2/O2CBクラスターノードをセットアップ
- OCFS2ファイルシステムとマウントポイントの作成
ポート
設定作業を開始する前に、利用するVirtual Cloud Network(VCN)のセキュリティリストの7777番と3260番のポートを開放しておく必要があります。Oracle Cloud Infrastructureのコンソールで、VCNセキュリティリストを編集して以下のステップのうちいずれかひとつを実行してください。
インターナルサブネットCIDR(172.0.0.0/16 - 非パブリックネットワーク)のすべてのプロトコルをオープン:
Source: 172.0.0.0/16
IP Protocol: All Protocols
Allows: all traffic for all ports
必要なポートだけをオープン。7777と3260:
Source: 172.0.0.0/16
IP Protocol: TCP
Source Port Range: All
Destination Port Range: 7777
Allows: TCP traffic for ports: 7777
Source: 172.0.0.0/16
IP Protocol: TCP
Source Port Range: All
Destination Port Range: 3260
Allows: TCP traffic for ports: 3260
注意:ポート7777と3260はローカルOSファイアウォールでもオープンしておく必要があります。Oracle Linx 7.xでの必要なコマンドは以下の通りです。別のOSを利用している場合はドキュメントを参照して実施してください。
- sudo firewall-cmd --zone=public --permanent --add-port=7777/tcp
- sudo firewall-cmd --zone=public --permanent --add-port=3260/tcp
- sudo firewall-cmd --complete-reload
DNS
さらに、DNSが適切に動作していること、当該コンピュートインスタンスがテナンシーのAvailability Domainをまたいで通信できていることを確認しください。以下は/etc/resolv.conf ファイルの例です。
$ cat /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
search baremetal.oraclevcn.com publicsubnetad1.baremetal.oraclevcn.com publicsubnetad2.baremetal.oraclevcn.com publicsubnetad3.baremetal.oraclevcn.com
nameserver 169.254.169.254
resolv.conf ファイルの中にAvailability Domain DNSエントリすべてが記載されている必要があります。
環境
この環境には以下のコンピュートインスタンスがあります:
Role | Instance | IP Address | OS |
OCFS2 Node1 | node1.publicsubnetad1.baremetal.oraclevcn.com | 172.0.0.41 | Oracle Linux 7.x x86_64 |
OCFS2 Node2 | node2.publicsubnetad2.baremetal.oraclevcn.com | 172.0.1.42 | Oracle Linux 7.x x86_64 |
OCFS2の構成
Cluster Stackの設定ファイルの作成
必要なOCFS2パッケージのインストール:
$ sudo yum install ocfs2-tools-devel ocfs2-tools -y
o2cb コマンドまたはテキストエディタで設定ファイルを作成します。ここでは以下のコマンドでクラスター定義を作成しましょう。このコマンドは /etc/ocfs2/cluster.conf のクラスター設定ファイルを新たに作成します。
$ sudo o2cb add-cluster ociocfs2
それぞれのノードについて、以下のコマンドでノードを定義します:
$ sudo o2cb add-node ociocfs2 node1 --ip 172.0.0.41
$ sudo o2cb add-node ociocfs2 node2 --ip 172.0.1.42
注意:ノード名は/etc/sysconfig/networkで設定されるシステムのHOSTNAMEと同一の値である必要があります。また、IPアドレスはクラスター内でのプライベート通信でそのノードが使うものになります。/etc/ocfs2/cluster.confのクラスター設定ファイルをコピーし、クラスター内のそれぞれのノードに配置しましょう。なお、クラスター設定ファイルに行った更新は、クラスタースタックの再起動まで反映されません。
以下の/etc/ocfs2/cluster.confの設定ファイルでは、2つのノードからなるociocfs2という名前のクラスターを、ローカルハートビート付きで定義しています。このブログポスト内で使っている設定はこれです。
$ sudo cat /etc/ocfs2/cluster.conf
cluster:
heartbeat_mode = local
node_count = 2
name = ociocfs2
node:
number = 0
cluster = ociocfs2
ip_port = 7777
ip_address = 172.0.0.41
name = node1
node:
number = 1
cluster = ociocfs2
ip_port = 7777
ip_address = 172.0.1.42
name = node2
Cluster Stackの設定
クラスターの各ノードで以下のコマンドを実行します。オプションについては
ドキュメントに記載があります。
$ sudo /sbin/o2cb.init configure
Configuring the O2CB driver.
This will configure the on-boot properties of the O2CB driver.
The following questions will determine whether the driver is loaded on
boot. The current values will be shown in brackets ('[]'). Hitting
<ENTER> without typing an answer will keep that current value. Ctrl-C
will abort.
Load O2CB driver on boot (y/n) [y]:
Cluster stack backing O2CB [o2cb]:
Cluster to start on boot (Enter "none" to clear) [ocfs2]: ociocfs2
Specify heartbeat dead threshold (>=7) [31]:
Specify network idle timeout in ms (>=5000) [30000]:
Specify network keepalive delay in ms (>=1000) [2000]:
Specify network reconnect delay in ms (>=2000) [2000]:
Writing O2CB configuration: OK
checking debugfs...
Setting cluster stack "o2cb": OK
Registering O2CB cluster "ociocfs2": OK
Setting O2CB cluster timeouts : OK
Starting global heartbeat for cluster "ociocfs2": OK
Cluster Stackの設定を確認するには、/sbin/o2cb.init status コマンドを実行します:
$ sudo /sbin/o2cb.init status
Driver for "configfs": Loaded
Filesystem "configfs": Mounted
Stack glue driver: Loaded
Stack plugin "o2cb": Loaded
Driver for "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster "ociocfs2": Online
Heartbeat dead threshold: 31
Network idle timeout: 30000
Network keepalive delay: 2000
Network reconnect delay: 2000
Heartbeat mode: Local
Checking O2CB heartbeat: Active
Debug file system at /sys/kernel/debug: mounted
この例では、クラスターはオンラインになっており、ローカルハートビートモードを使用しています。ボリュームが設定されていない場合、O2CBハートビートはActiveではなくNot Activeと表示されます。
o2cbとocfs2のサービスを設定し、ネットワークが有効化されたあとに起動時に開始されるようにしておきます:
$ sudo systemctl enable o2cb
$ sudo systemctl enable ocfs2
これらの設定により、ノードはOCFS2ボリュームをシステム開始時に自動的にマウントできるようになります。
クラスターオペレーション用のカーネルの設定
クラスターの適正なオペレーションのために、以下の表に示すカーネル設定を行っておきます:
Kernel Setting | Description |
panic |
パニックが何秒間続いたらシステムが自動的に自身をリセットするかを定義する値
値が0の場合、システムは応答をやめ、トラブルシューティングのためにパニックの詳細な情報を収集することができる。これがデフォルトの値である。
自動リセットを有効にするには非ゼロの値をセットする。メモリイメージ(vmcore)が必要な場合には、Kdumpがこのイメージを生成するのに十分な時間を与える。推奨値は30秒だが、大規模なシステムではより長い時間が必要。
|
panic_on_oops | kernel oopsが起きたときにシステムが必ずパニックするようにするかの定義。クラスターオペレーションに必要なカーネルスレッドがクラッシュした場合、システムは自身をリセットする必要がある。でなければ、別のノードにはあるノードが応答が遅い、あるいは応答できないことがわからないかもしれず、クラスターオペレーションが停止してしまう。 |
各ノードで以下のコマンドを実行し、panicとpanic-on-oopsに推奨値をセットします:
$ sudo sysctl kernel.panic=30
$ sudo sysctl kernel.panic_on_oops=1
/etc/sysctl.conf ファイルに以下のエントリーを追加し、変更を再起動後も永続するようにする:
# Define panic and panic_on_oops for cluster operation
kernel.panic=30
kernel.panic_on_oops=1
Cluster Stackの起動と停止
以下の表にはCluster stackに関するオペレーションを実行するためのコマンドを示しています:
Command | Description |
/sbin/o2cb.init status | Check the status of the cluster stack. |
/sbin/o2cb.init online | Start the cluster stack. |
/sbin/o2cb.init offline | Stop the cluster stack. |
/sbin/o2cb.init unload | Unload the cluster stack. |
ボリュームの作成とマウント
OCFS2ボリュームの作成
mkfs.ocfs2 コマンドを使用してdevice.mkfs上にOCFS2ボリュームを作成します:
$ sudo mkfs.ocfs2 -L "ocfs2" /dev/sdb
mkfs.ocfs2 1.8.6
Cluster stack: classic o2cb
Label: ocfs2
Features: sparse extended-slotmap backup-super unwritten inline-data strict-journal-super xattr indexed-dirs refcount discontig-bg
Block size: 4096 (12 bits)
Cluster size: 4096 (12 bits)
Volume size: 12455405158400 (3040870400 clusters) (3040870400 blocks)
Cluster groups: 94274 (tail covers 512 clusters, rest cover 32256 clusters)
Extent allocator size: 780140544 (186 groups)
Journal size: 268435456
Node slots: 16
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 6 block(s)
Formatting Journals: done
Growing extent allocator: done
Formatting slot map: done
Formatting quota files: done
Writing lost+found: done
mkfs.ocfs2 successful
OCFS2ボリュームのマウント
以下の例で示されているように、システムが起動時にネットワーキングが開始されてからOCFS2をマントできるように、また、ネットワーキングが停止した際にはアンマウントするように、/etc/fstab内にnetdevオプションを指定してください。
$ sudo mkdir /ocfs2
$ sudo vi /etc/fstab
#include the below line to mount your ocfs2 after a restart
/dev/sdb /ocfs2 ocfs2 _netdev,defaults 0 0
mount -a を実行してOCFS2パーティションをfstabのエントリーをベースにマウントします。
おめでとうございます!クラスターファイルシステムはOracle Linx 7.xノード1とノード2の両方のサーバで/ocfs2でマウントされました!
クラスターが有効化されたアプリケーションでは、OCFS2ストレージを任意のネットワークアタッチされたストレージと同様に使うことができるようになりました。環境はよくよく考えて計画し、Availability DomainやOCFSなどの機能を活かしてOracle Cloud Infrastructure上に構築したソリューションの性能と可用性を向上していきましょう。