本記事では、アップグレードスクリプトを使用してOceanBaseクラスタをアップグレードする方法について説明します。
注意
OceanBaseデータベースは、V4.2.x系またはそれ以前のバージョンからV4.3.x系へのアップグレードを現在サポートしていません。
前提条件
すべてのOBServerノードにPython 2の環境がインストール済みであり、Python 2に対応したmysql.connectorモジュールもインストールされていること。
注意
OceanBaseクラスタがアービトレーションサービスに関連付けられている場合、OceanBaseクラスタのバージョンをアップグレードする際には、まずアービトレーションサービスのバージョンをアップグレードしてから、OceanBaseクラスタのバージョンをアップグレードする必要があります。アービトレーションサービスのバージョンアップグレードの詳細については、アービトレーションサービスのアップグレードを参照してください。
システムテナントのクエリビューoceanbase.DBA_OB_ARBITRATION_SERVICEを使用して、このOceanBaseクラスタがアービトレーションサービスに関連付けられているかどうかを確認できます。その他のアップグレードに関する注意事項については、アップグレードの概要を参照してください。
操作手順
注意
以下の手順でアップグレードスクリプトを実行する際、指定された -u パラメータは、sys テナントに対して読み取りおよび書き込み権限と SUPER 権限を持つユーザーである必要があります。
oceanbase_upgrade_dep.ymlファイルを分析します。- アップグレードプロセスを確認します。
- クラスタ構成パラメータをバックアップします。
- ターゲットRPMパッケージをアップロードしてインストールします。
- スクリプト
upgrade_checker.pyを実行します。 - スクリプト
upgrade_pre.pyを実行します。 - クラスタをアップグレードします。
- スクリプト
upgrade_post.pyを実行します。 - クラスタ構成パラメータを復元します。
ステップ1:oceanbase_upgrade_dep.ymlファイルを分析する
ターゲットバージョンのOceanBase RPMパッケージを解凍すると、oceanbase_upgrade_dep.yml ファイルが取得できます。このファイルには、OceanBaseクラスタのバージョンアップグレードトポロジーが記録されています。手順は以下のとおりです:
ターゲットバージョンのOceanBase RPMインストールパッケージを取得します。
OceanBase公式サイトの左上にある リソース > ダウンロードセンター をクリックして、対応するバージョンのRPMパッケージを取得します。対応するバージョンのインストールパッケージが見つからない場合は、テクニカルサポートに連絡してターゲットバージョンのRPMパッケージを取得してください。
OceanBase RPMパッケージを解凍します。
以下のコマンドを使用して、OceanBase RPMパッケージを現在のディレクトリに解凍できます:
[xxx@xxx $rpm_dir]# sudo rpm2cpio $rpm_name | cpio -divここで、
$rpm_nameはRPMパッケージの名前を表します。説明
RPMパッケージの解凍が完了すると、RPMパッケージが保存されているディレクトリに
homeとuseの2つのディレクトリが作成されます。アップグレード関連スクリプトとoceanbase_upgrade_dep.ymlファイルはhome/admin/oceanbase/etcディレクトリに保存されます。oceanbase_upgrade_dep.ymlファイルを分析します。oceanbase_upgrade_dep.ymlファイルの関連プロパティの意味:version:現在のOceanBaseデータベースのバージョン番号。以下、現在のバージョンと略称します。can_be_upgraded_to:現在のOceanBaseデータベースのバージョンからアップグレードできるターゲットバージョン番号。以下、ターゲットバージョンと略称します。deprecated:現在のバージョンがアップグレードのターゲットバージョンとして使用できるかどうか。trueの場合、アップグレードのターゲットバージョンとして使用できません。例えば、例の4.1.0.0-100000982023031415バージョンはターゲットバージョンとして使用できません。require_from_binary:アップグレードシーケンスに現在のバージョンが含まれている場合、現在のバージョンにアップグレードする必要があるかどうか、つまり現在のバージョンがアップグレードシーケンス内のバリアバージョンであるかどうか。value:値がtrueの場合、when_come_fromプロパティと組み合わせて使用します。when_come_from:リストです。when_come_fromが定義されていない場合、任意のバージョンからターゲットバージョンへのアップグレード時には、まず現在のバリアバージョンにアップグレードする必要があります。when_come_fromが定義されている場合、リスト内のバージョン番号からターゲットバージョンへのアップグレード時には、まず現在のバリアバージョンにアップグレードする必要があります。例えば、例の4.0.0.0および4.1.0.0-100000982023031415バージョンのOceanBaseクラスタをV4.2.0.0バージョンにアップグレードする場合、まずV4.1.0.1(バリア)バージョンにアップグレードする必要があります。
例:
假定してください。
oceanbase_upgrade_dep.ymlファイル内のOceanBaseクラスタの各バージョンのアップグレード依存関係は次のとおりです:- version: 4.0.0.0 can_be_upgraded_to: - 4.1.0.0 - version: 4.1.0.0-100000982023031415 can_be_upgraded_to: - 4.1.0.0 deprecated: True - version: 4.1.0.0 can_be_upgraded_to: - 4.1.0.1 - version: 4.1.0.1 can_be_upgraded_to: - 4.2.0.0 require_from_binary: value: True when_come_from: [4.0.0.0, 4.1.0.0-100000982023031415] # 4.3.0.x - version: 4.3.0.0 can_be_upgraded_to: - 4.3.0.1 - version: 4.3.0.1 can_be_upgraded_to: - 4.3.1.0例ファイルを分析することで、以下のアップグレードシーケンスを得ることができます:
- V4.0.0.0 > V4.1.0.0 > V4.1.0.1(バリア) > V4.2.0.0
- V4.1.0.0-100000982023031415 > V4.1.0.0 > V4.1.0.1(バリア) > V4.2.0.0
- V4.1.0.0 > V4.1.0.1 > V4.2.0.0
- V4.3.0.0 > V4.3.0.1 > V4.3.1.0
注意
アップグレードシーケンスにバリアバージョンが存在する場合、アップグレードパス内のすべてのバリアバージョンのOceanBase RPMパッケージも取得する必要があります。
ステップ2:アップグレードプロセスの確認
注意
OceanBaseクラスタの現行バージョンと目標バージョンの間にバリアバージョンが存在する場合、OceanBaseクラスタはまずバリアバージョンにアップグレードし、その後バリアバージョンから目標バージョンにアップグレードする必要があります。
ステップ1の例によるアップグレードシーケンスを通じて、以下の情報を得ることができます:
現在使用しているOceanBaseクラスタのバージョンがV4.0.0.0またはV4.1.0.0-100000982023031415の場合、アップグレード時にOceanBaseクラスタはまずV4.1.0.1(バリア)バージョンにアップグレードし、その後V4.1.0.1(バリア)バージョンからV4.2.0.0バージョンにアップグレードする必要があります。
現在使用しているOceanBaseクラスタのバージョンがV4.1.0.0またはV4.1.0.1の場合、アップグレード時にOceanBaseクラスタは直接V4.2.0.0バージョンにアップグレードできます。
現在使用しているOceanBaseクラスタのバージョンがV4.3.0.0またはV4.3.0.1の場合、アップグレード時にOceanBaseクラスタは直接V4.3.1.0バージョンにアップグレードできます。
例:
以下では、3レプリカのOceanBaseクラスタを例にアップグレードプロセスを説明します。
アップグレードパスにバリアバージョンが含まれています。現在のOceanBaseクラスタのバージョンがV4.0.0.0の場合、アップグレードプロセスは次のとおりです:
- 最初に、Zone1をV4.0.0.0からV4.1.0.1(バリア)に、次にZone2をV4.0.0.0からV4.1.0.1(バリア)に、そしてZone3をV4.0.0.0からV4.1.0.1(バリア)にアップグレードします。これにより、クラスタ全体がV4.0.0.0からV4.1.0.1(バリア)にアップグレードされます。
- その後、再びZoneの順序に従って、Zone1、Zone2、Zone3をV4.1.0.1(バリア)からV4.2.0.0に順次アップグレードします。すべてのZoneがV4.2.0.0にアップグレードされたら、クラスタのアップグレードは完了です。
アップグレードパスにバリアバージョンが含まれていません。現在のOceanBaseクラスタのバージョンがV4.3.0.0の場合、アップグレードプロセスは次のとおりです:
最初に、Zone1をV4.3.0.0からV4.3.1.0に、次にZone2をV4.3.0.0からV4.3.1.0に、そしてZone3をV4.3.0.0からV4.3.1.0にアップグレードします。すべてのZoneがV4.3.1.0にアップグレードされたら、クラスタのアップグレードは完了です。
ステップ3:クラスタ構成パラメータのバックアップ
アップグレードプロセスを開始する前に、以下の構成パラメータの旧値をバックアップしておき、アップグレード後に復元します。
sys テナント(システムテナント)で以下のSQLステートメントを実行し、バックアップする必要がある構成パラメータの値を取得します。
SELECT SVR_IP,ZONE,NAME,VALUE FROM OCEANBASE.GV$OB_PARAMETERS WHERE NAME IN ("server_permanent_offline_time", "enable_rebalance", "enable_rereplication");
ステップ4:ターゲットRPMパッケージのアップロードとインストール
scpコマンドを使用して、アップグレードに必要なOceanBase RPMパッケージをOBServerノードにアップロードします。scp $rpm_name admin@$observer_ip:/$rpm_dirパラメータの説明:
$rpm_name:RPMパッケージの名前を表します。$observer_ip:OBServerノードのIPアドレスを表します。$rpm_dir:RPMパッケージを保存するディレクトリを表します。
例:
scp oceanbase-4.2.0.0-100010022023081911.el7.x86_64.rpm admin@10.10.10.1:/home/admin/rpm以下のコマンドを使用してOceanBase RPMパッケージをインストールします。
注意
- アップグレードパスにbarrierバージョンが存在する場合は、まず対応するbarrierバージョンのRPMパッケージをインストールしてください。クラスタが正常にbarrierバージョンにアップグレードされた後、ターゲットバージョンのRPMパッケージをインストールします。
- アップグレードパスに複数のbarrierバージョンが存在する場合は、順番に従ってbarrierバージョンをインストールおよびアップグレードし、クラスタが最後のbarrierバージョンに正常にアップグレードされてから、ターゲットバージョンのRPMパッケージをインストールします。
rpm -Uvh $rpm_nameここで、
$rpm_nameはRPMパッケージの名前を表します。説明
アップグレード関連スクリプトと
oceanbase_upgrade_dep.ymlファイルは、/home/admin/oceanbase/etcディレクトリに保存されています。ディレクトリ/home/admin/oceanbase/etcはOceanBaseデータベースのデフォルトのインストールディレクトリです。ステップ1~2をすべてのOBServerノードで繰り返し、ターゲットバージョンのRPMパッケージがインストールされるまで続けます。
ステップ5:スクリプトupgrade_checker.pyを実行する
任意のOBServerノードで、sysテナントが直接接続するOBServerノードのログイン情報を指定し、upgrade_checker.pyスクリプトを実行してアップグレードの事前チェックを行います。スクリプトの実行に成功した場合は、アップグレードを続けることができます。コマンドは以下のとおりです:
python upgrade_checker.py -h 127.0.0.1 -P 2881 -u $user_name@sys -p$password
パラメータの説明:
$user_name:sysテナントが読み取りおよび書き込み権限を持ち、グローバルシステムパラメータを変更できるユーザーを表します。$password:ユーザーのパスワードを表します。
例:
以下のコマンドを使用して、
/home/admin/oceanbase/etcディレクトリに移動します。cd /home/admin/oceanbase/etc以下のコマンドを使用して、
upgrade_checker.pyスクリプトを実行し、アップグレードの事前チェックを行います。[root@xxx /home/admin/oceanbase/etc]# python upgrade_checker.py -h 127.0.0.1 -P 2881 -u root@sys -p******
ステップ6:スクリプトupgrade_pre.pyを実行する
任意のOBServerノードで、sysテナントが直接接続するOBServerノードのログイン情報を指定し、upgrade_pre.pyスクリプトを実行します。スクリプトの実行に成功した場合、アップグレードを続けることができます。コマンドは以下のとおりです:
python upgrade_pre.py -h 127.0.0.1 -P 2881 -u $user_name@sys -p$password
パラメータの説明:
$user_name:sysテナントが読み取りおよび書き込み権限を持ち、グローバルシステムパラメータを変更できるユーザーを表します。$password:ユーザーのパスワードを表します。
upgrade_pre.pyスクリプトは、以下のコマンドとアクションを実行します:
alter system begin upgrade。alter system begin rolling upgrade。special pre action:構成パラメータを無効にして調整します。health check:クラスタレベルのヘルスチェックを実行します。
完全なupgrade_pre.pyスクリプトの機能は以下のとおりです:
./upgrade_pre.py [OPTIONS]
-I, --help Display this help and exit.
-V, --version Output version information and exit.
-h, --host=name Connect to host.
-P, --port=name Port number to use for connection.
-u, --user=name User for login.
-p, --password=name Password to use when connecting to server. If password is
not given it's empty string "".
-t, --timeout=name Cmd/Query execute timeout(s).
-m, --module=name Modules to run. Modules should be a string combined by some of
the following strings:
1. begin_upgrade
2. begin_rolling_upgrade
3. special_action
4. health_check
5. all: "all" represents that all modules should be run.
They are splitted by ",".
For example: -m all, or --module=begin_upgrade,begin_rolling_upgrade,special_action
-l, --log-file=name Log file path. If log file path is not given it's ./upgrade_pre.log
Maybe you want to run cmd like that:
./upgrade_pre.py -h 127.0.0.1 -P 2881 -u ****** -p ******
例:
以下のコマンドを使用して、
/home/admin/oceanbase/etcディレクトリに移動します。cd /home/admin/oceanbase/etc以下のコマンドを使用して、
upgrade_pre.pyスクリプトを実行し、アップグレード前のチェックを行います。[root@xxx /home/admin/oceanbase/etc]# python upgrade_pre.py -h 127.0.0.1 -P 2881 -u root@sys -p******
ステップ7:クラスタのアップグレード
ゾーンごとにアップグレードを行い、各ゾーンについて以下の手順を実行します。zone1 を例に説明します。
以下のコマンドを実行して、クラスタレベルのヘルスチェックを実行します。
python upgrade_health_checker.py -h 127.0.0.1 -P 2881 -u $user_name@sys -p$passwordパラメータの説明:
$user_name:sysテナントがグローバルシステムパラメータの読み取り、書き込み、変更権限を持つユーザーを表します。$password:ユーザーのパスワードを表します。
例:
以下のコマンドを使用して、
/home/admin/oceanbase/etcディレクトリに移動します。cd /home/admin/oceanbase/etc以下のコマンドを使用して、
upgrade_health_checker.pyスクリプトを実行し、クラスタレベルのヘルスチェックを実行します。[root@xxx /home/admin/oceanbase/etc]# python upgrade_health_checker.py -h 127.0.0.1 -P 2881 -u root@sys -p******
ゾーンを停止します(
STOP ZONE)。注意
単一マシンまたは単一レプリカのOceanBaseデータベースをアップグレードする場合、ゾーンを停止する必要はありません(
STOP ZONE)。rootユーザーでクラスタのsysテナントにログインし、以下のコマンドを使用してゾーンを停止します。ここで、$zone_nameはゾーンの名前です。コマンドは以下のとおりです:ALTER SYSTEM STOP ZONE '$zone_name';STOP ZONEコマンドは、リーダー(Leader)がすべて切り替わってから成功を返します。例:
obclient [(none)]> ALTER SYSTEM STOP ZONE 'zone1';以下のSQLコマンドを使用して、ゾーンの状態を確認できます。
obclient [(none)]> SELECT ZONE,STATUS FROM oceanbase.DBA_OB_ZONES;実行結果は次のとおりです:
+-------+----------+ | ZONE | STATUS | +-------+----------+ | zone1 | INACTIVE | | zone2 | ACTIVE | | zone3 | ACTIVE | +-------+----------+ 3 rows in setゾーン内のマシンのプロセスを停止し、新バージョンのバイナリに置き換えて再起動します。
observerプロセスを停止し、再度起動します。
adminユーザーに切り替えます。[root@xxx /home/admin/oceanbase/etc]# su - adminobserverプロセスを停止します。
-bash-4.2$ kill -9 `pidof observer`observerプロセスを再起動します。
-bash-4.2$ cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer説明
observerプロセスを再度起動する際には、起動パラメータを指定する必要はありません。以前の起動パラメータはすでにパラメータファイルに書き込まれています。
ゾーンレベルのヘルスチェックを実行します。
ゾーンレベルのヘルスチェックは基本的にクラスタレベルのヘルスチェックロジックを再利用しており、指定されたゾーンのすべてのマシン関連状態を検証します。コマンドは以下のとおりです:
python upgrade_health_checker.py -h 127.0.0.1 -P 2881 -u $user_name@sys -p$password -z '$zone_name'パラメータの説明:
$user_name:sysテナントがグローバルシステムパラメータの読み取り、書き込み、変更権限を持つユーザーを表します。$password:ユーザーのパスワードを表します。$zone_name:ゾーンの名前を表します。
例:
以下のコマンドを使用して、
/home/admin/oceanbase/etcディレクトリに移動します。cd /home/admin/oceanbase/etc以下のコマンドを使用して、
upgrade_health_checker.pyスクリプトを実行し、ゾーンレベルのヘルスチェックを実行します。[root@xxx /home/admin/oceanbase/etc]# python upgrade_health_checker.py -h 127.0.0.1 -P 2881 -u root@sys -p****** -z 'zone1'
ゾーンを起動します(
start zone)。rootユーザーでクラスタのsysテナントにログインし、以下のコマンドを使用してゾーンを起動します。ここで、$zone_nameはゾーンの名前です。コマンドは以下のとおりです:ALTER SYSTEM START ZONE '$zone_name';例:
obclient [(none)]> ALTER SYSTEM START ZONE 'zone1';ステップ1~5を繰り返し、すべてのゾーンのアップグレードが完了するまで続けます。
ステップ8:スクリプトupgrade_post.pyを実行する
任意のOBServerノードで、sysテナントが直接接続するOBServerノードのログイン情報を指定し、upgrade_post.pyスクリプトを実行して主要なアップグレード操作および関連チェックを完了します。コマンドは以下のとおりです:
python upgrade_post.py -h 127.0.0.1 -P 2881 -u $user_name@sys -p$password
注意
アップグレードスクリプト upgrade_post.py を実行する際にエラーが発生した場合、その原因はRSの切り替えによるものである可能性が高いです。以下の手順でトラブルシューティングと修復を行うことを推奨します:
SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE job_type = 'upgrade_all' ORDER BY job_id DESC LIMIT 1;を実行して、アップグレードタスクの状態を確認します。JOB_STATUSがinprogressであり、かつMODIFY_TIMEが最新時間(現在時刻からの経過時間が短い)である場合、ALTER SYSTEM RUN UPGRADE JOB 'UPGRADE_ALL';コマンドを手動で実行することでこの問題を解決できます。- アップグレードスクリプトを再度実行します。
パラメータの説明:
$user_name:sysテナントが読み取りおよび書き込み権限を持ち、グローバルシステムパラメータを変更できるユーザーを表します。$password:ユーザーのパスワードを表します。
upgrade_post.pyスクリプトは、以下のアップグレード操作を完了します:
- クラスタレベルのヘルスチェック。
alter system end rolling upgrade。- テナントごとにbegin upgradeを実行します。
- テナントごとにシステム変数の修正を実行します。
- テナントごとにシステムテーブルの修正を実行します。
- テナントごとに仮想テーブル/ビューの修正を実行します。
- テナントごとにバージョン関連のアップグレード操作を実行します。
- テナントごとに内部テーブルの自己検査操作を実行します。
- テナントごとにend upgradeを実行します。
- alter system end upgrade:クラスタのアップグレード状態を終了します。
- upgrade post check:アップグレード中に無効になった一部の構成パラメータを再有効化し、チェックを実行します。
上記のステップ3~5、7、9は、以下のアップグレードシナリオでは実行されません:
- 同じバージョンへのアップグレード。
- バージョン間のアップグレードで、元のバージョンとターゲットバージョンのデータバージョンが一致している場合。
完全な upgrade_post.pyスクリプトの機能は以下のとおりです:
./upgrade_post.py [OPTIONS]
-I, --help Display this help and exit.
-V, --version Output version information and exit.
-h, --host=name Connect to host.
-P, --port=name Port number to use for connection.
-u, --user=name User for login.
-p, --password=name Password to use when connecting to server. If password is
not given it's empty string "".
-t, --timeout=name Cmd/Query execute timeout(s).
-m, --module=name Modules to run. Modules should be a string combined by some of
the following strings:
1. health_check
2. end_rolling_upgrade
3. tenant_upgrade
4. end_upgrade
5. post_check
6. all: "all" represents that all modules should be run.
They are splitted by ",".
For example: -m all, or --module=health_check,begin_rolling_upgrade
-l, --log-file=name Log file path. If log file path is not given it's ./upgrade_pre.log
Maybe you want to run cmd like that:
./upgrade_post.py -h 127.0.0.1 -P 2881 -u *** -p ******
例:
以下のコマンドを使用して、
/home/admin/oceanbase/etcディレクトリに移動します。cd /home/admin/oceanbase/etc以下のコマンドを使用して、
upgrade_post.pyスクリプトを実行し、主要なアップグレード操作および関連チェックを完了します。[root@xxx /home/admin/oceanbase/etc]# python upgrade_post.py -h 127.0.0.1 -P 2881 -u root@sys -p******
ステップ9:クラスタ構成パラメータの復元
ステップ3 でバックアップした構成パラメータの古い値に基づき、root ユーザーとしてクラスタの sys テナントにログインし、以下のコマンドを使用して関連する構成パラメータを復元します。
ALTER SYSTEM SET $parameter value= $parameter_value
パラメータの説明:
$parameter:構成パラメータの名前を表します。$parameter_value:構成パラメータの値を表します。
例:
server_permanent_offline_timeの値を復元します。obclient [(none)]> ALTER SYSTEM SET server_permanent_offline_time = '3600s';enable_rebalanceの値を復元します。obclient [(none)]> ALTER SYSTEM SET enable_rebalance = 'True';enable_rereplicationの値を復元します。obclient [(none)]> ALTER SYSTEM SET enable_rereplication = 'True';
次のステップ
アップグレード後の確認
アップグレードが完了したかどうかを確認するには、アップグレード後の確認を参照してください。
cgroupの再設定
アップグレード前にOceanBaseクラスタでcgroupが設定されていた場合、OceanBaseクラスタのアップグレード後にcgroupを再設定する必要があります。詳細については、cgroupの設定を参照してください。
関連ドキュメント
- OceanBaseデータベースへの接続に関する詳細は、接続方法の概要を参照してください。
- Zoneの起動に関する詳細は、Zoneの起動を参照してください。
- パラメータ型の変更に関する詳細は、ALTER SYSTEM PARAMETERを参照してください。