OCFS2とは
OCFS2(Oracle Cluster File System 2) for LinuxはOracleが提供しているクラスタファイルシステムです。
クラスタファイルシステムとは、複数のノード(OSが稼動している機器)から接続しているディスク装置(共有ディスク)に対するファイルIOなどを適切に行うためのものです。
Oracle Clusterware(Oracle Real Application Clustersで使用するOracle製クラスタソフト)を導入するときに、Oralce Clusterware自体にはクラスタファイルシステムとしての機能はありませんのでOCR(Oracle Cluster Registry)や投票ディスク(Voting Disks)の設定先として共有RAWデバイスかクラスタファイルシステムとして認識できる共有ディスクでなければなりません。
OCFS2を使えば、別途クラスタファイルシステムを購入してこなくても、共有RAWデバイスではなくクラスタファイルシステム上でOracle Clusterwareが構築できるようになる訳です。
そこでOCFS(OCFS2の前身で2002年12月にリリースされました)の登場です。OCFSの目的は別途クラスタソフトが担っていた共有ディスク上のファイルアクセスの代替であり、OCFSをインストールすると別途クラスタソフトを用意しなくてもRAWデバイスではなく普通のファイルシステム上で、Oracle Clusterを導入する事ができるようになります。そのため、RAC環境下のOracle Databseのデータファイル、制御ファイル、REDOログ、アーカイブログを共有ディスク上にあるという事を意識せずにOSから管理できるようになります。
なお、Windows版の場合はOCFSがなくても共有ディスクを通常使うファイルシステムのように使う事ができます。
OCFSとOCFS2の違い
OCFS2の前身であるOCFSは2002年12月にリリースされ、GPLライセンスによるオープンソースとなっていました。これは将来的にLinuxのカーネルの一部としてOCFSを採用する事を目標としていたからです。この目標は現在は達成されつつあり、OCFS2もKernel2.6.19に同梱されるようになっています。
OCFS2は、OCFSの機能に加えてOracle Databaseソフトウェアそのものや構成ファイル(Oracleホームのフォルダに配置されているもの)なども共有ディスク上に配置できるように考慮されています。この機能により、今までであればパッチは各ノードに個別に適用しなければならなかったのが、OCFS2上に設定したOracle Databaseソフトウェアにパッチを当てる事で全ノードのパッチ適用が完了してしまうという事が可能になりました。
もちろん、その代わりローリングアップデートのように業務を止めずに各ノードに順次パッチをあてていくと事はできなくなりますが、パッチ適用方法が選択できる事により運用負荷が軽減できるケースも増えてくるでしょう。
OCFS2の入手
OCFS2はカーネルとツールの2セットのrpmで構成されていて、OTN-Jからダウンロードして入手します。
OCFS2カーネル
OCFS2カーネルは、Linuxディストリビューション、プラットフォーム、カーネルバージョン、カーネル環境ごとに異なっていますので、使っているLinux上でuname -aと打ってどのファイルをダウンロードすればよいかを調べておくのが良いでしょう。
例えば、uname -aとうって次の結果が返ってきたとします。
[root ~]# uname -a
localhost.local 2.6.9-34.ELsmp #1 SMP Fri Feb 24 16:56:28 EST 2006 x86_64 x86_64 x86_64 GNU/Linux
であれば、2.6.9-64.ELsmpのOCFS2カーネルが必要になりますので、
- ocfs2-2.6.9-34.ELsmp-1.2.5-6.x86_64.rpm
というOCFS2カーネルのrpmをダウンロードします。
なお、1.2.5.6はOCFS2のバージョンになります。
OCFS2ツール
OCFS2ツールには、コマンドラインツールのocfs2-toolsとGUIツールのocfs2-consoleがあります。
OCFS2ツールのバージョンはOCFS2カーネルのバージョンの先頭2つ及びカーネル環境とあわせる必要があります。
例えば、OCFS2ocfs2-2.6.9-34.ELsmp-1.2.5-6.x86_64.rpmならばダウンロードするOCFS2ツールのrpmは、
- ocfs2-tools-1.2.4-1.x86_64.rpm
- ocfs2console-1.2.4.-1.x86_64.rpm
となります。
なお、OTN-Jに登録されているものは、対応するLinuxのカーネルバージョン、カーネル環境が結構古いものです。例えば、2.6.9-34.ELsmp (RHEL4 Update3のカーネルバージョン)もOTN-Jからは入手できませんでしたがOTN-JのOCFS2ページにある本家のOCFS2ページに飛んで必要なrpmを入手しました。
OCFS2のインストール
OCFSはOracle Clusterwareよりも前に導入します。
まず、次のコマンドを打ち込んでOCFSまたはOCFS2がインストールされていないかを確認します。
[root ~]# rpm -qa | grep ocfs
OCFS2ツールのインストール
[root ~]# rpm -iv ocfs2-tools-1.2.4-1.x86_64.rpm ocfs2console-1.2.4-1.x86_6
4.rpm
Preparing packages for installation...
ocfs2-tools-1.2.4-1
ocfs2console-1.2.4-1
OCFS2カーネルのインストール
[root ~]# rpm -iv ocfs2-2.6.9-34.ELsmp-1.2.5-6.x86_64.rpm Preparing packages for installation... ocfs2-2.6.9-34.ELsmp-1.2.5-6
もし、OCFS2ツールを入れる前にOCFSカーネルをいれようとすると次のようエラーになります。
[root ~]# rpm -iv ocfs2-2.6.9-34.ELsmp-1.2.5-6.x86_64.rpm
エラー: Failed dependencies:
ocfs2-tools >= 1.1.1 is needed by ocfs2-2.6.9-34.ELsmp-1.2.5-6.x86_64
インストールの確認
きちんと格納できたかを確認するには、rpm -qaでインストール済パッケージ名をすべて取得して、grepよりocfsの文字が含まれている情報のみを抽出して確認します。
[root ~]# rpm -qa | grep ocfs
ocfs2-tools-1.2.4-1
ocfs2-2.6.9-34.ELsmp-1.2.5-6
ocfs2console-1.2.4-1
もし、rpmによりどこにインストールされたかを知りたいときには、rpm -qaを使います。
[root ~]# rpm -qs ocfs2-2.6.9-34.ELsmp-1.2.5-6.x86_64
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/configfs
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/configfs/configfs.ko
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/debugfs
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/debugfs/debugfs.ko
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/ocfs2
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/ocfs2/ocfs2.ko
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/ocfs2/ocfs2_dlm.ko
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/ocfs2/ocfs2_dlmfs.ko
通常/lib/modules/2.6.9-34.ELsmp/kernel/fs/ocfs2/ocfs2_nodemanager.ko
すべてのノードにOCFS2のインストールが完了したら、次のコマンドを打ってみます。
[root ~]# /etc/init.d/o2cb enable
Writing O2CB configuration: OK
Loading module "configfs": OK
Creating directory '/config': OK
Mounting configfs filesystem at /config: OK
Loading module "ocfs2_nodemanager": OK
Loading module "ocfs2_dlm": OK
Loading module "ocfs2_dlmfs": OK
Creating directory '/dlm': OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Checking O2CB cluster configuration : Failed
このような出力になれば、あとはO2CB cluster configurationを行えば良いわけです。なお、o2cb enableですが、2回目からは「Writing O2CB configuration: OK」の次の行に「Checking O2CB cluster configuration : Failed」が直ぐに出力されます。
それでは、ここで一度リブートしておきましょう。
OCFS2の設定
関連するすべてのノードに対してOCFS2のインストールが完了したら、設定を開始します。まずは、設定に必要な情報を記録するために、hostnameとIPアドレスを調べます。
[root ~]# hostname
hogehoge.hogehoge.jp
[root ~]# ifconfig
bond0 Link encap:Ethernet ・・・・・
:
:
OCFS2の設定はコマンドラインツールよりもGUIツール(ocfs2console)の方が格段に簡単です。ocfs2consoleの起動は次のようになります。
ノードの登録
OCFS2 Consoleが立ち上がったら[Cluster]-[Configure Nodes...]で[Node Configuration]画面を立ち上げ、[追加]ボタンをクリックして各ノードの名前、IPアドレス、ポート番号を記入していきます。注意点は、名前には先ほどhostnameコマンドで調べた名前を指定し、そのhostnameに対応したIPアドレスを指定することです。
ノードをすべて追加したら[適用]ボタンをクリックしてGUIで入力した内容を/etc/ocfs2/cluster.confファイルに反映してください。
node:
ip_port = 7777
ip_address = 192.168.xxx.11
number = 0
name = xxxx1.xxxx.xxxx.jp
cluster = ocfs2
node:
ip_port = 7777
ip_address = 192.168.xxx.12
number = 1
name = xxxx2.xxxx.xxxx.jp
cluster = ocfs2
cluster:
node_count = 2
name = ocfs2
他のノードへの反映
OCFS2 Consoleを使わない場合、/etc/ocfs2/cluster.confを全ノードにcpでコピーするなどの手順が必要ですが、OCFS2 Consoleを使っている場合は、[Cluster]-[Propagate Configuration...]メニューをクリックすれば登録されている全ノードにcluster.confファイルを転送してくれます。
このとき、sshを使うので接続用パスワードが入力を省略できる状態で全ノードにsshできるように設定してある必要があります。なお、この設定はOracle Clusterwareを導入するときにも必要です。
設定の確認
[root ~]# /etc/init.d/o2cb online ocfs2
Starting O2CB cluster ocfs2: OK
[root ~]# /etc/init.d/o2cb status
Module "configfs": Loaded
Filesystem "configfs": Mounted
Module "ocfs2_nodemanager": Loaded
Module "ocfs2_dlm": Loaded
Module "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Online
Heartbeat dead threshold: 7
Network idle timeout: 10000
Network keepalive delay: 5000
Network reconnect delay: 2000
Checking O2CB heartbeat: Not active
ブート時起動の設定
ブート時起動を行うには、/etc/sysconfig/o2cbファイルに設定が必要ですが、ファイルを直接いじるよりコマンドラインツールで対話的に設定するのが良いでしょう。
[root ~]# /etc/init.d/o2cb 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
without typing an answer will keep that current value. Ctrl-C
will abort.
Load O2CB driver on boot (y/n) [y]:
Cluster to start on boot (Enter "none" to clear) [ocfs2]:
Specify heartbeat dead threshold (>=7) [7]:
Specify network idle timeout in ms (>=5000) [10000]:
Specify network keepalive delay in ms (>=1000) [5000]:
Specify network reconnect delay in ms (>=2000) [2000]:
Writing O2CB configuration: OK
O2CB cluster ocfs2 already online
フォーマット
推奨ブロックサイズ4K、推奨クラスタサイズ32Kでフォーマットするときには、mkfs.ocfs2コマンドで次のようなパラメタを指定します。
なお、-N 2はノード数(あとから増やせが減らせない)、-L eturnus /dev/sdb1は/dev/sdb1というデバイスに対してeturnusというラベルをつけるためのパラメタ指定です。
[roo]# mkfs.ocfs2 -b 4K -C 32K -N 2 -L eturnus /dev/sdb1
mkfs.ocfs2 1.2.4
Filesystem label=sdb
Block size=4096 (bits=12)
Cluster size=32768 (bits=15)
Volume size=585113796608 (17856256 clusters) (142850048 blocks)
554 cluster groups (tail covers 18688 clusters, rest cover 32256 clusters)
Journal size=268435456
Initial number of node slots: 2
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 5 block(s)
Formatting Journals: done
Writing lost+found: done
mkfs.ocfs2 successful
Formatting Journalsで少々時間が掛かりますが、successfulとでればフォーマット完了です。このフォーマット作業はどこか1ノードで実施すれば完了です。
マウント
すべてのノードで、マウントポイント用に/u02ディレクトリ(名称は任意)を作成してそこにocfs2でフォーマットしたデバイスをマウントします。
[root ~]# mkdir /u02
[root ~]# mount -t ocfs2 -o datavolume /dev/sdb1 /u02
OSで通常使うファイルシステムのように共有ディスクを使う事ができているかを確認するために、viなので小さなファイルを作成して、それを全ノードで見ることができるか確認します。
[root ~]echo hogehoge > /u02/test ←どこか1ノードで
[root ~]# ls -la /u02
合計 17
drwxr-xr-x 3 root root 4096 9月 13 15:01 .
drwxr-xr-x 29 root root 4096 9月 13 14:56 ..
drwxr-xr-x 2 root root 4096 9月 13 14:51 lost+found
-rw-r--r-- 1 root root 9 9月 13 15:01 test
ブート時に自動マウントできるように/etc/fstabにマウントエントリを追加します。
:
/dev/sdb1 /u02 ocfs2 _netdev 0 0
:
defaultsではなく_netdevとしているのはネットワークデバイスが起動したあとにボリュームをマウントし、ネットワークデバイスの停止前にボリュームをディスマウントするためのです。これは、ocfs2がネットワークを通して各ノードのハートビートをやりとりするために、ネットワークが動いている事が前提となるためです。
最後の確認
それでは最後に全ノードをリブートして、ブート後でもocfs2が使える事を確認して終わりにしましょう。
[root ~]# /etc/init.d/o2cb status
Module "configfs": Loaded
Filesystem "configfs": Mounted
Module "ocfs2_nodemanager": Loaded
Module "ocfs2_dlm": Loaded
Module "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Online
Heartbeat dead threshold: 7
Network idle timeout: 10000
Network keepalive delay: 5000
Network reconnect delay: 2000
Checking O2CB heartbeat: Active
[root ~]# fsck.ocfs2 -n /dev/sdb1
Checking OCFS2 filesystem in /dev/sdb1:
label: eturnus
uuid: xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
number of blocks: 142849968
bytes per block: 4096
number of clusters: 17856246
bytes per cluster: 32768
max slots: 2
/dev/sdb1 is clean. It will be checked after 20 additional mounts.
おまけ
SE RACとEE RACの違いには、「OCFS(Oracle Cluster File System)やRAWデバイス上にデータベース・ファイルを格納させる場合には、EE RACが必要となります。」とあります。
OCFSに興味があったのでSE RACでOCFSが使えないのがちょっと気になったのですが、よくか考えてみると当然といえば当然なのです。
SE RACはASMの利用が前提、ASMはRAWデバイスが前提、つまりOCFSやOCFS2でクラスタファイルシステムを構築してもASMでは使えないため共有RAWデバイスを使わないとダメなのです。
では、ASMを使いつつ、EE RACが必要な状況とはどんな状況かといえば、OCFS2上にOracle Databaseソフトウェアを導入して各ノードから共通利用するところまでやりたいと思ったようなときでしょう。このようなときは、Enterprise Editionを購入してStandard Editionとの便利さの違いに「高くても選択して良かった」と優越感にひたるのがいいでしょう。