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

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

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

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

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

Cloud Diagram クラウド構成図

一通り構築が終わり、動作確認のため $ 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 でした。