obshellを使用してクラスタ内の故障ノードを置き換える方法は2つあります:
APIを呼び出して置き換える
obshellコマンドで置き換える
本記事では、3レプリカのOceanBaseクラスタを例に、obshellを使用してクラスタ内の故障ノードを置き換える方法を説明します。
前提条件
OceanBaseクラスタはobshellによって運用管理されていること。詳細な判断方法および接続操作については、非obshellデプロイメントのクラスタの接続を参照してください。
OceanBaseクラスタ内の障害ノードを除くすべてのOBServerノードとobshellが正常に稼働していること。
デプロイメントモード
本記事で使用する3台のマシンの構成は以下のとおりです(obshellはデフォルトポート2886を使用します):
ロール |
マシン |
備考 |
|---|---|---|
| OBServerノード | 10.10.10.1 | OceanBaseデータベースzone1 |
| OBServerノード | 10.10.10.2 | OceanBaseデータベースzone2 |
| OBServerノード | 10.10.10.3 | OceanBaseデータベースzone3、ノードに障害発生(ダウンまたはclogディスク損傷) |
| OBServerノード | 10.10.10.4 | 故障ノード(10.10.10.3)を置き換えるマシン |
APIを使用して障害ノードを置き換える
説明
obshellは呼び出されるAPIに対してセキュリティ検証を実施します。そのため、APIを呼び出すたびに、まずAPI混合暗号化の記事を参照してリクエストを暗号化し、curlコマンドで暗号化されたリクエストヘッダー(${request_headers})とリクエストボディ(${request_body})を設定する必要があります。
ステップ1:クラスタ拡張インターフェースを呼び出す
障害が発生したノード以外の任意のobshellから、/api/v1/ob/scale_out インターフェースを呼び出すことで、障害ノードが存在するゾーンに新しいノードを追加し、クラスタの拡張を開始できます。
コマンドラインで対応するAPIを呼び出す方法については、クラスタの拡張を参照してください。
[admin@test001 ~]$ curl -H "Content-Type: application/json" -H 'X-OCS-Header:${request_headers}' -X POST -d '${request_body}' http://10.10.10.1:2886/api/v1/ob/scale_out
暗号化前のリクエストボディの内容は以下のとおりです:
{
"agentInfo": {
"ip": "10.10.10.4",
"port": 2886
},
"obConfigs": {
"redoDir":"/data/workspace/redo",
"dataDir":"/data/workspace/data",
"datafile_size":"24G",
"cpu_count":"16",
"memory_limit":"16G",
"system_memory":"4G",
"log_disk_size":"24G"
},
"zone": "zone3"
}
obshell-sdk-pythonを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタの拡張を参照してください。
···
client = ClientSet("10.10.10.1", 2886, PasswordAuth("****"))
configs = {"redoDir":"/data/workspace/redo", "dataDir":"/data/workspace/data",
"datafile_size":"24G", "cpu_count":"16", "memory_limit":"16G",
"system_memory":"4G", "log_disk_size":"24G"}
client.v1.scale_out_sync("10.10.10.4", 2886, "zone3", configs) # /api/v1/ob/scale_outを呼び出す
···
obshell-sdk-goを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタのスケールアウトを参照してください。
···
client, err := services.NewClientWithPassword("10.10.10.1", 2886, "****")
configs := map[string]string {
"redoDir":"/data/workspace/redo", "dataDir":"/data/workspace/data",
"datafile_size":"24G", "cpu_count":"16", "memory_limit":"16G",
"system_memory":"4G", "log_disk_size":"24G"}
req := client.V1().NewScaleOutRequest("10.10.10.4", 2886, "zone3", configs)
dag, err := client.V1().ScaleOutSyncWithRequest(req) // /api/v1/ob/scale_outを呼び出す
···
ステップ2:クラスタ縮小APIを呼び出す
任意のobshellの /api/v1/ob/scale_in APIを呼び出すことで、障害が発生したノードをクラスタから削除できます。
コマンドラインで対応するAPIを呼び出す方法の説明については、クラスタの縮小を参照してください。
[admin@test001 ~]$ curl -H "Content-Type: application/json" -H 'X-OCS-Header:${request_headers}' -X POST -d '${request_body}' http://10.10.10.1:2886/api/v1/ob/scale_in
暗号化前のリクエストボディの内容は以下のとおりです:
{
"agent_info": {
"ip": "10.10.10.3",
"port": 2886
},
"force_kill": true
}
obshell-sdk-pythonを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタのスケールインを参照してください。
···
client = ClientSet("10.10.10.1", 2886, PasswordAuth("****"))
client.v1.scale_in_sync("10.10.10.3", 2886, force_kill = True) # /api/v1/ob/scale_inを呼び出す
···
obshell-sdk-goによる対応するAPIメソッドのリクエストについては、クラスタのスケールインを参照してください。
···
client, err := services.NewClientWithPassword("10.10.10.1", 2886, "****")
req := client.V1().NewScaleInRequest("10.10.10.3", 2886).SetForceKill()
dag, err := client.V1().ScaleInSyncWithRequest(req) // /api/v1/ob/scale_inを呼び出す
···
obshellコマンドを使用して障害ノードを置き換える
ステップ1:obshellを起動する
スケールアウト対象のクラスタノード(10.10.10.4)でobshellを起動します。詳細については、obshellの起動と停止のobshellの起動を参照してください。
[admin@test004 ~]$ /home/admin/oceanbase/bin/obshell agent start --ip 10.10.10.4 -P 2886
ステップ2:新しいノードを追加する
コマンドラインでスケールアウトする場合、コマンドはスケールアウト対象のクラスタノードで実行する必要があります。スケールアウト対象のクラスタノード(例では10.10.10.4)でobshell cluster scale-outコマンドを実行します。コマンドの詳細については、obshellクラスタコマンドグループのobshell cluster scale-outを参照してください。
スケールアウト対象ノードにobshellがデプロイされていない場合は、obshell-sdk-pythonまたはobshell-sdk-goを使用してobshellをデプロイできます。詳細については、SDKリファレンス/Python/obshellのインストールまたはSDKリファレンス/GO/obshellのインストールを参照してください。
[admin@test004 ~]$ /home/admin/oceanbase/bin/obshell cluster scale-out -s '10.10.10.1:2886' -z 'zone3' -o 'memory_limit=16G,system_memory=8G,log_disk_size=24G,datafile_size=24G' --rp *****
ステップ3:障害ノードを削除する
障害ノード以外の任意のクラスタノード(例:10.10.10.1)でobshell cluster scale-inコマンドを実行し、障害ノードを強制的に削除します。コマンドの詳細については、obshellクラスタコマンドグループのobshell cluster scale-inを参照してください。
[admin@test001 ~]$ /home/admin/oceanbase/bin/obshell cluster scale-in -s '10.10.10.3:2886' -f