RACの投票ディスクあれこれ

投票ディスクの使われ方

投票ディスクの作成先ディスクグループが複数のディスクで構成されているとき、投票ディスクはどのように作られるのか。

標準冗長性のディスクグループを4台のディスクで構成した場合を考える。

SQL> select b.name,label,disk_number,mode_status from v$asm_disk a left join v$asm_diskgroup b
  2  on a.group_number = b.group_number where b.name = 'NROCR';

NAME       LABEL      DISK_NUMBER MODE_STATUS
---------- ---------- ----------- ---------------------
NROCR      NROCR1               0 ONLINE
NROCR      NROCR2               1 ONLINE
NROCR      NROCR3               2 ONLINE
NROCR      NROCR4               3 ONLINE

投票ディスクは以下のような構成になり、4本のうち3本のみが使われる。

[grid@rac19n1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   5d4095281d624f5abf9ca6e6eede95f6 (AFD:NROCR1) [NROCR]
 2. ONLINE   55622263368c4f4abf9562f6080f12e1 (AFD:NROCR2) [NROCR]
 3. ONLINE   f7638bb17cdc4f70bfcf0fbb62a3c03a (AFD:NROCR3) [NROCR]
3の投票ディスクを検出しました。

投票ディスクに障害が発生すると、以下のようにそのディスクはOFFLINEになる。

[grid@rac19n1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. OFFLINE  5d4095281d624f5abf9ca6e6eede95f6 (AFD:NROCR1) [NROCR]
 2. ONLINE   55622263368c4f4abf9562f6080f12e1 (AFD:NROCR2) [NROCR]
 3. ONLINE   f7638bb17cdc4f70bfcf0fbb62a3c03a (AFD:NROCR3) [NROCR]
3の投票ディスクを検出しました。

この時、ASMとしても障害が起こっているディスクはOFFLINE状態となっている。

SQL> select b.name,label,disk_number,mode_status from v$asm_disk a left join v$asm_diskgroup b
  2  on a.group_number = b.group_number where b.name = 'NROCR';
  
NAME       LABEL      DISK_NUMBER MODE_STATUS
---------- ---------- ----------- ---------------------
NROCR                           0 OFFLINE
NROCR      NROCR2               1 ONLINE
NROCR      NROCR3               2 ONLINE
NROCR      NROCR4               3 ONLINE

自分の環境では、ディスクを再接続すると認識はするものの、元のディスクグループに復帰する動きにはならず、GROUP_NUMBER=0 として認識されていた。

SQL> select a.group_number,b.name,label,disk_number,mode_status from v$asm_disk a left join v$asm_diskgroup b
  2  on a.group_number = b.group_number;

GROUP_NUMBER NAME       LABEL      DISK_NUMBER MODE_STATUS
------------ ---------- ---------- ----------- ---------------------
           0            NROCR1               0 ONLINE
           3 OCR        OCR                  0 ONLINE
           1 DATA       DATA                 0 ONLINE
           3 OCR        OCR2                 1 ONLINE
           2 NROCR      NROCR2               1 ONLINE
           2 NROCR      NROCR3               2 ONLINE
           2 NROCR      NROCR4               3 ONLINE

この状態になると、投票ディスクはディスクグループに残っているディスクで自動的に再構成されて、3台がONLINE状態となっていた。

[grid@rac19n1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   55622263368c4f4abf9562f6080f12e1 (AFD:NROCR2) [NROCR]
 2. ONLINE   f7638bb17cdc4f70bfcf0fbb62a3c03a (AFD:NROCR3) [NROCR]
 3. ONLINE   4f2902f6e84d4fc1bfb8e37eef1dff50 (AFD:NROCR4) [NROCR]
3の投票ディスクを検出しました。

このあたりの挙動は障害の内容にもよるかもしれない。

定数障害グループについて

ASMCAでディスクグループを作成するとき、「定数」という謎のチェックボックスがあることに気づくはず。

結論、ここにチェックを付けたディスクにはユーザデータ(表領域のデータファイルなど)は格納されず、そのディスクグループを投票ディスクとして使用した場合にのみ投票ファイルが格納されることになる。

ExadataではQuorumディスクがこの定数障害グループに設定される。ストレージサーバのみでは高冗長性(5多重)の障害グループを構成することができない場合に、データベースサーバ側のストレージをiSCSIで共有ディスクとして使用するというアレである。

非Exadataでもこの定数障害グループを追加することはできるので、挙動を確認してみると以下の通り。

テスト用のディスクグループを作成

3つの障害グループから構成される高冗長性のディスクグループ「TEST」を作成。この時点で使用するディスクは標準のディスクとするため「定数」のチェックは外しておく。

作成後の状況は以下。

[grid@rac1 ~]$ asmcmd lsdg
State    Type    Rebal  Sector  Logical_Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512             512   4096  4194304     40960    34956                0           34956              0             N  DATA/
MOUNTED  EXTERN  N         512             512   4096  4194304      2048     1640                0            1640              0             Y  OCR/
MOUNTED  HIGH    N         512             512   4096  4194304     30720    30048                0           10016              0             N  TEST

各ディスクの空きも上記 Usable_file_MB と同じ。

SQL> select name, failgroup, label, path, free_mb from v$asm_disk where group_number=3;

    NAME    FAILGROUP    LABEL         PATH    FREE_MB 
________ ____________ ________ ____________ __________ 
TEST1    FG1          TEST1    AFD:TEST1         10016 
TEST2    FG2          TEST2    AFD:TEST2         10016 
TEST3    FG3          TEST3    AFD:TEST3         10016 

この時点では冗長度が不足しているため、投票ディスクの格納先として使用することはできない。

[grid@rac1 ~]$ crsctl replace votedisk +TEST
CRS-4648: ディスク・グループTESTの投票ファイル作成に失敗しました。
CLSU-00107: オペレーティング・システム機能: kgfnStmtExecuteが、エラー・データ: 0により失敗しました(場所: kgfdvfCR20)
CLSU-00101: オペレーティング・システム・エラー・メッセージ: Error 0
CLSU-00104: 追加エラー情報: ORA-15274: Not enough failgroups (5) to create voting files
CLSU-00104: 追加エラー情報: ORA-06512: at line 4
CLSU-00104: 追加エラー情報: ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 818
CLSU-00104: 追加エラー情報: ORA-06512: at line 2
CRS-4628: 構成の変更に失敗しましたが、正常にロールバックされました。
CRS-4000: コマンドReplaceは失敗したか、またはエラーのある状態で完了しました。

定数障害グループのディスクを追加

ここに2つのディスクを追加する。今度は「定数」にチェックを付ける。

すると、ディスクグループとしては以下のような状態となる。4GBのディスクを2つ追加しているが Total_MB は増えていない。ここに表示されるのは「定数」のディスクを除いたものと思われる。

[grid@rac1 ~]$ asmcmd lsdg
State    Type    Rebal  Sector  Logical_Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512             512   4096  4194304     40960    34896                0           34896              0             N  DATA/
MOUNTED  EXTERN  N         512             512   4096  4194304      2048     1640                0            1640              0             Y  OCR/
MOUNTED  HIGH    N         512             512   4096  4194304     30720    30000                0           10000              0             N  TEST/

v$asm_disk の failgroup_type 列からも、追加したディスクが「QUORUM」と表示されていることがわかる。

SQL> select name, failgroup, label, path, failgroup_type, free_mb from v$asm_disk where group_number=3;

    NAME    FAILGROUP    LABEL         PATH    FAILGROUP_TYPE    FREE_MB 
________ ____________ ________ ____________ _________________ __________ 
TEST1    FG1          TEST1    AFD:TEST1    REGULAR                10000 
TEST2    FG2          TEST2    AFD:TEST2    REGULAR                10000 
TEST3    FG3          TEST3    AFD:TEST3    REGULAR                10000 
TEST4    QFG1         TEST4    AFD:TEST4    QUORUM                  4084 
TEST5    QFG2         TEST5    AFD:TEST5    QUORUM                  4084 

ディスクが5重化されたため、このディスクグループは投票ディスクとして使用可能となる。実際に投票ディスクを切り替えると以下の通り。

[grid@rac1 ~]$ crsctl replace votedisk +TEST
投票ディスク194b453c12d94fa1bfcdf460194ea1dfが正常に追加されました。
投票ディスク1eef6ae78f064f02bf51e08fcdef8235が正常に追加されました。
投票ディスク978702bb24994f6bbfe1304d5d4df5d3が正常に追加されました。
投票ディスク312bd6d2f1814f11bf7673398318c760が正常に追加されました。
投票ディスク5e6d2274891a4fcebf6e8cfec674ea81が正常に追加されました。
投票ディスク0591b58ff7bd4fb2bf4973c6c6852893が正常に削除されました。
投票ディスク・グループは+TESTと正常に置換されました。
CRS-4266: 投票ファイルが正常に置換されました

[grid@rac1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   194b453c12d94fa1bfcdf460194ea1df (AFD:TEST1) [TEST]
 2. ONLINE   1eef6ae78f064f02bf51e08fcdef8235 (AFD:TEST2) [TEST]
 3. ONLINE   978702bb24994f6bbfe1304d5d4df5d3 (AFD:TEST3) [TEST]
 4. ONLINE   312bd6d2f1814f11bf7673398318c760 (AFD:TEST5) [TEST]
 5. ONLINE   5e6d2274891a4fcebf6e8cfec674ea81 (AFD:TEST4) [TEST]
5の投票ディスクを検出しました。

投票ファイルが作成された分、各ディスクの空き領域は減少する。

SQL> select name, failgroup, label, path, failgroup_type, free_mb from v$asm_disk where group_number=3;

    NAME    FAILGROUP    LABEL         PATH    FAILGROUP_TYPE    FREE_MB 
________ ____________ ________ ____________ _________________ __________ 
TEST1    FG1          TEST1    AFD:TEST1    REGULAR                 9968 
TEST2    FG2          TEST2    AFD:TEST2    REGULAR                 9968 
TEST3    FG3          TEST3    AFD:TEST3    REGULAR                 9968 
TEST4    QFG1         TEST4    AFD:TEST4    QUORUM                  4052 
TEST5    QFG2         TEST5    AFD:TEST5    QUORUM                  4052 

実際に「定数」のディスクにユーザデータが書き込まれないことも確認してみる。このディスクグループに適当に表領域をしてみると、FAILGROUP_TYPE が REGULAR のディスクのみ FREE_MB が減少し、QUORUM のディスクは一切領域が使われていないことがわかる。

SQL> create tablespace testtbs datafile '+TEST' size 8G;

Tablespace TESTTBSは作成されました。

SQL> select name, failgroup, label, path, failgroup_type, free_mb from v$asm_disk where group_number=3;

    NAME    FAILGROUP    LABEL         PATH    FAILGROUP_TYPE    FREE_MB 
________ ____________ ________ ____________ _________________ __________ 
TEST1    FG1          TEST1    AFD:TEST1    REGULAR                 1768 
TEST2    FG2          TEST2    AFD:TEST2    REGULAR                 1768 
TEST3    FG3          TEST3    AFD:TEST3    REGULAR                 1768 
TEST4    QFG1         TEST4    AFD:TEST4    QUORUM                  4052 
TEST5    QFG2         TEST5    AFD:TEST5    QUORUM                  4052 

この時、ASMCMD で見える Usable_file_MB も、REGULAR のディスクの状況のみを反映している。

[grid@rac1 ~]$ asmcmd lsdg
State    Type    Rebal  Sector  Logical_Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512             512   4096  4194304     40960    34884                0           34884              0             N  DATA/
MOUNTED  EXTERN  N         512             512   4096  4194304      2048     1672                0            1672              0             N  OCR/
MOUNTED  HIGH    N         512             512   4096  4194304     30720     5304                0            1768              0             Y  TEST/

コメント