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 インターフェースを呼び出すことで、拡張を開始し、故障ノードが存在するZoneに新しいノードを追加できます。
コマンドラインで対応する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:クラスタの縮小インターフェースを呼び出す
任意のobshellの /api/v1/ob/scale_in インターフェースを呼び出すことで、障害が発生したノードをクラスタから削除できます。
コマンドラインで対応する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