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:クラスタの縮小インターフェースを呼び出す
任意の 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を使用してインストールできます。詳細については、SDKリファレンス/Python/obshellのインストールまたはSDKリファレンス/Golang/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