Windows 2000 でのクラスタ構築、Oracle の注意点
ドメイン・コントローラが Windows NT Server の場合には、クラスタを構築している Windows 2000 Server には、「NTP サーバ立ち上げまでの道」で記述したとおり、「タイム・サービス・リソース」を導入する必要があります。
そこで、気になったのが「タイム・サービス・リソース」の動きです。調べた限り下記の内容になっているようです。
また、「NT4.0ドメイン内のWindows2000/XPコンピュータの時刻を同期させる方法」の設定を行う必要があります。これを行わないと、イベントログに下記のようなメッセージが記録されます。(W32Times は Windows2000 のサービスとして Windows Time という名称で起動されている Windows 2000 標準の SNTP クライアントです。)
ソース : W32Times
種類 : 警告
イベントID : 64
説明 : ネットワークの問題が繰り返し発生しているため、タイム サービスは同期するドメイン コントローラを検出できません。ネットワーク トラフィックを減らすために、タイム サービスは再試行するまで 960 分待ちます。この間は接続が復元されても同期は実行されません。蓄積されたタイム エラーのために、特定のネットワーク操作が利用できなくなる可能性があります。タイム サービスにネットワーク接続が復元されて同期するように知らせるには、コマンド ラインで "w32tm /s" と実行してください。
Oracle 上で OS のシステム日時に変更があった場合には下記のことが発生すると考えられます。
Oracle は時間情報を更新履歴のファイルと各ファイル(制御ファイル、データファイル、REDO ログ)内に持っています。
但し、ミリ秒単位で戻すのは問題ないようです。内部は秒単位で管理しているようです。
また、時間を通常より遅く進めても構わないようです。但し、OS
時間で1秒間に SCN (System Change Number : COMMIT
する都度、増加する数)が16,000以上増加させる事はできません。
私は、Windows 2000 で、時間を遅く進める方法、ツールを知りませんので、現実的には、時間を遅く進めることはできないと思います。UNIX はハードウェア・クロックとは別にシステム・クロックを持っているので可能かと思いますが。
Oracle ではインスタンス起動中での、OS のシステム日時の変更はサポートされていません。また、インスタンス停止中であってもシステム日時を戻すことは、「OS の時間を遅らせる場合」の状況が発生する場合がある可能性があります。
システム時間を整合性を持って戻すには、「データベースを停止し、システム時刻を戻した後、データベースを停止した時点のシステム時刻になるまでデータベースを起動しない。」のが一番良いと思います。
上記のことから、
構成
- クラスタを構築したシステムでは、外部との時間同期を行わない。あくまでノード間でのみ時刻を同期させる。
(外部の時刻源に合わせて、クラスタ内の時間が進んだり、戻ったりすることが発生するから。)- Windows Time(W32Times) の時刻源となるサーバを自分自身とする。
具体的には、コマンド・プロンプトから
net time /setsntp:サーバ名 と入力する。
設定を確認するのは
net time /querysntp と入力すると設定されている SNTP サーバ名が表示される。
- 但し、私の環境下では SNTP サーバを設定しても、W32Time がイベントにエラーを吐いているのは消えなかったので、 net time の設定は削除しました。
私自身の予測ですが、このサーバは PDC FSMO ではないため、自分自身の W32Time から見て、 SNTP サーバの役目を行っていないためだと思います。自分自身を時刻源として設定できるのは、自分が PDC FSMO でないとできないかと考えられます。
また、 Windows Time のサービス自体を止めてしまおうかと考えましたが、 Windows Time サービスに依存しているサービスとして "Cluster Service"が存在したので停止できませんでした。
現状でも、このエラーは出ている状態です。- 「タイム・リソース・サービス」を保有するノード上に Oracle の DB を構築する。
(時刻源であるノード上にあれば、Oracle の時間の戻りは発生しないと考えられる。)- フェィル・オーバ、フェィル・バックが発生しても、「タイム・リソース・サービス」で同期を取っているので、問題は発生しないと考えられる。(微妙に時間のずれが発生する可能性はあるが、特に問題は出ないと考えられる。)
時間の合わせ方
- Oracle のインスタンスを停止させる。(Oracle 保持しているクラスタ・グループをオフラインにする。)
- 「タイム・リソース・サービス」を保有しているノードの時間を合わせる。
(手動で「net time」のコマンド等を使用して、外部の時刻源と時間を合わせる。)- 別のノードの時間を「net time」のコマンドを使用して、「タイム・リソース・サービス」を保有しているノードに合わせる。
NET TIME \\サーバ名 /set /y
OS の時間を進める場合は問題ないと考えられるが、OS の戻す場合には Oracle のインスタンスを停止させた後、あるポイントでの時刻を記録し、その時刻を基準となる時刻が越えてから時刻合わせを行う。
- Oracle のインスタンスを起動する。(Oracle 保持しているクラスタ・グループをオンラインにする。)
大規模なサーバ環境下では、それなりのサーバを使用しており、それなりのハードウェア・クロックを内蔵しており、また、温度管理のされたマシンルーム等に設置されていると思われるので、システム時間が大幅にずれてくることは少ないと思います。その為、半年程度に1回程度、合わせるのが現実的かと思います。