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で取り出すことが出来、かつ一度取り出したデータは両側で削除されることがわかる。