obshellを使用したOceanBaseクラスタのデプロイは、以下の2つの方法をサポートしています。
APIを呼び出してデプロイする
obshellコマンドでデプロイする
前提条件
OceanBaseデータベースをデプロイする前に、以下の事項を確認してください:
お使いのマシンがソフトウェアおよびハードウェア要件を満たしていること。詳細については、ソフトウェアおよびハードウェア要件を参照してください。
本番環境では、環境および設定のチェックが必要です。具体的な操作については、デプロイ前の設定の章を参照してください。
用語解説
Single Agent:obshell Agentの一種であり、obshellの初期アイデンティティです。joinコマンドを使用してSingle AgentからMaster AgentまたはFollower Agentに変換できます。
Master Agent:obshell Agentの一種です。initコマンドを使用してMaster AgentからCluster Agentに変換できます。removeコマンドを使用してMaster AgentからSingle Agentに変換できます。
Follower Agent:obshell Agentの一種です。initコマンドを使用してFollower AgentからCluster Agentに変換できます。removeコマンドを使用してFollower AgentからSingle Agentに変換できます。
Cluster Agent:obshell Agentの一種です。
OceanBaseクラスタの初期化(init)は中央集権的なタスクであり、この段階ではobshell AgentにはMaster AgentとFollower Agentの2つのアイデンティティが存在します。initタスクはMaster Agentがすべてのobshellをリードして完了します。init完了後、クラスタは非中央集権化され、すべてのobshellは単一のアイデンティティ(Cluster Agent)を持ちます。
アイデンティティ変換の状態遷移図は以下のとおりです:
デプロイメントモード
本記事では、3レプリカデプロイメントモードを採用し、3台のマシンを使用します。実際の状況に応じて適切なデプロイメント計画を選択できます。本記事で使用される3台のマシンの役割は以下のとおりです。
ロール |
マシン |
備考 |
|---|---|---|
| OBServerノード | 10.10.10.1 | OceanBaseデータベースzone1、init完了前はMaster Agent |
| OBServerノード | 10.10.10.2 | OceanBaseデータベースzone2、init完了前はFollower Agent |
| OBServerノード | 10.10.10.3 | OceanBaseデータベースzone3、init完了前はFollower Agent |
APIによるデプロイ
説明
コマンドラインでAPIを呼び出す際は、以下の点にご注意ください:
以下のAPIを呼び出すと非同期タスクが作成されるため、次の手順を実行する前にタスクが完了していることを確認する必要があります。詳細な手順については、タスクの詳細情報を取得するを参照してください。
obshellは呼び出されたAPIに対してセキュリティ検証を行います。そのため、APIを呼び出すたびに、まずAPI混合暗号化を参照してリクエストを暗号化し、curlコマンドで暗号化後のリクエストヘッダー(
${request_headers})とリクエストボディ(${request_body})を設定する必要があります。
ステップ1:obshellを起動する
obshellはOceanBaseデータベースのインストールディレクトリにあります(
/home/admin/oceanbase/bin/obshell)。各ノードでobshellを起動します。コマンドの詳細については、obshell agent startを参照してください。
10.10.10.1ノードで以下のコマンドを実行します:[admin@test001 ~]$ /home/admin/oceanbase/bin/obshell agent start --ip 10.10.10.1 -P 288610.10.10.2ノードで以下のコマンドを実行します:[admin@test002 ~]$ /home/admin/oceanbase/bin/obshell agent start --ip 10.10.10.2 -P 288610.10.10.3ノードで以下のコマンドを実行します:[admin@test003 ~]$ /home/admin/oceanbase/bin/obshell agent start --ip 10.10.10.3 -P 2886
ステップ2:Single AgentをMaster Agentに切り替える
Single Agent(10.10.10.1ノード)に対して /api/v1/agent/join を呼び出し、リクエストでobshellを自身(10.10.10.1:2886)と指定することで、Single AgentからMaster Agentへのアイデンティティ切り替えが完了します。
コマンドラインで対応する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/agent/join
obshell-sdk-pythonを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタ初期化前にノードを追加するを参照してください。
···
client = ClientSet("10.10.10.1", 2886)
client.v1.join_sync("10.10.10.1", 2886, "zone1") # /api/v1/agent/joinを呼び出す
···
obshell-sdk-goによる対応するAPIメソッドのリクエストについては、クラスタ初期化前にノードを追加するを参照してください。
···
client, err := services.NewClient("10.10.10.1", 2886)
joinRequest1 := client.V1().NewJoinRequest("10.10.10.1", 2886, "zone1")
dag, err := client.V1().JoinSyncWithRequest(joinRequest1) // /api/v1/agent/joinを呼び出す
···
ステップ3:Single AgentをFollower Agentに切り替える
Single Agent(ノード10.10.10.2および10.10.10.3)に対して/api/v1/agent/joinを呼び出し、リクエストでobshellをMaster Agent(10.10.10.1:2886)と指定することで、Single AgentからFollower Agentへのアイデンティティ切り替えが完了します。
コマンドラインで対応するAPIを呼び出す方法の説明については、クラスタ初期化前にノードを追加するを参照してください。
任意のノードで以下のコマンドを実行します:
10.10.10.2のアイデンティティをフォロワーエージェントに切り替えます。[admin@test001 ~]$ curl -H "Content-Type: application/json" -H 'X-OCS-Header:${request_headers}' -X POST -d '${request_body}' http://10.10.10.2:2886/api/v1/agent/join10.10.10.3のアイデンティティをフォロワーエージェントに切り替えます。[admin@test001 ~]$ curl -H "Content-Type: application/json" -H 'X-OCS-Header:${request_headers}' -X POST -d '${request_body}' http://10.10.10.3:2886/api/v1/agent/join
obshell-sdk-pythonを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタ初期化前にノードを追加するを参照してください。
···
client = ClientV1("10.10.10.1", 2886)
client.v1.join_sync("10.10.10.2", 2886, "zone2") # /api/v1/agent/joinを呼び出す
client.v1.join_sync("10.10.10.3", 2886, "zone3") # /api/v1/agent/joinを呼び出す
···
obshell-sdk-goを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタ初期化前にノードを追加するを参照してください。
···
client, err := v1.NewClient("10.10.10.1", 2886)
joinRequest2 := client.V1().NewJoinRequest("10.10.10.2", 2886, "zone2")
dag, err := client.V1().JoinSyncWithRequest(joinRequest2) // /api/v1/agent/joinを呼び出す
joinRequest3 := client.V1().NewJoinRequest("10.10.10.3", 2886, "zone3")
dag, err = client.V1().JoinSyncWithRequest(joinRequest3) // /api/v1/agent/joinを呼び出す
···
ステップ4:クラスタレベルの設定を設定する
obshellでMaster Agentとして認識されているノードに対して、/api/v1/obcluster/config を呼び出すことで、クラスタレベルの設定を設定できます。
コマンドラインで対応するAPIを呼び出す方法の詳細については、クラスタレベル設定の設定を参照してください。
[admin@test001 ~]$ curl -H "Content-Type: application/json" -H 'X-OCS-Header:${request_headers}' -X PUT -d '${request_body}' http://10.10.10.1:2886/api/v1/obcluster/config
obshell-sdk-pythonを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタレベル設定の設定を参照してください。
···
client = ClientSet("10.10.10.1", 2886)
client.v1.config_obcluster_sync("ob-test", 1, "****") # /api/v1/obcluster/configを呼び出す
···
obshell-sdk-goを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタレベル設定の設定を参照してください。
···
client, err := services.NewClientWithPassword("10.10.10.1", 2886)
configObclusterReq := client.V1().NewConfigObclusterRequest("ob-test", 1).SetRootPwd("****")
dag, err := client.V1().ConfigObclusterSyncWithRequest(configObclusterReq) // /api/v1/obcluster/configを呼び出す
···
ステップ5:サーバーレベルの設定を設定する
obshellがMaster Agentとして認識されているノードに対して /api/v1/observer/config を呼び出し、リクエストで適用範囲を指定することで、指定したobshellにサーバーレベルの設定を設定できます。
コマンドラインで対応するAPIを呼び出す方法の詳細については、サーバーレベル構成の設定を参照してください。
[admin@test001 ~]$ curl -H "Content-Type: application/json" -H 'X-OCS-Header:${request_headers}' -X PUT -d '${request_body}' http://10.10.10.1:2886/api/v1/observer/config
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":"40G"}
client.v1.config_observer_sync(configs, "GLOBAL", []) # /api/v1/observer/configを呼び出す
···
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":"40G"}
configObserverReq := client.V1().NewConfigObserverRequest(configs, v1.SCOPE_GLOBAL)
dag, err := client.V1().ConfigObserverSyncWithRequest(configObserverReq) // /api/v1/observer/configを呼び出す
···
ステップ6:クラスタの初期化
obshellでMaster Agentとして認識されているノードに対して、/api/v1/ob/initコマンドを実行することで、クラスタの初期化を行えます。
コマンドラインで対応するAPIを呼び出す方法の詳細については、クラスタの初期化を参照してください。
[admin@test001 ~]$ curl -H 'X-OCS-Header:${request_headers}' -X POST http://10.10.10.1:2886/api/v1/ob/init
obshell-sdk-pythonを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタの初期化を参照してください。
···
client = ClientSet("10.10.10.1", 2886, PasswordAuth("****"))
client.v1.init_sync() # /api/v1/ob/initを呼び出す
···
obshell-sdk-goを使用して対応するAPIメソッドをリクエストする方法の詳細については、クラスタの初期化を参照してください。
···
client, err := services.NewClientWithPassword("10.10.10.1", 2886, "****")
initReq := client.V1().NewInitRequest()
dag, err := client.V1().InitSyncWithRequest(initReq) // /api/v1/ob/initを呼び出す
···
ステップ7:OceanBaseクラスタへの接続
ここでは、OBClientを使用してOceanBaseデータベースに接続する例を説明します。コマンドは以下のとおりです:
[admin@test001 ~]$ obclient -h10.10.10.1 -uroot@sys -P2881 -p -A
-h:OceanBaseデータベースの接続IPアドレスを指定します。これはobshell起動時に指定したIPアドレスで、例:10.10.10.1。-u:テナントの接続アカウントを指定します。形式はユーザー名@テナント名です。MySQLテナントの管理者ユーザー名はデフォルトでrootです。-P:OceanBaseデータベースの接続ポートを指定します。ステップ5で指定しなかった場合、デフォルトポート2881が使用されます。-p:OceanBaseデータベースアカウントのパスワードを指定します。-A:OBClientがデータベースに接続する際に統計情報を自動取得しないことを示します。
OceanBaseクラスタへの接続方法の詳細な操作については、OceanBaseデータベースへの接続の章を参照してください。
全コード例
from obshell import ClientSet
from obshell.auth import PasswordAuth
client = ClientSet("10.10.10.1", 2886)
# join で自分自身をマスターにする
client.v1.join_sync("10.10.10.1", 2886, "zone1")
# フォロワーをクラスターに追加する
client.v1.join_sync("10.10.10.2", 2886, "zone2")
client.v1.join_sync("10.10.10.3", 2886, "zone3")
# OceanBaseクラスタの設定情報を設定する
client.v1.config_obcluster_sync("test-sdk", 11, "****")
# 各OBServerノードのパラメータを設定する
configs = {
"datafile_size": "24G", "log_disk_size": "24G",
"cpu_count": "16", "memory_limit": "16G", "system_memory": "8G",
"enable_syslog_recycle": "true", "enable_syslog_wf": "true"}
client.v1.config_observer_sync(configs, "GLOBAL", [])
# クラスタを初期化する
client.v1.init_sync()
# 現在のクラスタの状態情報を取得する
status = client.v1.get_status()
print(status)
package main
import (
"github.com/oceanbase/obshell-sdk-go/services"
"github.com/oceanbase/obshell-sdk-go/services/v1"
)
func main() {
client, err := services.NewClient("10.10.10.1", 2886)
if err != nil {
return
}
// join により自身を MASTER として参加させる
joinRequest1 := client.V1().NewJoinRequest("10.10.10.1", 2886, "zone1")
dag, err := client.V1().JoinSyncWithRequest(joinRequest1) // 本番環境ではエラー処理が必要です。以下同じ
// follower をクラスターに追加する
joinRequest2 := client.V1().NewJoinRequest("10.10.10.2", 2886, "zone2")
dag, err = client.V1().JoinSyncWithRequest(joinRequest2)
joinRequest3 := client.V1().NewJoinRequest("10.10.10.3", 2886, "zone3")
dag, err = client.V1().JoinSyncWithRequest(joinRequest3)
// OceanBase クラスタの設定情報を設定する
configObclusterReq := client.V1().NewConfigObclusterRequest("obshell-sdk-test", 12358).SetRootPwd("****")
dag, err = client.V1().ConfigObclusterSyncWithRequest(configObclusterReq)
// obshell prior to 4.2.3.0 should use mysqlPort(rpcPort) instead of mysql_port(rpc_port).
configs := map[string]string{
"datafile_size": "24G", "cpu_count": "16", "memory_limit": "16G", "system_memory": "8G", "log_disk_size": "24G",
}
// 各 OBServer ノードのパラメータを設定する
configObserverReq := client.V1().NewConfigObserverRequest(configs, v1.SCOPE_GLOBAL)
dag, err = client.V1().ConfigObserverSyncWithRequest(configObserverReq)
// クラスタを初期化する
initReq := client.V1().NewInitRequest()
dag, err = client.V1().InitSyncWithRequest(initReq)
}
コマンドラインによるデプロイ
ステップ1:obshellを起動する
obshellはOceanBaseデータベースのインストールディレクトリにあります(
/home/admin/oceanbase/bin/obshell)。各ノードでobshellを起動します。詳細については、obshellの起動を参照してください。
10.10.10.1ノードで以下のコマンドを実行します:[admin@test001 ~]$ /home/admin/oceanbase/bin/obshell agent start --ip 10.10.10.1 -P 288610.10.10.2ノードで以下のコマンドを実行します:[admin@test002 ~]$ /home/admin/oceanbase/bin/obshell agent start --ip 10.10.10.2 -P 288610.10.10.3ノードで以下のコマンドを実行します:[admin@test003 ~]$ /home/admin/oceanbase/bin/obshell agent start --ip 10.10.10.3 -P 2886
ステップ2:Single AgentをMaster Agentに変更し、サーバーレベルの設定を行う
現在のノードでobshell cluster joinコマンドを呼び出し、-sをobshell自身に設定することで、Single AgentからMaster Agentへのアイデンティティ切り替えが完了します。コマンドの詳細については、obshell cluster joinを参照してください。
10.10.10.1ノードで以下のコマンドを実行します:
[admin@test001 ~]$ /home/admin/oceanbase/bin/obshell cluster join -s "10.10.10.1:2886" -z zone1 -p 2881 -P 2882 -o 'memory_limit=16G,system_memory=8G,log_disk_size=24G,datafile_size=24G'
ステップ3:Single AgentをFollower Agentに変更し、サーバーレベルの設定を行う
現在のノードでobshell cluster joinコマンドを呼び出し、-sをMaster Agent(10.10.10.1:2886)に設定することで、Single AgentからFollower Agentへのアイデンティティ切り替えが完了します。コマンドの詳細については、obshell cluster joinを参照してください。
10.10.10.2ノードで以下のコマンドを実行します:
[admin@test002 ~]$ /home/admin/oceanbase/bin/obshell cluster join -s "10.10.10.1:2886" -z zone2 -p 2881 -P 2882 -o 'memory_limit=16G,system_memory=8G,log_disk_size=24G,datafile_size=24G'
10.10.10.3ノードで以下のコマンドを実行します:
[admin@test003 ~]$ /home/admin/oceanbase/bin/obshell cluster join -s "10.10.10.1:2886" -z zone3 -p 2881 -P 2882 -o 'memory_limit=16G,system_memory=8G,log_disk_size=24G,datafile_size=24G'
ステップ4:クラスタレベルの設定を設定し、クラスタを初期化する
任意のノードで obshell cluster init コマンドを実行すると、クラスタレベルの設定を設定し、クラスタの初期化を実行できます。コマンドの詳細については、obshell cluster init を参照してください。
[admin@test001 ~]$ /home/admin/oceanbase/bin/obshell cluster init -n ob-test --rp ********
ステップ5:OceanBaseクラスタに接続する
ここでは、OBClientを使用してOceanBaseデータベースに接続する例を示します。コマンドは以下のとおりです:
[admin@test001 ~]$ obclient -h10.10.10.1 -uroot@sys -P2881 -p -A
-h:OceanBaseデータベースの接続IPアドレスを指定します。これはobshell起動時に指定されたIPアドレスであり、例えば10.10.10.1のようになります。-u:テナントの接続アカウントを指定します。形式はユーザー名@テナント名です。MySQLテナントの管理者ユーザー名はデフォルトでrootです。-P:OceanBaseデータベースの接続ポートを指定します。ステップ4 で指定されていない場合、デフォルトポート2881が使用されます。-p:OceanBaseデータベースアカウントのパスワードを指定します。-A:OBClientがデータベースに接続する際に統計情報を自動取得しないことを示します。
OceanBaseクラスタへの接続手順の詳細については、OceanBaseデータベースへの接続 の章を参照してください。