その1:GI構築編
その2:MySQL構築編
その3:機能確認編
はじめに
MySQLの高可用性構成といえば、レプリケーションや MySQL InnoDB Cluster が主流ではありますが、、、
Oracle Clusterware + 共有ディスクを用いて、MySQL をシンプルなアクティブ・スタンバイ構成にすることができます。
構成の概要や、気になるライセンス、メリット・デメリットについては、Oracle社が公表されている資料(P4,14,15)をご覧ください。
Oracle Clusterware と聞くと、MySQL ユーザーにはあまり馴染みがないかもしれませんが、Oracle Real Application Cluster(RAC)の基盤を担っている Oracle Grid Infrastructure(GI) の一部ですので、その技術を用いたHA構成が組めることになります。
すでに2014年からMySQLについてもOracle Clusterwareは正式サポートしており、MySQLの高可用性構成を検討しているユーザーにとっては選択肢の1つになり得ます。
本記事では、実際に環境構築をしてみて、具体的な実装手順や主な機能の動作検証をレポートしていきます。
以下の内容で全3回の掲載を予定しています。
- その1:GI構築編(本記事)
- GIインストール
- 準備、設定などの注意ポイント
- サイレントインストールについて
- ACFSファイルシステム作成、マウント
- GIインストール
- その2:MySQL構築編
- MySQL 8.0 EE インストール
- XAG Agent インストール
- MySQLをクラスターリソースへ登録
- その3:機能検証編(※内容は多少変更する可能性があります)
- 高可用性の機能確認
- リソース再配置(takeover)
- 障害時挙動
- mysqldクラッシュ,CRSスタック障害,サーバーダウン,NW障害,ACFS リソース障害
- リソース戻し(failback)
- 拡張性の機能確認
- ACFS ボリューム拡張
- MySQLインスタンス追加
- その他気付いたことなど
- 高可用性の機能確認
今回構築した環境について
方針と前提条件は以下としています。
- 冒頭で Oracle Clusteware と記載しましたが、実際は Oracle Clusterware + ASM(ACFS) になるので、本記事ではGrid Infrastructure(GI)と表記をまとめます。
- GI のインストールについては、RAC をベースとしたナレッジが World Wideで多数ありますので、以下の観点で検証しています。
- MySQL をクラスターリソースに組み込む前段階で、GIをどのように構成しておくか
- MySQL をどのようにクラスターリソースに組み込むのかについて、Oracle Grid Infrastructure Agent 公式マニュアルの記載を元に手順を明確にする
- KVM + Vagrant による仮想マシンで構築しており、共有ディスクもKVMのストレージボリュームで構成しています。
ただし、本記事では KVM + Vagrant の使い方では特筆すべき内容はないため、Vagrantfile などの詳細な設定内容の掲載は割愛しました。 - OSおよびソフトウェアは以下の通りです。
- 前述のOracle社資料でも明記されている通り、サポートされる製品Edition(Oracle Linux + MySQL Enterprise Edition)の組み合わせ
(そのため、Windows環境では未検証です)
- 前述のOracle社資料でも明記されている通り、サポートされる製品Edition(Oracle Linux + MySQL Enterprise Edition)の組み合わせ
環境構成図
基本的な全体構成は以下の通りとしました。
- node1:プライマリ、node2:スタンバイ
- MySQLは正系ホスト側で複数のインスタンスを稼働できるようする
- ACFS は両系からマウント
[クリックして拡大]
OS、ストレージ、ソフトウェアの概要
- Oracle Linux 7.6 (Oracle公式Vagrant Boxを利用)
- Kernel
- 上記Boxのデフォルト
UEK5 4.14.35-1844.4.5.el7uek.x86_64
からUEK5 4.14.35-1902.5.2.1.el7uek.x86_64
へアップグレードしています。
後述しますが、これは、今回検証で利用する ASM Filter Driver(AFD) のサポート対象とするための対応です。
- 上記Boxのデフォルト
- 2 vCPUs, 3 GB RAM
- RAM の GI インストール要件は 最小8GB推奨ですが、今回は検証用のため必要最低限を準備しました。
- SWAP は 3GB 追加しています。
- 3 NICs
- うち、eth1=Public Network, eth2=Private Network
- Kernel
- 共有ディスク : 14GB × 5
- 冗長化レベルを標準(2重化)とするため、実効容量は (35GB – ASMメタデータ使用分)となります。
- Oracle Grid Infrastructure 19.4.0 (19.3.0 + Patch 29708769 – GI Release Update 19.4.0.0.190716)
- Patch 29708769 を適用していますが、これも上記の AFD サポートと対象とするための対応となります。
詳細は1. GIインストール – ASM 用ディスクの準備にて後述します。
- Patch 29708769 を適用していますが、これも上記の AFD サポートと対象とするための対応となります。
- Oracle Grid Infrastructure Agent(XAG Agent) 9.1.2
- MySQL 8.0.17 Enterprise Edition
- V983227-01.zip : MySQL Database 8.0.17 Yum Repository TAR for Oracle Linux / RHEL 7 x86 (64bit)
- V983202-01.zip : MySQL Commercial Server 8.0.17 TAR for Oracle Linux / RHEL 7 x86 (64bit)
※Oracle Software Delivery Cloud からダウンロード
1. GIインストール
Grid Infrastructureインストレーションおよびアップグレード・ガイド 19c for Linuxにしたがって、必要な設定を順次行っていきます。
詳細な手順は前述のとおり割愛させていただくものの、ここではいくつか気をつけなければいけないポイントを挙げておきます。
SCANについて
- 本環境では実際には SCAN は利用しませんが、GIインストール時のみ必要な設定として、/etc/hosts ファイルに SCAN VIP の IPアドレスとホスト名を記述しておきます。
以下の例では、hacluster-scan
が SCAN VIPのエントリです。123456789101112# Public Network192.168.100.11 node1192.168.100.12 node2# Public Network(VIP)192.168.100.21 node1-vip192.168.100.22 node2-vip# Public Network(SCAN-VIP)192.168.100.30 hacluster-scan# Private Network(ASM,Interconnect)192.168.200.11 node1-priv192.168.200.12 node2-priv実際はインストール時に、ここで記載したSCAN VIPのホスト名を指定することで、構成ステップを進めることになります。
grid ユーザーについて
- GIインストールユーザーを grid ユーザーにする場合は、Oracle Preinstallation RPM では作成されないので、手動で作成が必要です。ユーザー毎のリソース制限(limits)も忘れず設定しておきます。
- ASM用グループ(asmadmin,asmoper,asmdba)は最小限
asmadmin
があればインストールは支障ありません。
ASM 用ディスクの準備
- ASM用のディスクはクラスターメンバーノードから共有ディスクとしてアクセスできるように接続しておきます。パーティションの作成は必要ありません。
(本環境では、/dev/vda ~ vde のディスクデバイスとして認識されました) - ASM ディスクの認識、デバイスパスの永続化設定は、主に以下3つの手段があり、どれを利用しても構成可能です。
- udevルールファイル
- ASMLIB
- ASM Filter Driver(AFD)
AFDは12c(12.1)から導入された新しいドライバーです。ASM lib と AFD は併用できません。
今回は設定の簡便性と機能的なメリットを期待して AFD を利用することとしました。
- その AFD で ASM を認識させるためには、インストール実行前にあらかじめ AFD ラベルをディスクに付与する必要がありますが、3点注意が必要です。
- 設定手順について、マニュアルの記載は少し不足しており、
ORACLE_HOME
だけでなく、ORACLE_BASE
も以下のように設定しないと asmcmd が実行できません。1# export ORACLE_BASE=/tmp※ASM管理者ガイドの方には載っていました。
-
マニュアルには明記されていない手順ですが、AFDのラベル付与を行った際にGIインストールディレクトリ配下のファイルオーナーが一部書き換わってしまい後述のGIインストール時にASMディスクを正しく認識できない可能性があるので、その予防対策を行っておきます。
1# chown -R grid:oinstall /u01/app/19.0.0/grid - AFD をサポートする OS Kernel バージョンと GI バージョンの組み合わせでないと、AFD を使用することができません。
今回の検証では、UEKのアップグレードと Release Update 19.4.0.0 のパッチ適用を行いましたが理由は以下となります。- OTN開発者ライセンスでダウンロードできるのは 19.3 ですが、上記 OS Kernel の項で述べた通り AFD サポート対象とするには
Oracle Linux 7 UEK5 の場合は Kernel4.14.35-1902.5.2.1
, GI 19.3 +Patch 27494830
である必要があります。 - ところが
Patch 27494830
は 19.3.0 ではコンフリクトが発生するため、今回の検証ではその Bug Fix が含まれるPatch 29708769 - GI Release Update 19.4.0.0.190716
を適用しています。
サポートマトリクスは My Oracle Support の以下のドキュメントをご確認ください。
ASMFD (ASM Filter Driver) Support on OS Platforms (Certification Matrix). (ドキュメントID 2034681.1)
※My Oracle Support ドキュメントの閲覧、パッチのダウンロードにはOracleサポート契約が必要となりますのでご注意ください。
- OTN開発者ライセンスでダウンロードできるのは 19.3 ですが、上記 OS Kernel の項で述べた通り AFD サポート対象とするには
なお、実機上でAFDがサポートされているか(使用できるか)を確認するには以下のコマンドを実行します。
1 2 |
# /u01/app/19.0.0/grid/bin/acfsdriverstate -orahome /u01/app/19.0.0/grid supported ACFS-9200: Supported |
- 19c ではグリッド・インフラストラクチャ管理リポジトリ(GIMR)の要否を選択できます。
GIMRを無しにした場合、クラスター内部の診断情報やメタデータが収集・利用できなくなりますが、必要なディスクサイズを減らすことができますので検証用途だったり、ディスクが準備できない環境では有益です。
冗長レベル:標準の場合、最低限必要なサイズは以下のように変わります。(詳細はマニュアルをご確認ください)- GIMR 有り:合計60GB
- GIMR 無し:合計 4GB
サイレントインストール
GIのインストール方式としては、GUI インストーラーとCUIサイレントインストールが選択できます。
GUIのほうがメジャーですが、サイレントインストールは X Window 環境を用意する必要がなく汎用的で便利なので、今回はサイレントインストールを実施しました。
サイレントインストールでは、必要なパラメーターを記述するレスポンスファイルを事前に準備する必要があります。
GIインストールディレクトリ配下にデフォルトテンプレートファイルが格納されていますので、gridユーザーでコピーしてパラメーターを編集します。
1 2 |
GRID_HOME:GIインストールディレクトリとした場合 $GRID_HOME/install/response/gridsetup.rsp |
RACやOracle Restartなど、他のGIのインストールタイプに応じてパラメーターを埋めるセクションが決まっており、初見ではどこを編集すればよいのかなかなか見分けがつけ辛いですが、テンプレートファイルのヘッダコメントに入力セクションの指示が書いてあります。
本構成では、以下の内容を埋めれば必要とするクラスターをインストールできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
## Instructions to fill this response file ## ## To register and configure 'Grid Infrastructure for Cluster' ## ## - Fill out sections A,B,C,D,E,F and G ## ## - Fill out section G if OCR and voting disk should be placed on ASM ## →具体的には以下のセクションの情報を埋めていきます。 SECTION A - BASIC SECTION B - GROUPS SECTION C - SCAN SECTION D - CLUSTER & GNS SECTION E - STORAGE SECTION F - IPMI SECTION G - ASM |
コメントに記述ルールも明記されていますので、それに沿ってパラメーターを入れていきます。
今回、実際に追記したパラメーターは以下の通りとなりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ grep -v '#' /home/grid/gridsetup_19c_crsha.rsp | sed '/^$/d' | egrep -v '=$| oracle.install.responseFileVersion' INVENTORY_LOCATION=/u01/app/oraInventory oracle.install.option=CRS_CONFIG ORACLE_BASE=/u01/app/grid oracle.install.asm.OSDBA=asmdba oracle.install.asm.OSOPER=asmoper oracle.install.asm.OSASM=asmadmin oracle.install.crs.config.scanType=LOCAL_SCAN oracle.install.crs.config.gpnp.scanName=hacluster-scan oracle.install.crs.config.gpnp.scanPort=1521 oracle.install.crs.config.ClusterConfiguration=STANDALONE oracle.install.crs.config.configureAsExtendedCluster=false oracle.install.crs.config.clusterName=hacluster oracle.install.crs.config.gpnp.configureGNS=false oracle.install.crs.config.clusterNodes=node1,node2 oracle.install.crs.config.networkInterfaceList=eth1:192.168.100.0:1,eth2:192.168.200.0:5,eth0:192.168.121.0:3 oracle.install.crs.configureGIMR=false oracle.install.crs.config.storageOption=FLEX_ASM_STORAGE oracle.install.crs.config.useIPMI=false oracle.install.asm.SYSASMPassword=We1come$ oracle.install.asm.diskGroup.name=DATA oracle.install.asm.diskGroup.redundancy=NORMAL oracle.install.asm.diskGroup.AUSize=1 oracle.install.asm.diskGroup.disks=/dev/vda,/dev/vdb,/dev/vdc,/dev/vdd,/dev/vde oracle.install.asm.diskGroup.diskDiscoveryString=/dev/vd* oracle.install.asm.monitorPassword=We1come$ oracle.install.asm.configureAFD=true oracle.install.config.managementOption=NONE oracle.install.crs.rootconfig.executeRootScript=false |
oracle.install.crs.config.gpnp.scanName
にはあらかじめ hostsファイルに記入していた SCAN VIP 名を指定します。oracle.install.crs.configureGIMR
をfalse
にして、GIMR 無し構成にします。- ディスク5本全部使って DATA ディスクグループを作成しています。冗長レベルは標準(2重化)としました。このディスクグループに OCRと投票ディスクが格納されます。
oracle.install.asm.configureAFD
をtrue
にして、AFD を有効化します。
サイレントインストールの実行コマンドは、マニュアルの記載が分かりづらいですが、以下のようになります。
事前に編集したレスポンスファイルを指定して、-silent
オプションで実行します。
※下記コマンドの例では、サーバーのメモリ必要要件チェックを無視したいため -ignorePrereqFailure
オプションをつけています。厳密なインストールを行いたいなどの場合は、オプションなしでご確認ください。
1 2 3 |
$ /u01/app/19.0.0/grid/gridSetup.sh -silent -responseFile /home/grid/gridsetup_19c_crsha.rsp \ -printdiskusage -printmemory -printtime -waitForCompletion \ -logLevel finest -ignorePrereqFailure -skipStackCheck -skipPrereqs |
2. ACFSファイルシステム作成、マウント
MySQLのデータを格納する共有ファイルシステムとして、ASM 上で利用できる ASM Cluster File System(ACFS)を作成し、クラスターメンバーノードにマウントさせます。
GIをインストールした時点では ASM は構成されていますが、ACFS はユーザーが必要に応じて手動で作成しなくてはなりません。
DATA ディスクグループの残りの空き容量で、MySQL用の ACFS 領域を作成していきます。
※asmcmd lsdg
コマンドで、ASM ディスクグループの概要情報が確認できます。Usable_file_MB
が冗長レベルを考慮した実際の空き容量になります。
1 2 3 |
$ /u01/app/19.0.0/grid/bin/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 NORMAL N 512 512 4096 1048576 71680 70919 14336 28291 0 Y DATA/ |
今回、ACFSボリュームは以下のように切り出すことにしました。
ディスクグループ | ボリューム名 | サイズ | 用途 | マウントポイント |
---|---|---|---|---|
DATA | ACFSVOL01 | 5G | MySQL yum リポジトリ | /u02/app/mysql/product |
ACFSVOL02 | 10G | MySQL インスタンス1 データ領域 | /u02/app/mysql/datastore/instance1 | |
(ACFSVOL03) | (10G) | (MySQL インスタンス2 データ領域) | (/u02/app/mysql/datastore/instance2) |
※ACFSVOL03はインスタンス2追加時の検証で作成する予定です。
早速 ACFSVOL01
を作成してみます。gridユーザーで実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[node1] $ /u01/app/19.0.0/grid/bin/asmcmd volcreate -G DATA -s 5G ACFSVOL01 $ /u01/app/19.0.0/grid/bin/asmcmd volinfo -G DATA ACFSVOL01 Diskgroup Name: DATA Volume Name: ACFSVOL01 Volume Device: /dev/asm/acfsvol01-122 State: ENABLED Size (MB): 5120 Resize Unit (MB): 64 Redundancy: MIRROR Stripe Columns: 8 Stripe Width (K): 1024 Usage: Mountpath: |
asmcmd volinfo
コマンドで確認できる Volume Device
のデバイスパスはボリューム作成時に決定されます。
このデバイスパスを指定して ACFS をフォーマットします。
1 2 3 4 5 6 |
$ /sbin/mkfs -t acfs /dev/asm/acfsvol01-122 mkfs.acfs: version = 19.0.0.0.0 mkfs.acfs: on-disk version = 46.0 mkfs.acfs: volume = /dev/asm/acfsvol01-122 mkfs.acfs: volume size = 5368709120 ( 5.00 GB ) mkfs.acfs: Format complete. |
マウントするクラスターメンバーノードにてマウントポイントを作成します。
今回は /u02/app/mysql
配下にマウントポイントを設けました。
1 2 3 4 5 |
[node1,2] # useradd -r -g oinstall mysql # mkdir -p /u02/app/mysql/product # chown -R mysql:oinstall /u02 # chmod -R 770 /u02 |
最後にACFS をクラスタリソースに登録し、リソースを起動します。このコマンドは rootユーザーで実行する必要があります。
1 2 3 4 5 |
[node1] # /u01/app/19.0.0/grid/bin/srvctl add filesystem -d /dev/asm/acfsvol01-122 -m /u02/app/mysql/product -u grid -mountowner mysql -mountgroup oinstall -mountperm 770 -fstype ACFS -autostart ALWAYS # /u01/app/19.0.0/grid/bin/srvctl start filesystem -d /dev/asm/acfsvol01-122 # /u01/app/19.0.0/grid/bin/srvctl status filesystem -d /dev/asm/acfsvol01-122 ACFSファイルシステム/u02/app/mysql/productはノードnode1,node2にマウントされます |
ora.data.acfsvol01.acfs
というリソース名で、指定したマウントポイントにマウントされていることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# /u01/app/19.0.0/grid/bin/crsctl stat res -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- : : ora.data.acfsvol01.acfs ONLINE ONLINE node1 mounted on /u02/app/ mysql/product,STABLE ONLINE ONLINE node2 mounted on /u02/app/ mysql/product,STABLE |
df コマンドでも確認できます。
1 2 3 4 5 |
[node1,2] # df -h ファイルシス サイズ 使用 残り 使用% マウント位置 : /dev/asm/acfsvol01-407 2.0G 553M 1.5G 27% /u02/app/mysql/product |
同じ手順で、ACFSVOL02
も作成し、クラスターリソースとして起動させました。
マウントポイントは /u02/app/mysql/datastore/instance1
としました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# /u01/app/19.0.0/grid/bin/crsctl stat res -t ora.data.acfsvol02.acfs ONLINE ONLINE node1 mounted on /u02/app/ mysql/datastore/inst ance1,STABLE ONLINE ONLINE node2 mounted on /u02/app/ mysql/datastore/inst ance1,STABLE # df -h ファイルシス サイズ 使用 残り 使用% マウント位置 : /dev/asm/acfsvol01-407 2.0G 553M 1.5G 27% /u02/app/mysql/product /dev/asm/acfsvol02-410 5.0G 559M 4.5G 11% /u02/app/mysql/datastore/instance1 |
作成した ACFS の領域内で、ファイルの作成や読み書き、削除ができることを確認できれば無事作成完了です。
今回はここまでとなります。
まとめ
-
一般的な GI のインストール以外では、ACFSの構成を行いました。ASMのディスク構成やサイジングについてはMySQLのデータ量に加え、冗長化レベルやディスクグループ・ACFSボリュームの切り方など事前に決定しておく必要があります。
-
記事中では触れていませんでしたが、Oracle Clusterware を用いたHA構成で用いられる共有ディスクファイルシステムは少し前までは OCFS2が主な選択肢でした。
ACFSはASM上のファイルシステムなので元々耐障害性を備えており、かつクラスターリソース管理されることが主なメリットですが、近年のバージョンアップによって対応可能なファイルタイプが増え、機能拡張や安定性も向上していることから今ではこの構成でACFSを利用しない理由はほとんどないのではと考えます。 -
次回は、MySQL 8.0 EE を本環境にインストールし、XAG Agentを用いたクラスターリソースの構成方法を確認していきます。