現在のクラスタ管理ツールの課題を明らかにした上で、新ツールの仕様について整理する。
- 機能性
- (1) Proxy の管理 (起動/停止) が行えない
- ZooKeeper / ユーザ AP については、サードパーティの管理ツール (CDH 等) が適用可能である一方、Server と密接な関係にあり、事実上利用必須である Proxy のプロセス管理が抜け落ちている。Jubatus コンポーネントの一部である以上、Jubatus のクラスタ管理ツールの範疇で管理されるべき。
- (2) 静的なコンフィギュレーションができない
- SI で想定される世界観では容量設計を事前に行うことが前提であり、ダイナミックにサーバのプロセス数を増減させるという要件は考え難い。
- サーバ側のポート番号を動的に割り当てる仕組みは、セキュリティ設定との相性が悪い。
- ダウンしたサーバプロセスが、そのまま存在しなかったことになってしまう(管理ツールから "不在" を検知できない)。
- (3) スタンドアロンモードのサーバが管理できない (optional)
- スタンドアロンモードのサーバも、分散モードのサーバも、同じ仕組み/アーキテクチャで管理できることが好ましい。(※スタンドアロンモードであればツールを使用せずに管理できる範疇のため、優先度は低)
- (4) OS の起動スクリプトとして管理することができない (optional)
- 運用デーモン(jubavisor)については、OS 起動スクリプト経由での実行がサポートされていることが好ましい (※利用者側で比較的容易に回避可能な課題であるため、優先度は低)
- (1) Proxy の管理 (起動/停止) が行えない
- 使用性
- (5) コマンド指定が冗長
- 現行の運用コマンド(jubactl)は多数のオプションを指定する必要があり、習熟コストが高いだけでなく、ミスオペレーションを招く危険性が高い。
- (5) コマンド指定が冗長
- 保守性
- (6) 運用ツールの拡張・組込みコストが高い
- 運用コマンドは C++ で実装されていること、また管理用の API が公開されていないことから、運用コマンドをユーザが拡張したり、独自開発(例: 死活監視プロダクトとの連携等)が難しい。
- (6) 運用ツールの拡張・組込みコストが高い
- (1) Server だけでなく Proxy を起動/停止/ステータス取得を実装する。
- (2) クラスタの構成設定をファイルから与えるインタフェースに変更する。
- 具体的には、設定を JSON 形式で与えることを想定。
- (3) OS 起動スクリプトを用意する。 (future work)
- (4) スタンドアロンサーバの管理ができるようにする。 (future work; スタンドアロンサーバの指定を考慮した設定ファイルの設計を行う)
- (5) いくつかの前提/デフォルト値を置く、サブコマンド形式を使用する (例:
jubactl start ...
) などで、指定すべき項目数を削減する。 - (6) 新 jubavisor の API は IDL で定義・公開し、各言語からアクセス可能とする (実装は C++)。新 jubactl 相当は Python で実装することで実装コストを抑える。
- Python は比較的安定した MessagePack-RPC 実装がある。また、Yum や virt-install のような Linux 管理ツールも Python で実装されている。
- Ruby/Java は Linux ディストリビューションに標準でインストールされていないことが多い。
- Java は起動が遅いため運用コマンドに不向き。
サブコマンド + 引数、の形で指定する。
jubactl start {server|proxy|cluster} [-f <config>] [<id>]
jubactl status {server|proxy|cluster} [-f <config>] [<id>]
jubactl stop {server|proxy|cluster} [-f <config>] [<id>]
jubactl save [-f config.json] <cluster-id> --filename xxx
jubactl load [-f config.json] <cluster-id> --filename xxx
便宜上 /* ... */ をコメントとして使用。
{
/* 全体共通の設定 */
"global": {
"zookeeper": "10.0.0.1:2181,10.0.0.2:2181,10.0.0.3:2181",
"visor_options": {},
"server_options": {},
"proxy_options": {}
},
/* 物理ノード (= jubavisor) の構成 */
"visors": [
{
"id": "host01",
"host": "10.0.1.1",
"port": 9198,
"options": { /* global->visor_options をオーバライド */ }
},
{
"id": "host02",
"host": "10.0.1.2",
"port": 9198,
"options": { /* global->visor_options をオーバライド */ }
},
/* 必要な数だけ定義 */
],
/* クラスタの定義 */
"clusters": [
{
"name": "cluster-name",
"type": "classifier",
"is_standalone": False
},
/* 必要な数だけ定義 */
],
/* Jubatus サーバの構成 */
"servers": [
{
"id": "server01",
"visor": "host01",
"cluster": "cluster-name",
"options": { /* global->server_options をオーバライド */ },
},
/* 必要な数だけ定義 */
],
/* Jubatus プロキシの構成 */
"proxies": [
{
"id": "proxy01",
"visor": "host02",
"type": "classifier",
"options": { /* global->proxy_options をオーバライド */ }
},
/* 必要な数だけ定義 */
]
}