Skip to content

Instantly share code, notes, and snippets.

@rimms
Last active December 28, 2015 15:59
Show Gist options
  • Save rimms/7525923 to your computer and use it in GitHub Desktop.
Save rimms/7525923 to your computer and use it in GitHub Desktop.
スタンドアロンモード冗長化構成 運用上の注意点

下図のようなスタンドアロンモードを冗長化した運用環境を想定した際に、発生しうる事象と回避策を明文化する。

スタンドアロン冗長化構成にて運用する目的

  1. 可用性・耐障害性性の向上
    • Jubatus を冗長化させることによる障害発生時のサービス停止に対する信頼性の向上
  2. トラフィックの負荷分散
    • 特に分析リクエストの負荷分散によるサーバー負荷の軽減
  3. 分散モードでの運用はオーバースペック
    • スタンドアロンモードでも十分な性能要件を満たせており、ZooKeeper や Jubatus Proxy のような複数のプロセスを起動する必然性がない

前提条件

  • 0.5.0 を前提とする

    分散モードでは、MIX によりノード間のモデル情報がゆるやかに共有されるが、Jubatus をスタンドアロンモードで起動する場合は、構築されたモデル情報をオンラインで他の Jubatus へ共有・レプリケーションするようなことはできない。 そのため、全 Jubatus で学習モデル状態を同一とするためには、現状では、学習リクエストをブロードキャストし、稼働する Jubatus それぞれでモデル情報を構築する方法をとる必要がある。

発生しうる事象

# 分類 事象 観点 関連仕様
P1 通常時 ブロードキャストした学習リクエストの到達順序がプロセス間で異なる場合、プロセス間の学習モデルが同一とならない。そのため、振り分けられた解析リクエストに対する応答が異なる状況となる 学習モデルの一貫性 S1
P2 高負荷時 クライアントでタイムアウトが発生した場合、学習リクエストの欠損によりプロセス間の学習モデルが同一とならない。そのため、振り分けられた解析リクエストに対する応答が異なる状況となる 学習モデルの一貫性 S2, S3, S4, S5
P3 縮退/復旧時 一時的なNW障害による縮退運用から復旧した場合、障害中の学習リクエストの欠損により、振り分けられた解析リクエストに対する応答が異なる状況となる 学習モデルの一貫性 S2, S3, S5
P4 縮退/復旧時 HW障害などの機器入れ替えが必要な障害による縮退運用から復旧する場合、現用系からもモデル情報をコピーして復旧するが、復旧完了までの間、学習モデルの一貫性を維持するため、学習リクエストを受け付けることができない 学習モデルの一貫性, 可用性 S2, S3, S5

回避策

P1

  1. メッセージキューを導入し、学習リクエストを1件づつ処理する
    • 学習リクエストの即時反映要否、学習リクエストの流量(時系列的な変化) の要件による
      • 学習リクエストの反映が非同期となるため、学習リクエストが即時に反映されない
    • 2 との違いは、リクエストをすべて処理すること
    • 運用コスト: 大
      • 他製品(メッセージキュー)のメンテナンスコストが伴う
    • 導入コスト: 大
      • 他製品(メッセージキュー)の導入コストが伴う
  2. Jubatus Proxy のようなプロキシを実装し、学習リクエストの同時実行をブロックする
    • 学習リクエストの流量 の要件による
      • 学習リクエストが多量にある場合は、同時実行のブロックによる待ち・タイムアウトが多発することとなる
    • 1 との違いは、受け付けられないリクエストはブロックするということ
    • 運用コスト: 小
      • ユーザーアプリケーションの一部として実装するため、運用コストはコントロールできる
    • 導入コスト: 中
      • 実装次第であるが、拡張性・移植性などを考慮しなければ、実装コストはコントロールできる
  3. 学習順序の違いによるプロセス間の学習モデルの一貫性を保証しない
    • 分析結果のクリティカル性 の要件による
      • 差異が大きくなるほどに、提供するサービスレベルへ与える影響が大きくなる
    • 運用コスト: 中
      • プロセス間の分析結果の差異を定量的に監視するような仕組みが必要となる
    • 導入コスト: なし

