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がマスターエージェントとして認証されているノードに対し、/api/v1/observer/config を呼び出して、リクエスト内で適用範囲を指定することで、指定されたobshellにサーバー設定を設定できます。
コマンドラインで対応するAPIを呼び出す方法の詳細については、Serverレベルの構成の設定を参照してください。
[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メソッドをリクエストする方法の詳細については、Serverレベルの構成の設定を参照してください。
···
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メソッドをリクエストする方法の詳細については、Serverレベルの構成の設定を参照してください。
···
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でマスターエージェントとしてログインしたノードに対し、/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)
# 自分自身をMASTERにする
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) // 本番環境ではエラー処理が必要であり、以下も同様です
// クラスタにフォロワーを追加
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データベースに接続する ページを参照してください。