Orion in HA

このレシピでは、MongoDB インスタンスのスケーラブルなレプリカ・セットでバックアップされたスケーラブルな Orion Context Broker サービスをデプロイする方法を示します。

すべての要素は docker-compose ファイルで定義された docker コンテナで実行されます。実際、このレシピは、バックエンド用の mongodb レプリカ・レシピを再利用して、Orion フロントエンドのデプロイに重点を置いています。

最終的なデプロイは、次の図で表されます :

前提条件

ウェルカム・ページを読み、インストール・ガイドで説明されている手順に従ってください。

使い方

まず、Docker Swarm (docker >= 1.13) を既にセットアップしておく必要があります。あなたが持っていない場合は、ローカルの swarm をセットアップするための簡単な方法についてはツールセクションをチェックしてください。

$ miniswarm start 3
$ eval $(docker-machine env ms-manager0)

Orion は、バックエンド用の mongo データベースが必要です。すでにクラスタ内に Mongo をデプロイしていて、そのデータベースを再利用したい場合は、次のステップのバックエンドのデプロイをスキップできます。Orion が Mongo にリンクするために定義した変数、つまり、MONGO_SERVICE_URI に注意する必要があります。settings.env または Windows の settings.bat に正しい値を持っていることを確認してください。MONGO_SERVICE_URI の値は、mongo のルーティング可能なアドレスでなければなりません。swarm 内にデプロイされた場合は、stack プレフィックスを持つサービス名で十分です。公式 Docker ドキュメントで詳細を読むことができます。Mongo ReplicaSet Recipe を使用した場合、デフォルト値はうまくいくはずです。

これで、設定を有効にして Orion を展開できます...

$ source settings.env  # In Windows, simply execute settings.bat instead.
$ docker stack deploy -c docker-compose.yml orion

ある時点で、デプロイは次のようになります...

$ docker service ls
ID            NAME                       MODE        REPLICAS  IMAGE
nrxbm6k0a2yn  mongo-rs_mongo             global      3/3       mongo:3.2
rgws8vumqye2  mongo-rs_mongo-controller  replicated  1/1       martel/mongo-replica-ctrl:latest
zk7nu592vsde  orion_orion                replicated  3/3       fiware/orion:1.3.0

上記のように、レプリカ列に 3/3 が表示されている場合は、3つのレプリカが起動して実行中であることを意味します。

ウォークスルー

次のコマンドを実行して、swarm から、サービス (別名タスク) のコンテナの配布を確認することができます...

$ docker service ps orion_orion
ID            NAME           IMAGE               NODE         DESIRED STATE  CURRENT STATE               ERROR  PORTS
wwgt3q6nqqg3  orion_orion.1  fiware/orion:1.3.0  ms-worker0   Running        Running 9 minutes ago
l1wavgqra8ry  orion_orion.2  fiware/orion:1.3.0  ms-worker1   Running        Running 9 minutes ago
z20v0pnym8ky  orion_orion.3  fiware/orion:1.3.0  ms-manager0  Running        Running 25 minutes ago

良いニュースは、上の出力からわかるように、デフォルトでは、Docker はすでにサービスのすべてのレプリカの context-broker_orion を別のホストに配備していました。

もちろん、ラベル、制約、または展開モードを使用すると、swarm ノード間でタスクの配布をカスタマイズする権限があります。mongo-replica_mongo サービスの展開を理解するため、mongo レプリカ・レシピを表示できます。

さて、Orion にクエリを実行して、本当に稼働していることを確認しましょう。質問は、今、Orion が実際に走っているところはどこですか? 後でネットワーク内部をカバーしますが、今はマネージャ・ノードに問い合わせましょう...

$ sh ../query.sh $(docker-machine ip ms-manager0)

次のようなものが得られます...

{
  "orion" : {
  "version" : "1.3.0",
  "uptime" : "0 d, 0 h, 18 m, 13 s",
  "git_hash" : "cb6813f044607bc01895296223a27e4466ab0913",
  "compile_time" : "Fri Sep 2 08:19:12 UTC 2016",
  "compiled_by" : "root",
  "compiled_in" : "ba19f7d3be65"
}
}
[]

docker swarm の内部ルーティング・メッシュのおかげで、実際に swarm の任意のノードに前のクエリを実行することができます。ポート 1026 のリクエストに応答できるノード 、つまり、Orion を実行しているノードにリダイレクトされます。

いくつかのデータを挿入しましょう...

$ sh ../insert.sh $(docker-machine ip ms-worker1)

そして、それがそこにあることを確認してください...

$ sh ../query.sh $(docker-machine ip ms-worker0)
...
[
    {
        "id": "Room1",
        "pressure": {
            "metadata": {},
            "type": "Integer",
            "value": 720
        },
        "temperature": {
            "metadata": {},
            "type": "Float",
            "value": 23
        },
        "type": "Room"
    }
]

はい、3つのノードのいずれかをクエリすることができます。

Swarm の内部ロード・バランサは、ラウンド・ロビン方式で負荷分散され、swarm 内で実行されている Orion タスク間で Orion サービスに対するすべてのリクエストが行われます。

Orion のリスケール

Orion をスケール・アップやスケール・ダウンすることは、簡単で、次のようなコマンドを実行します...

$ docker service scale orion_orion=2

(これは docker-compose の replicas 引数にマップされます)

その結果、ノードの1つ (この場合は ms-worker1) は Orion を実行しなくなりました...

$ docker service ps orion_orion
ID            NAME                    IMAGE               NODE         DESIRED STATE  CURRENT STATE           ERROR  PORTS
2tibpye24o5q  orion_orion.2  fiware/orion:1.3.0  ms-manager0  Running        Running 11 minutes ago
w9zmn8pp61ql  orion_orion.3  fiware/orion:1.3.0  ms-worker0   Running        Running 11 minutes ago

しかし、上記のように依然としてクエリに応答します...

$ sh ../query.sh $(docker-machine ip ms-worker1)
{
  "orion" : {
  "version" : "1.3.0",
  "uptime" : "0 d, 0 h, 14 m, 30 s",
  "git_hash" : "cb6813f044607bc01895296223a27e4466ab0913",
  "compile_time" : "Fri Sep 2 08:19:12 UTC 2016",
  "compiled_by" : "root",
  "compiled_in" : "ba19f7d3be65"
}
}
[]

mongob レプリカのレシピを見れば、mongodb バックエンドをどのようにスケーリングするかを知ることができます。しかし、基本的には、それが "グローバル" サービスであるという事実のために、前に示したようにそれを縮小することができます。しかし、それを拡大するには、ノードごとにインスタンスが1つしかないため、新しいノードを追加する必要があります。

障害に対応

Docker は、コンテナがダウンした場合のサービスの調整を担当しています。マネージャノード上で、次のコマンドを実行してみましょう :

$ docker ps
CONTAINER ID        IMAGE                                                                                                COMMAND                  CREATED             STATUS              PORTS               NAMES
abc5e37037f0        fiware/orion@sha256:734c034d078d22f4479e8d08f75b0486ad5a05bfb36b2a1f1ba90ecdba2040a9                 "/usr/bin/contextB..."   2 minutes ago       Up 2 minutes        1026/tcp            orion_orion.1.o9ebbardwvzn1gr11pmf61er8
1d79dca4ff28        martel/mongo-replica-ctrl@sha256:f53d1ebe53624dcf7220fe02b3d764f1b0a34f75cb9fff309574a8be0625553a   "python /src/repli..."   About an hour ago   Up About an hour                        mongo-rs_mongo-controller.1.xomw6zf1o0wq0wbut9t5jx99j
8ea3b24bee1c        mongo@sha256:0d4453308cc7f0fff863df2ecb7aae226ee7fe0c5257f857fd892edf6d2d9057                        "/usr/bin/mongod -..."   About an hour ago   Up About an hour    27017/tcp           mongo-rs_mongo.ta8olaeg1u1wobs3a2fprwhm6.3akgzz28zp81beovcqx182nkz

orion コンテナがダウンしたとします...

$ docker rm -f abc5e37037f0

それが消えたことが確認できますが、しばらくすると自動的に戻ってきます。

$ docker ps
CONTAINER ID        IMAGE                                                                                                COMMAND                  CREATED             STATUS              PORTS               NAMES
1d79dca4ff28        martel/mongo-replica-ctrl@sha256:f53d1ebe53624dcf7220fe02b3d764f1b0a34f75cb9fff309574a8be0625553a   "python /src/repli..."   About an hour ago   Up About an hour                        mongo-rs_mongo-controller.1.xomw6zf1o0wq0wbut9t5jx99j
8ea3b24bee1c        mongo@sha256:0d4453308cc7f0fff863df2ecb7aae226ee7fe0c5257f857fd892edf6d2d9057                        "/usr/bin/mongod -..."   About an hour ago   Up About an hour    27017/tcp           mongo-rs_mongo.ta8olaeg1u1wobs3a2fprwhm6.3akgzz28zp81beovcqx182nkz

$ docker ps
CONTAINER ID        IMAGE                                                                                                COMMAND                  CREATED             STATUS                  PORTS               NAMES
60ba3f431d9d        fiware/orion@sha256:734c034d078d22f4479e8d08f75b0486ad5a05bfb36b2a1f1ba90ecdba2040a9                 "/usr/bin/contextB..."   6 seconds ago       Up Less than a second   1026/tcp            orion_orion.1.uj1gghehb2s1gnoestup2ugs5
1d79dca4ff28        martel/mongo-replica-ctrl@sha256:f53d1ebe53624dcf7220fe02b3d764f1b0a34f75cb9fff309574a8be0625553a   "python /src/repli..."   About an hour ago   Up About an hour                            mongo-rs_mongo-controller.1.xomw6zf1o0wq0wbut9t5jx99j
8ea3b24bee1c        mongo@sha256:0d4453308cc7f0fff863df2ecb7aae226ee7fe0c5257f857fd892edf6d2d9057                        "/usr/bin/mongod -..."   About an hour ago   Up About an hour        27017/tcp           mongo-rs_mongo.ta8olaeg1u1wobs3a2fprwhm6.3akgzz28zp81beovcqx182nkz

ノード全体がダウンしても、冗長化された orion インスタンスと、冗長された DB レプリカの両方があるため、サービスは引き続き機能します。

$ docker-machine rm ms-worker0

まだリプライを受け取ります...

$ sh ../query.sh $(docker-machine ip ms-manager0)
$ sh ../query.sh $(docker-machine ip ms-worker1)

ネットワークの考慮事項

この場合、すべてのコンテナは、互いに通信する同じオーバーレイ・ネットワーク (バックエンド) に接続されます。ただし、構成が異なり、ファイアウォールの背後にあるコンテナを実行している場合は、ポート1026 (Orion のデフォルト) と27017 (Mongo のデフォルト) で TCP のトラフィックを開けたままにしてください。

サービスのコンテナ (タスク) が起動されると、このオーバーレイ・ネットワーク内の IP アドレスが割り当てられます。たとえば、動的な再スケジューリングのために、アプリケーションのアーキテクチャの他のサービスは、変更される可能性があるため、これらの IP に依存するべきではありません。良い点は、Docker がサービス全体の仮想 IP を作成するため、このアドレスへのすべてのトラフィックがタスクのアドレスに負荷分散されることです。

swarms docker の内部 DNS のおかげで、サービスの名前を使って接続することもできます。このレシピの docker-compose.yml ファイルを見ると、Orion は、mongo サービスの名前を dbhost param として起動します。これは、レプリカ・セット全体の単一の mongo インスタンスであるかどうかにかかわらずです。

ただし、オーバーレイ・ネットワークの外部から (たとえばホストから) コンテナにアクセスするには、docker_gwbridge へのコンテナのインターフェイスの ip にアクセスする必要があります。その情報を外部から入手するのは簡単な方法はないようです。この open issue を見てください。ウォークスルーでは、docker ingress ネットワーク がコンテナ化された orion サービスのいずれかにトラフィックをルーティングしているため、swarm ノードの1つを介して orion にクエリしました。

オープンな興味深い問題

Docker network の内部情報の詳細については、以下を参照してください :