obshellは、obshell以外でデプロイされたOceanBaseクラスタを乗っ取るための2つの方法をサポートしています。
SDKメソッドによる乗っ取り
obshellコマンドによる乗っ取り
本記事では、OCPでデプロイされた3レプリカのOceanBaseクラスタを例に、obshellを使用してOceanBaseクラスタを乗っ取る方法を説明します。OceanBaseクラスタの状態に関係なく、obshellによる乗っ取りは可能です。
デプロイメントモード
本記事で使用される3台のマシンの構成は以下のとおりです。
ロール |
マシン |
備考 |
|---|---|---|
| OBServerノード | 10.10.10.1 | OceanBaseデータベース zone1 |
| OBServerノード | 10.10.10.2 | OceanBaseデータベース zone2 |
| OBServerノード | 10.10.10.3 | OceanBaseデータベース zone3 |
SDKメソッドによるサーバー引き継ぎ
例:obshell-sdk-pythonを使用したクラスタの乗っ取りについては、クラスタの乗っ取りを参照してください。
from obshell import takeover, NodeConfig
def init_nodes():
ips = [
"10.10.10.1",
"10.10.10.2",
"10.10.10.3",
]
work_dir = "/data/ob" # OceanBaseデータベースの作業ディレクトリ
nodes_config = []
for _, ip in enumerate(ips):
node = NodeConfig(ip, work_dir)
nodes_config.append(node)
takeover("pwd", nodes_config) # pwdは乗っ取り対象クラスタのroot@sysユーザーのパスワードを表します。実際のパスワードに置き換えてください。
例を以下に示します。obshell-sdk-goを使用したクラスタの乗っ取りについては、クラスタの乗っ取りを参照してください。
func main() {
ips := []string{
"10.10.10.1",
"10.10.10.2",
"10.10.10.3",
}
workDir := "/data/ob" // OceanBaseデータベースの作業ディレクトリ
nodeConfigs := make([]util.NodeConfig, 0)
for _, ip := range ips {
nodeConfigs = append(nodeConfigs, util.NewNodeConfig(ip, workDir, 2886))
}
// pwdは乗っ取り対象クラスタのroot@sysユーザーのパスワードを表します。実際のパスワードに置き換えてください。
if err := util.Takeover("pwd", nodeConfigs...); err != nil {
panic(err)
}
}
obshellコマンドによるクラスタの乗っ取り
ステップ1:パスワード環境変数を設定する
現在のOceanBaseクラスタのsysテナントのrootユーザーにパスワードが設定されている場合は、任意のOBServerノードで以下のコマンドを実行し、obshellがパスワードを取得できるようにします。ここでは10.10.10.1ノードでの実行を例に説明します。pwdは乗っ取られるクラスタのroot@sysユーザーのパスワードを表します。実際のパスワードに置き換えてください。
[admin@test001 ~]$ export OB_ROOT_PASSWORD="pwd"
ステップ2:クラスタの乗っ取り
ステップ1 のノード(10.10.10.1)で以下のコマンドを実行すると、現在のOceanBaseクラスタ内の各OBServerノードに属するobshellが起動し、乗っ取りが実行されます。obshellはOceanBaseデータベースのインストールディレクトリのbinディレクトリにあります(/home/admin/oceanbase/bin/obshell)。コマンドの詳細については、obshell cluster startを参照してください。
[admin@test001 ~]$ /home/admin/oceanbase/bin/obshell cluster start -a
乗っ取りが成功したかどうかの確認
任意のobshellの/api/v1/ob/infoインターフェースを呼び出し、agent_infoのidentityがCLUSTER AGENTの場合、現在のOceanBaseクラスタはobshellによって運用されています。インターフェースの詳細については、OceanBase情報のクエリを参照してください。
説明
obshellは呼び出されたAPIに対してセキュリティ検証を行います。そのため、APIを呼び出すたびに、API混合暗号化を参照してリクエストを暗号化し、curlコマンドで暗号化されたリクエストヘッダー(${request_headers})とリクエストボディ(${request_body})を設定する必要があります。
呼び出し
[admin@test001 ~]$ curl -H 'X-OCS-Header:${request_headers}' -X GET http://10.10.10.1:2886/api/v1/ob/info戻り値
{ ....... "agent_info": [ { "ip": "10.10.10.1", "identity": "CLUSTER AGENT", ...... }, { "ip": "10.10.10.2", "identity": "CLUSTER AGENT", ...... }, { "ip": "10.10.10.3", "identity": "CLUSTER AGENT", ...... } ], ...... }
説明
OceanBaseクラスタがobshellによって運用されている場合、乗っ取りは成功しています。