P2

  1. クライアントアプリでタイムアウトを無効とする
    • システム構成、サービスとして、タイムアウトの無効を許容出来るか の要件による
      • メッセージキューの導入により、リクエストを非同期で処理する場合は、メッセージ処理用のクライアントはサービスへ影響を与えないため、タイムアウトを無効化できる
    • 運用コスト: なし~大
      • 他製品(メッセージキュー)のメンテナンスコストが伴う
    • 導入コスト: なし~大
      • 他製品(メッセージキュー)の導入コストが伴う
  2. タイムアウトの発生によるプロセス間の学習モデルの一貫性を保証しない
    • 分析結果のクリティカル性 の要件による
      • 差異が大きくなるほどに、提供するサービスレベルへ与える影響が大きくなる
    • 運用コスト: 中
      • プロセス間の分析結果の差異を定量的に監視するような仕組みが必要となる
    • 導入コスト: なし

P3

  1. 各プロセス用にメッセージキューを導入し、プロセス個別に学習リクエストの再送を行えるようにする
    • 学習リクエストの即時反映要否 の要件による。
      • 学習リクエストの反映が非同期となるため、学習リクエストが即時に反映されない。
    • 運用コスト: 大
      • 他製品(メッセージキュー)のメンテナンスコストが伴う
    • 導入コスト: 大
      • 他製品(メッセージキュー)の導入コストが伴う
  2. NW障害の発生によるプロセス間の学習モデルの一貫性を保証しない
    • 分析結果のクリティカル性 の要件による
      • 差異が大きくなるほどに、提供するサービスレベルへ与える影響が大きくなる
    • 運用コスト: 中
      • プロセス間の分析結果の差異を定量的に監視するような仕組みが必要となる
    • 導入コスト: なし

P4

  1. 各プロセス用にメッセージキューを導入し、プロセス個別に学習リクエストの再送を行えるようにする
    • 学習リクエストの即時反映要否 の要件による
      • 学習リクエストの反映が非同期となるため、学習リクエストが即時に反映されない
    • 運用コスト: 大
      • 他製品(メッセージキュー)のメンテナンスコストが伴う
    • 導入コスト: 大
      • 他製品(メッセージキュー)の導入コストが伴う
  2. 障害復旧中の学習リクエストを運用制限により停止させる
    • サービス要件(SLA等) による
    • 運用コスト: 中
      • 学習リクエストのみを停止させる仕組みが必要
    • 導入コスト: なし
  3. 障害発生によるプロセス間の学習モデルの一貫性を保証しない
    • 分析結果のクリティカル性 の要件による
      • 差異が大きくなるほどに、提供するサービスレベルへ与える影響が大きくなる
    • 運用コスト: 中
      • プロセス間の分析結果の差異を定量的に監視するような仕組みが必要となる
    • 導入コスト: なし

関連仕様

S1) 学習リクエストの到達順序による学習モデルの違い

Jubatus はオンライン学習アルゴリズムであるため、学習リクエストの到達順序が、学習モデル(解析結果)に影響を与える。(A → B の順序で学習する場合と、B → A の順番で学習する場合に結果が異なる)

S2) リクエストの取り消しはできない

Jubatus では学習したリクエストを取り消すことはできない。

つまり、JubatusサーバーA は学習が成功したが、JubatusサーバーB で学習が失敗した場合、JubatusサーバーA の学習内容を取り消し、全Jubatuサーバー で学習が成功するまで再学習を行わせるということはできない。

S3) 学習リクエストの冪等性の有無

同一の学習リクエストを2回通知した場合、Jubatus のアルゴリズムによっては、同じデータでの学習を2回行ったこととなる。

つまり、JubatusサーバーA は学習が成功したが、JubatusサーバーB で学習が失敗した場合、JubatusサーバーA には学習リクエストを再送せず、学習が失敗した JubatuサーバーB のみに学習を行わせる必要がある。

S4) モデル情報は順序性が保証されないコレクションに格納されている

モデル情報をファイル出力した場合に、同じデータ状態であっても出力ファイルが同じとは限らない。

モデル情報を比較するためには、ファイルにモデルを出力した上でセマンティックな比較が必要となり、比較にコストがかかる。

S5) リクエストの到達を確認できない

Jubatus は機械学習であるため、学習リクエストの成否を分析リクエストにより確認することができない。また、リクエストごとにログを出力をしていないため、ログからもリクエスト到達を確認できない。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment