Skip to content

Instantly share code, notes, and snippets.

@kmaehashi
Last active August 29, 2015 14:02
Show Gist options
  • Save kmaehashi/c329a61075058917cbd3 to your computer and use it in GitHub Desktop.
Save kmaehashi/c329a61075058917cbd3 to your computer and use it in GitHub Desktop.
Cluster Management Tool Ideas

Jubatus 新クラスタ管理ツールの検討

現在のクラスタ管理ツールの課題を明らかにした上で、新ツールの仕様について整理する。

課題

  • 機能性
    • (1) Proxy の管理 (起動/停止) が行えない
      • ZooKeeper / ユーザ AP については、サードパーティの管理ツール (CDH 等) が適用可能である一方、Server と密接な関係にあり、事実上利用必須である Proxy のプロセス管理が抜け落ちている。Jubatus コンポーネントの一部である以上、Jubatus のクラスタ管理ツールの範疇で管理されるべき。
    • (2) 静的なコンフィギュレーションができない
      • SI で想定される世界観では容量設計を事前に行うことが前提であり、ダイナミックにサーバのプロセス数を増減させるという要件は考え難い。
      • サーバ側のポート番号を動的に割り当てる仕組みは、セキュリティ設定との相性が悪い。
      • ダウンしたサーバプロセスが、そのまま存在しなかったことになってしまう(管理ツールから "不在" を検知できない)。
    • (3) スタンドアロンモードのサーバが管理できない (optional)
      • スタンドアロンモードのサーバも、分散モードのサーバも、同じ仕組み/アーキテクチャで管理できることが好ましい。(※スタンドアロンモードであればツールを使用せずに管理できる範疇のため、優先度は低)
    • (4) OS の起動スクリプトとして管理することができない (optional)
      • 運用デーモン(jubavisor)については、OS 起動スクリプト経由での実行がサポートされていることが好ましい (※利用者側で比較的容易に回避可能な課題であるため、優先度は低)
  • 使用性
    • (5) コマンド指定が冗長
      • 現行の運用コマンド(jubactl)は多数のオプションを指定する必要があり、習熟コストが高いだけでなく、ミスオペレーションを招く危険性が高い。
  • 保守性
    • (6) 運用ツールの拡張・組込みコストが高い
      • 運用コマンドは C++ で実装されていること、また管理用の API が公開されていないことから、運用コマンドをユーザが拡張したり、独自開発(例: 死活監視プロダクトとの連携等)が難しい。

解決策

  • (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

設定ファイル (JSON)

便宜上 /* ... */ をコメントとして使用。

{
 /* 全体共通の設定 */
 "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 をオーバライド */ }
   },
   /* 必要な数だけ定義 */
 ]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment