Cygnus を使って MySQL にデータを格納する方法

FIWARE Context Broker によって保存されたコンテキスト情報には、エンティティ属性の最新値のみが含まれます。Context Broker を介して生成された履歴データを格納できるようにするには、Cygnus を使用する必要があります。Cygnus はストレージに接続する必要があります。このチュートリアルでは、MySQL が使用されています。

したがって、使用される3つの主なコンポーネントは次のとおりです :

下の図では、ユーザが REST HTTP リクエストを発行できることがわかります。すべての操作は Orion Context Broker に送信され、処理されます。Cygnus は Orion Context Broker をサブスクライブし、Orion によって保存されたエンティティに対する変更が Cygnus に通知されます。

Architecture

このチュートリアルを進めるには、マシン上で docker と docker-compose を構成していることを確認する必要があります。あなたのオペレーティング・システムに基づき、dockerdocker-compose のインストールのプロセスに従ってください。

このチュートリアルを進めるには、マシン上で docker と docker-compose を構成していることを確認する必要があります。あなたのオペレーティング・システムに基づき、dockerdocker-compose のインストールのプロセスに従ってください。

docker-compose.yml

上記の例では、さまざまなコンテナにさまざまなアプリケーションがありますが、それらのコンテナはすべて実際にリンクされています。これらのコンテナを1つずつ実行するのではく、ひとつのコマンドでこれらのコンテナを一度に実行したいため、docker compose を使用します。docker-compose は、ひとつのコマンド "docker-compose up" で、さまざまなコンテナに存在する複数のアプリケーションを実際に実行することができます。上記の例のように、4つのコンテナを定義することができます。* .ymlファイルの中に、Orion Context Broker を実行するコンテナ、MongoDB を実行するコンテナ (Orionによって生成された最新の値を格納する必要があります)、Mysql を実行するコンテナ、そして、Cygnu を実行するコンテナの定義があります。これは "docker-compose" ファイルと呼ばれます。

例の実行

実行されるステップは次のとおりです :

  • dokcer-compose (* .yml)ファイルを実行します
  • Orion Context Broker(CB) にコンテキスト情報を公開します
  • Cygnus に通知するサブスクリプションを作成します
  • エンティティの値を更新します
  • DB に接続し、収集されたデータを確認します

ステップ・バイ・ステップ

すべての Docker コンテナを削除します :

docker rm `docker ps -aq`

すべての Docker イメージを削除します :

docker rmi $(docker images -a -q)

Cygnus, Orion および mySQL を同時に実行するには、docker-compose ファイルを実行する必要があります。docker-compose.yml ファイルがあるディレクトリに移動し、コマンドライン・プロンプトで次のコマンドを実行する必要があります :

docker-compose up

ローカルマシン上に構築されたイメージをチェックするには :


docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
fiware/orion         latest              5e54ba5d2f2d        2 weeks ago         266MB
mongo                3.4                 9ad59b0c0624        2 weeks ago         360MB
mysql                latest              5195076672a7        3 weeks ago         371MB
fiware/cygnus-ngsi   latest              f8dcb3f89d4a        2 months ago        509MB

実行中のコンテナの現在のリストを確認するには :

docker ps

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                            NAMES
7406940f3438        fiware/orion:latest         "/usr/bin/contextBro…"   11 minutes ago      Up 11 minutes       0.0.0.0:1026->1026/tcp                           orion
c30a8ba06958        fiware/cygnus-ngsi:latest   "/cygnus-entrypoint.…"   11 minutes ago      Up 11 minutes       0.0.0.0:5050->5050/tcp, 0.0.0.0:8081->8081/tcp   cygnus
187e9b6f9f49        mongo:3.4                   "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       27017/tcp                                        mongo
59ed1e7daba8        mysql:latest                "docker-entrypoint.s…"   11 minutes ago      Up 11 minutes       3306/tcp                                         mysql

4つのコンテナが稼働していることがわかります。ここでは、Orion Context Broker がポート 1026 で動作していることがわかります。Cygnus-ngsi は、管理目的で 8081、Orion から通知を受け取るために 5050 という2つのポートを公開しています。詳細については、ここでマニュアルを確認することができます。

REST API コールを作成するには : Web サービスを迅速にテストするのに役立つ多くの HTTP クライアントがあります。

この例では、Postman を使用して、CRUD(Create, Remove, Update, Delete) 操作を実行しています。Orion Context Broker と Cygnus-ngsi が実際に動作し、レスポンスしているかどうかを確認するために、それぞれのバージョンをクエリし、レスポンスがあるかどうかを確認することでテストできます。

postman を開いたら、GET クエリを実行する必要があることを指定する必要があり、ターゲット (URI : port) を指定する必要があります。この場合、クエリ対象は次のようになります :

$ curl --request GET --url http://localhost:1026/version

{
"orion" : {
  "version" : "1.12.0-next",
  "uptime" : "0 d, 0 h, 22 m, 56 s",
  "git_hash" : "17cec793427e5760d6ebf0fde798a9d6e4647c2c",
  "compile_time" : "Thu Mar 22 15:59:14 UTC 2018",
  "compiled_by" : "root",
  "compiled_in" : "34730c06de0c",
  "release_date" : "Thu Mar 22 15:59:14 UTC 2018",
  "doc" : "https://fiware-orion.readthedocs.org/en/master/"
}
}
$ curl --request GET  --url http://localhost:8081/v1/version

