Endpoint と DB を分けたら Ceilometer が動かない

メータリングサービスを提供する Ceilometer は、他の Nova、Cinder のようなコンポネントとは違って、NoSQL (Not only SQL) タイプのデータベースを使う必要があります。

その代表的なデータベースとして、スキーマレスで柔軟に扱える MongoDB がありますが。

Controller Node には既に Nova、Cinder 等が使う MariaDB が動いている状態。

Controller Node にデータベースを二つも入れたくなかったので、Ceilometer 用のデータベースを別途用意することにしました。

Cloud Diagram クラウド構成図

ceilometer 専用データベース

一通り構築が終わり、動作確認のため $ ceilometer meter-list コマンドを実行したら以下のエラーで失敗。

Controller NodeRaw Code(S)Raw Code(T)
$ source admin-openrc.sh

$ ceilometer meter-list
Error communicating with http://CONTROLLER:8777 [Errno 111] Connection refused

$ netstat -anp | grep 8777

# service ceilometer-api restart
stop: Unknown instance:
ceilometer-api start/running, process 30655

$ ps -ef | grep "ceilometer-api" | grep -v "grep"

$ cat /var/log/ceilometer/ceilometer-api.log | grep -i "error\|warn"
2016-08-23 15:09:40.038 30967 CRITICAL ceilometer [-] ImportError: No module named pymongo
2016-08-23 15:09:40.038 30967 TRACE ceilometer ImportError: No module named pymongo

どうも Ceilometer の 8777 番ポートを Listen してない模様。

Ceilometer 関連サービスを確認したところ、ceilometer-api サービスが起動していなかったため、個別にもう一回再起動を実施。

見た目上、再起動されたかな?。。と思いきやプロセス生成されておらず。

ceilometer-api.log を確認したところ、クリティカルエラーを吐いてました。

Endpoint 側にパッケージが足りなかった

色々試した結果、Endpoint 側 (Controller Node) に以下のパッケージが足りなかったことが判明。

Ceilometer-MongoDB NodeRaw Code(S)Raw Code(T)
$ dpkg --list | grep "bson"
ii  python-bson       2.7.1-1   amd64   Python implementation of BSON for MongoDB
ii  python-bson-ext   2.7.1-1   amd64   C-coded extension to the python-bson package

Endpoint 側に bson パッケージをインストール

この python-bson というパッケージと python-pymongo が Endpoint 側にインストールされていなかったせいで、データベースとの疎通が上手くとれてなかったようです。

上記のパッケージをインストールしたら無事に ceilometer-api サービスの起動に成功。

CRITICAL エラーも INFO レベルに変わり、8777 番ポートも Listen 状態になりました。

Controller NodeRaw Code(S)Raw Code(T)
# apt-get install python-bson python-pymongo

$ dpkg --list | grep "bson"
ii  python-bson       2.7.1-1   amd64   Python implementation of BSON for MongoDB
ii  python-bson-ext   2.7.1-1   amd64   C-coded extension to the python-bson package

$ dpkg --list | grep "pymongo"
ii  python-pymongo       2.7.1-1   amd64   Python interface to the MongoDB document-oriented database
ii  python-pymongo-ext   2.7.1-1   amd64   C-coded extension to the python-pymongo package

# service ceilometer-api restart

$ cat /var/log/ceilometer/ceilometer-api.log | grep -i "error\|warn" 
2016-08-23 15:18:26.161 31184 INFO ceilometer.api.app [-] default_log_levels  = ['amqp=WARN', 'amqplib=WARN', 'boto=WARN', 'qpid=WARN', 'sqlalchemy=WARN', 'suds=INFO', 'oslo.messaging=INFO', 'iso8601=WARN', 'requests.packages.urllib3.connectionpool=WARN', 'urllib3.connectionpool=WARN', 'websocket=WARN', 'keystonemiddleware=WARN', 'routes.middleware=WARN', 'stevedore=WARN', 'stevedore=INFO', 'keystoneclient=INFO']
2016-08-23 15:18:26.167 31184 INFO ceilometer.api.app [-] publish_errors = False

$ ps -ef | grep "ceilometer-api" | grep -v "grep"
ceilome+ 31184     1  0 15:18 ?        00:00:00 /usr/bin/python /usr/bin/ceilometer-api --log-dir=/var/log/ceilometer

$ netstat -anp | grep 8777
tcp        0      0 0.0.0.0:8777           0.0.0.0:*              LISTEN      31184/python
tcp        0      0 10.10.10.10:8777       10.10.10.10:36785      TIME_WAIT   -

コマンドも問題なく実行できるようになりました。

Controller NodeRaw Code(S)Raw Code(T)
$ ceilometer meter-list
+------+------+------+-------------+---------+------------+
| Name | Type | Unit | Resource ID | User ID | Project ID |
+------+------+------+-------------+---------+------------+
+------+------+------+-------------+---------+------------+

終わりに

結局、データベースを分ける場合には、Endpoint の設置場所に、python-bsonpython-pymongo を入れないと ceilometer-api サービスの起動に失敗し、その結果、Ceilometer API Endpoint の 8777 番ポートも Listen 状態にならないということになりますね。

Ceilometer に限定された話ではなく、他の Endpoint でも起こりうる話なので、各コンポネントの Endpoint とデータベースを分けてから上手く行かなかった場合には、この辺を疑ってみると良いかもしれません。

以上、OpenStack : Error communicating with http://CONTROLLER:8777 [Errno 111] Connection refused でした。