Fedora12でApache Qpidを使ってみた

MRGにはqpidというパッケージが含まれていたのだが、こちらもCondorと合わせて、使ってみた。
Apache Qpid(http://qpid.apache.org/index.html)は、AMQP( http://ja.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol )に従っており、商用MQと同種の機能を目指しているらしい。(参考リンク曰く、"HTTPとSMTPがうまくできないこと全て"が対象とのこと。)<<参考リンク>>
http://www.infoq.com/jp/news/2008/08/amqp-progress

インストール

Fedora12では、インストールはyumで実施できる。

# yum install qpidd

なお、qpiddの管理のため、pythonのパッケージも入れておいた方がよさそうである。(qpid-route, qpid-stat などのコマンドが含まれるため。)

# yum install python-qpid

キューの書き込み、読み出し

MQは非常にいろいろな使い方ができるが、簡単に機能を試すため、まず、localhostからの、メッセージの書き込みと取り出しを試してみた。実環境では、アップロードしたメッセージを他のMQサーバー(大抵地理的に離れている。。)に送付し、そちらで取り出すような使い方をするが、まずはローカルでの設定としている。

デフォルト状態のqpidでは、認証がオンになっていないため、自由にqueueの作成や、書き込みが出来る。(認証をオンにするためには、/etc/qpidd.confで"auth=yes"の設定をすればよいようなのだが、Fedora12では上手く動作しなかった。。orz)

まず、サービスを起動する。

# service qpidd start

次に、キューの読み書きを行うため、サンプルプログラムを動かしてみる。

$ cd /usr/share/doc/python-qpid-0.5.819819/examples/direct
$ python declare_queues.py 
(terminal1)$ python direct_producer.py
(terminal2)$ python direct_consumer.py 
message 0
message 1
message 2
message 3
message 4
message 5
message 6
message 7
message 8
message 9
That's all, folks!

サンプルの動作としては、次のようになる。

 declare_queues.py: キューを定義
 direct_producer.py: キューに上記のデータを書き込み
 direct_consumer.py: キューからデータを取り出し

他のサンプルについてはこちらを参照。
https://svn.apache.org/repos/asf/qpid/trunk/qpid/python/examples/README

なお、最後のxml-exchange を実行するには、パッケージとして次を追加する必要があった。
qpidd-xml-0.5.829175-3.fc12.x86_64

Federation

Federationは、qpidサーバーに、他のqpidサーバーのデータを読ませる設定で、SMTPのルーティングと同種の設定となる。ここでは、先ほどのdirectの例を使って、サーバー fedora-virt7 でキューへの入力を行い、その内容をサーバー fedora-virt8 で取り出す、という操作を行ってみた。

qpiddのFederation設定についてはこちらを参照。(http://qpid.apache.org/using-broker-federation.html)

Federationの設定は、python-qpidパッケージのqpid-routeコマンドで行う。(Sendmailのように設定ファイルで行うわけでは無いので注意。。 orz)

まず事前準備として、fedora-virt7/8の両方で、キューの作成を行っておく。

$ cd /usr/share/doc/python-qpid-0.5.819819/examples/direct
$ python declare_queues.py 

ここでルーティングを設定するのだが、AMQPのメッセージ交換では、exchangeと、ルーティングキーがアプリケーションごとに設定されており、その値を元に、ルーティングが行われる。directのサンプルでは exchangeが、"amq.direct"であり、 "routing_key"がルーティングキーとなる。(この値はスクリプトの先頭に書いてある。。w)

この状態で、ルーティングを設定するのだが、AMQPのルーティングはFederationであるため、設定はメッセージを受ける方(つまりここではfedora-virt8)で行うので注意(ただし認証が設定されていなければfedora-virt7でもコマンドは発行できるかもしれない。。)。実施するコマンドは次になる。

(fedora-virt8)$ qpid-route route add fedora-virt8 fedora-virt7 amq.direct routing_key

設定を確認したい場合、次のコマンドを実施する。

(fedora-virt8)$ qpid-route route map

Finding Linked Brokers:
    localhost:5672... Ok
    fedora-virt7:5672... Ok

Dynamic Routes:
  none found

Static Routes:

  localhost:5672(ex=amq.direct) <= fedora-virt7:5672(ex=amq.direct) key=routing_key

この状態で、次を実施すると、fedora-virt8でメッセージが取り出せるはずである。

(fedora-virt7)$ python direct_producer.py 
(fedora-virt8)$ python direct_consumer.py

※ なお、後で確認してみて気づいたのだが、fedora-virt8で取り出した後でも、fedora-virt7では取り出した内容が残っているらしい。(localhostの場合では、一度取り出したデータはキューから無くなる。)

なお、ルーティングは、一度qpiddをリスタートすると削除されるので注意。。 orz (削除されないようにするには、 --durable を使えばよいらしい。。)

qpidクラスタ

qpidではお互いにデータを双方向で同期し、Active/Activeのクラスタを構成することができる。<<参考リンク>>
http://qpid.apache.org/faq.html#FAQ-DoesQpidprovideFaultToleranceforthecluster%253F

構成の仕方は、こちらを参照。
http://qpid.apache.org/starting-a-cluster.html

ここでは、やはり先ほどのdirectの例を用い、クラスタの片側で書き込みを行い、もう片側からデータを取り出せるかどうかを試してみた。

クラスタの起動には、前段階として、corosync(マルチキャストを利用して、クラスタの状態を確認するらしい。。)を導入する必要がある。インストールはyumで実施出来る。

# yum install corosync

設定ファイルは /etc/corosync/corosync.conf となる。リンク先にある通り、基本的には設定としては、bindnetaddrを接続するイーサネットのネットワークアドレス(ここでは192.168.1.0とした。)にするだけだが、これだけだと上手くサービスが起動しなかったため、 "consensus: 1500" の設定を行っている。(/var/log/messsagesのエラーでこの値が1200以上でないと起動できないとの記述があったため追加。。orz)

10c10
< 		bindnetaddr: 192.168.1.0
---
> 		bindnetaddr: 192.168.1.1
14d13
< 	consensus: 1500

更にqpiddにcorosyncを使わせるため、qpiddのユーザー、グループを/etc/corosync/uidgid.d/qpid に追記する必要があった。

uidgid {
   uid: qpidd
   gid: qpidd
}

この状態で、corosyncが両側で起動できることを確認する。

(fedora-virt7/8)# service corosync start

起動時に両側で/var/log/messagesに次のようなメッセージが出て入れば成功である。

Apr  7 21:20:55 fedora-virt7 corosync[3691]:   [TOTEM ] A processor joined or left the membership and a new membership was formed.
Apr  7 21:20:55 fedora-virt7 corosync[3691]:   [MAIN  ] Completed service synchronization, ready to provide service.

合わせて、qpidにも、cluster向けのパッケージを追加する必要がある。

# yum install qpidd-cluster

clusterの設定として、/etc/qpidd.confに次を追記する。(クラスタ名は任意)

cluster-name=MYCLUSTER1

ここで、両側のqpiddを起動し、上手く起動できれば成功である。

この状態だと、どちらでpython_producer.pyを実施しても、python_consumer.pyで取り出すことが出来、かつ一度取り出したデータは両側で削除されることがわかる。

その他

qpiddはデフォルト状態ではほとんどログを出さないため、テスト中は/etc/qpidd.confで、次を設定しておくとよさそうである。。

log-to-file=/tmp/qpidd.log
log-enable=debug+

ざっくりと使ってみたが、妙にFTPなどで作り込んだ場合より、素直にメッセージの受け渡しができそうな印象を受けた。他にもActive/Activeのクラスタは他のサービスでは構成するのが難しいため、アプリケーションから接続するメッセージとしては、かなり有力であるものと思われる。今後広まるかどうかはわからないが、覚えておくと良さそうだ。。