{"success":"true","version":"1.8.0_SNAPSHOT.f189b3928aed5fb9171a1eedcd347a5c75741aa5"}

$ docker exec -it mysql mysql -uroot -pmysql

mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.21 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

注 : IDE 経由で DB に接続することができます。これはこのチュートリアルの後半で紹介しています。

エンティティの操作

エンティティは Context Broker によって格納されるオブジェクトです。各エンティティには1つ以上の属性があります。値が変更されたときに通知されるように、これらの属性の1つを読み取り、更新し、サブスクライブすることができます。エンティティリソースで実行できる操作は、Post, Get, Put, Delete です。

エンティティの作成

次のように、次のターゲットに対して POST リクエストを実行する必要があります :

localhost:1026/v2/entities

create Entity

リクエストを送信するときに、いくつかのヘッダ値も指定する必要があります :

Headers to pass

Content-type には送信したいデータのタイプを指定します。常に application/json です。

Fiware-Service そして FiwareServicepath は、データを論理的に分離することを意図しています。これはマルチテナント・モデルと呼ばれ、この用語は、ソフトウェアの単一のインスタンスがサーバ上で実行され、複数のテナントを提供していたソフトウェア・アーキテクチャを指します。例えば、 Fiware-Service : Tenat1 です。また、サービスパスは、作成時にエンティティに割り当てられた階層スコープです。例えば、Fiware-ServicePath : /some/hierarchical/path です。

注 : この例で実行するすべての操作に対して、これらのヘッダを設定する必要があります。

Orion に Cygnus をサブスクライブ

コンテキスト・コンシューマは、サブスクライブ操作を使用して特定の条件を満たすコンテキスト情報を受信するためにサブスクライブすることができます。このようなサブスクリプションには有効期限があります。その代わりに、 Context Broker は、コンテキスト情報の更新を、それらをエクスポートする通知操作を呼び出すことによって、サブスクライブされたコンテキスト・コンシューマに通知します。

entitiesnotifications サブフィールドは、通知メッセージの内容を定義します。

  • idPattern は、取得したいエンティティをフィルタリングするために使用します。その値は正規表現です。この例では、すべてを取得するように設定しています
  • url は、通知を送信の送信先で、URL のサブフィールドで定義されています。ここでは、Cygnus-ngsi の URL を指定します
  • attrsFormat : Cygnus は NGSI v1 の通知ペイロードしか理解しないため、これを レガシー(legacy)に設定します
  • サブスクリプションには、ISO 8601標準フォーマットを使用して指定された有効期限切れフィールドがあります。サブスクリプションがその日を超えれば、サブスクリプションは単に無視されます

localhost:1026/v2/subscriptions

Add Subscription

サブスクリプションを作成した後は、以前と同じ方法で属性値を更新して、DB にデータを永続的に格納できるようにする必要があります。上記の図では、http://cygnus:5050/notify に通知が送信されていることがわかります。

DB 内の値の変化を見るためには、さまざま時点であるエンティティの属性値を更新する必要があります。次の例は、次の URL に対して PUT リクエストを実行して、属性値を何回か変更する方法を示しています :

localhost:1026/v2/entities/Car1/attrs/speed/value

updating multiple values

MySQL に含まれているデータベースを調べると、操作を行っているテナントの名前がわかります。 この例では、テナント名として "cygnusexample" を使用しました。 Cygnus にサブスクライブして値を数回更新した後、DB の内容をコマンド・プロンプトまたは IDE 経由でチェックすることができます。

コマンド・プロンプトによる DB のチェック

このチュートリアルで前述したように、コンテナを接続した後 :

$ mysql> SHOW DATABASES;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| cygnusexample      |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

MySql workbench IDE による MySQL への接続

ここ)から MySQL ワークベンチをインストールすることができます。 IDE をインストールして実行すると、次のウィンドウが表示されます : After installing the IDE and running it you will see the following window

SQLWorkbench starting page

MySQL Connection の横の左上隅にある+ボタンを押すと、DB に新しい接続を作成できます。 次のウィンドウが表示されます :

SQLWorkbench Add Connection

"Setup New Connection" ウィンドウで、MySQL の実行中のサーバのホスト名とポートを追加する必要があります。この例の場合、MySQL を実行しているコンテナのアドレス情報です。ユーザ名とパスワードは Docker 作成ファイルで設定したのと同じ変数で、ここでは root/mysqlです。作業が完了したら、接続をテストして "OK" を押します。同じ接続名のボックスが次のように表示されます :

Connection Added Window

作成した DB 接続を含む左ペインのボックスを押すと、次のウィンドウが表示されます :

Show Table Window

左側のペインには、すべてのデータベースと、Cygnus によって作成されたデータベースが表示されます。ここでは "cygnusexample" です。Orion を介して作成したエンティティと同じ名前のテーブルがあることもわかります。すべてのテーブルレコードを選択すると、さまざまなタイムスロットで変更されたすべての値が表示されます。

実行中のコンテナの終了

$ docker-compose down

Stopping orion  ... done
Stopping cygnus ... done
Stopping mongo  ... done
Stopping mysql  ... done
Removing orion  ... done
Removing cygnus ... done
Removing mongo  ... done
Removing mysql  ... done