ラベル RabbitMQ の投稿を表示しています。 すべての投稿を表示
ラベル RabbitMQ の投稿を表示しています。 すべての投稿を表示

2015年2月28日土曜日

RabbitMQのプラグインを開発するための環境を準備してみた

概要

RabbitMQプラグインを開発するための環境構築をしてみました
実際にRabbtMQプラグインを開発するためにはerlangのコードが書けないとダメです
自分は書けないので環境を構築するまでの手順を紹介します

環境

  • CentOS 6.6 64bit (Final)
  • RabbitMQ 3.4.4
    RabbitMQ自体のインストールは今回は紹介しません
    インストール方法に関してはこちらで紹介しているので参照してみてください

環境構築

基本はコマンドベース構築していきます

必要なパッケージのインストール

作成するプラグインをビルドするために必要なパッケージをインストールしておきます

yum -y install libxslt gcc

Umbrellaのインストール

UmbrellaとはRabbitMQのプラグインを管理している仕組みです
サンプル開発用のプラグインも含めRabbitMQの安定版として動作しているプラグインのソースもインストールすることができます

git clone https://github.com/rabbitmq/rabbitmq-public-umbrella.git
cd rabbitmq-public-umbrella/
make co

make coするとRabbitMQのプラグインを次々とダウンロードしてきてくれます
結構な数があるのですべてのプラグインのダウンロードが完了するまで待ちます
ダウンロードが完了しmakeが問題なく終了すればUmbrellaのインストールは完了です

長いですが、完了後は以下のような感じでプラグインのフォルダが存在していればOKです

-rw-r--r--  1 root root   955  2月 24 19:58 2015 README-packaging
-rw-r--r--  1 root root  5505  2月 24 19:58 2015 Makefile
-rw-r--r--  1 root root 24897  2月 24 19:58 2015 LICENSE
-rw-r--r--  1 root root  2666  2月 24 19:58 2015 generate_deps
-rw-r--r--  1 root root   622  2月 24 19:58 2015 generate_app
-rwxr-xr-x  1 root root   142  2月 24 19:58 2015 foreachrepo
-rw-r--r--  1 root root 22541  2月 24 19:58 2015 do-package.mk
-rw-r--r--  1 root root  4461  2月 24 19:58 2015 common.mk
-rwxr-xr-x  1 root root  3206  2月 24 19:58 2015 check_xref
-rw-r--r--  1 root root   448  2月 24 19:58 2015 all-packages.mk
-rw-r--r--  1 root root   337  2月 24 19:58 2015 README.md
-rw-r--r--  1 root root 19770  2月 24 19:58 2015 README.makefiles
drwxr-xr-x  5 root root  4096  2月 24 19:58 2015 rabbitmq-docs
drwxr-xr-x  3 root root  4096  2月 24 19:58 2015 util
-rw-r--r--  1 root root  1368  2月 24 19:58 2015 umbrella.mk
-rw-r--r--  1 root root 11268  2月 24 19:58 2015 release.mk
drwxr-xr-x  2 root root  4096  2月 24 19:58 2015 release-build
drwxr-xr-x  9 root root  4096  2月 24 19:59 2015 rabbitmq-java-client
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-dotnet-client
drwxr-xr-x  6 root root  4096  2月 24 20:00 2015 rabbitmq-test
drwxr-xr-x  3 root root  4096  2月 24 20:00 2015 cowboy-wrapper
drwxr-xr-x  3 root root  4096  2月 24 20:00 2015 eldap-wrapper
drwxr-xr-x  3 root root  4096  2月 24 20:00 2015 mochiweb-wrapper
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-amqp1.0
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-auth-backend-ldap
drwxr-xr-x  4 root root  4096  2月 24 20:00 2015 rabbitmq-auth-mechanism-ssl
drwxr-xr-x  5 root root  4096  2月 24 20:00 2015 rabbitmq-consistent-hash-exchange
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-federation
drwxr-xr-x  5 root root  4096  2月 24 20:00 2015 rabbitmq-federation-management
drwxr-xr-x  9 root root  4096  2月 24 20:00 2015 rabbitmq-management
drwxr-xr-x  4 root root  4096  2月 24 20:00 2015 rabbitmq-management-agent
drwxr-xr-x  5 root root  4096  2月 24 20:00 2015 rabbitmq-management-visualiser
drwxr-xr-x  5 root root  4096  2月 24 20:01 2015 rabbitmq-web-dispatch
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 rabbitmq-mqtt
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 rabbitmq-shovel
drwxr-xr-x  7 root root  4096  2月 24 20:01 2015 rabbitmq-shovel-management
drwxr-xr-x  8 root root  4096  2月 24 20:01 2015 rabbitmq-stomp
drwxr-xr-x  4 root root  4096  2月 24 20:01 2015 rabbitmq-toke
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 rabbitmq-tracing
drwxr-xr-x  5 root root  4096  2月 24 20:01 2015 rabbitmq-web-stomp
drwxr-xr-x  5 root root  4096  2月 24 20:01 2015 rabbitmq-web-stomp-examples
drwxr-xr-x  3 root root  4096  2月 24 20:01 2015 sockjs-erlang-wrapper
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 toke
drwxr-xr-x  3 root root  4096  2月 24 20:01 2015 webmachine-wrapper
drwxr-xr-x  4 root root  4096  2月 24 20:09 2015 coverage
drwxr-xr-x  3 root root  4096  2月 24 20:09 2015 rabbitmq-codegen
drwxr-xr-x 11 root root  4096  2月 24 20:15 2015 rabbitmq-server
drwxr-xr-x  9 root root  4096  2月 24 20:15 2015 rabbitmq-erlang-client
drwxr-xr-x  8 root root  4096  2月 24 20:15 2015 rabbitmq-metronome

サンプルプラグインをビルドしてみる

ダウンロードしたプラグインの中にrabbitmq-metronomeというフォルダがあり、これがサンプル用のプラグインになります
これをビルドして実際にRabbitMQ本体に追加するところまでやってみたいと思います

まずはビルドしてみます

cd rabbitmq-metronome
make

するとダーっとログが流れてビルドがはじまります
結構時間がかかるので失敗しないように祈りながら待ちます

ビルドが完了したら成果物である.ezファイルをRabbitMQ本体にインストールしてプラグインを有効にします

cp dist/rabbitmq_metronome-0.0.0.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.4.4/plugins/
rabbitmq-plugins list
rabbitmq-plugins enable rabbitmq_metronome

.ezファイルを本体にpluginsフォルダに移動するだけでOKです
そのあとはrabbitmq-pluginsコマンドを使ってプラグインを有効にするだけです
listしてみると分かりますが、移動したezファイルのプラグインが一覧に出てくることがわかると思います

動作を確認してみる

サンプルのrabbitmq-metronomeプラグインはConnectionとChannelをExchangeを1つずつ生成してMessageRate 1.0 req/sec でメッセージを送信してくれるプラグインのようです
管理UIにアクセスしてConnectionsタブを見てみましょう
connections.png
こんな感じで常に接続されているConnectionsが確認できればプラグインがうまく動作していることになります

最後に

このままrabbitmq-metronomeプラグインを修正したい場合はrabbitmq-metronome/src配下の.erlファイルや.srcファイルを修正しmakeしてezファイルを作成してから、pluginsファルダに移動してという流れを繰り返せばOKです
参考サイトに記載した公式をみるとrabbit_metronome_worker.erlがコアの部分を実装しているのでここを修正しましょう的なことが書いてありました
が、ボクは試していないので最中ではないです

erlangが書けて読める人だったらこっからちょろっとプラグインを作ってしまうのだろうか
時間があったらやってみよう

参考サイト

2015年2月25日水曜日

CentOSにRabbitMQをインストール

概要

過去に試してみたのですが改めてインストール手順をまとめてみました
前回はChefでレシピからインストールしましたが今回はChefを使わずコマンドベースで順次インストールしてみました

環境

  • CentOS 6.6 64bit (Final)
  • RabbitMQ 3.4.4
  • erlang R14B04 (5.8.5)

インストール

erlangのインストール

RabbitMQを使うためにはerlang R13B-03以上が動作する環境が必要です
erlangのパッケージはEPELで公開されているのまずEPELのリポジトリを追加します

EPELリポジトリの追加

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

インストールするバージョンに気をつけてください
RabbitMQの公式からもリンクされているページに各バージョンごとのEPELリポジトリのインストール方法が記載されているので確認してください

erlangパッケージをyumでインストール

yum clean all
yum -y install erlang

大量の依存性解決が発生すると思います
インストールが完了したらバージョンが表示されることを確認してください

erl -version

Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.8.5

erlangのインストールはこれで完了です

RabbitMQのインストール

rpmコマンドでrabbitmq-serverのインストール

公式で公開されているrpmを使ってrabbitmq-serverをインストールします
バージョンは変更している可能性があるので公式で適宜確認してください

rpm -Uvh https://www.rabbitmq.com/releases/rabbitmq-server/v3.4.4/rabbitmq-server-3.4.4-1.noarch.rpm

インストールが完了するとrabbitmq-serverrabbitmqctlというコマンドが使えるようになっています

バージョンを確認してみましょう
一度起動する必要があります

service rabbitmq-server start
rabbitmqctl status | grep running_applications

{running_applications,[{rabbit,"RabbitMQ","3.4.4"},

起動スクリプトも作成されているので必要であればchkconfigでrabbitmq-serverをonにしてください

chkconfig rabbitmq-server on

起動

バージョンを確認するのに起動していると思いますが以下のコマンドで起動できます
停止する場合はstopにします

service rabbitmq-server start

管理画面を表示するプラグインの追加

これはインストールしたら絶対にやったほうがいいと思います
RabbitMQにはプラグイン機構がありプラグインを有効にするだけで簡単に機能を追加することができます

rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart

プラグインをenableにしたらrabbitmq-serverを再起動しましょう
rabbitmq-plugins listというコマンドを実行すれば現在有効になっているプラグインの一覧を確認することができます

guestユーザでログインできるように設定する

いつからのバージョンからかデフォルトで用意されているguestユーザがリモート環境からアクセスできずlocalhostからのみアクセス可能になっていました

セキュリティの観点からだと思いますが/etc/rabbitmq/rabbitmq.configに以下を記載することでguestユーザがリモートからアクセスできるようになります

[{rabbit, [{loopback_users, []}]}].

設定ファイルがない場合は作成してOKです
記載したらrabbitmq-serverを再起動しましょう

管理画面にアクセスしてみる

管理画面が有効になっているか確認してみましょう
http://hostname:15672/
にアクセスします

認証画面が表示されるのでUsernameとPasswordに guest/guest と入力してください
デフォルトで作成されているguestアカウントでログインします

ログインできればあとはここからキューを作成したりメッセージを飛ばしたりすることができます

とりあえずこの管理画面を表示するまでがインストールの一覧の流れかなと思います

最後に

紹介は以上です
過去に紹介した記事と同じような内容になってしまいましたがguestユーザのACLに関しては前回紹介していなかったと思います

おそらくChefのレシピでインストールしてもyumとrpmを使っていると思いますがちゃんとインストール方法を理解しておくのも大事かなと思います

2014年11月27日木曜日

WindowsサーバにRabbitMQをインストールしてみた

概要

Windows + Cygwin環境上でRabbitMQを動作させてみました

環境

  • Windows7 64bit
  • Cygwin 1.7.32-1
  • apt-cyg 0.59
  • erlang 17.3
  • RabbitMQ

インストール

erlangのインストール

erlangのダウンロードサイトから最新のerlangのインストーラをダウンロードしてきます
ダウンロードが完了したらインストーラを起動してインストールします
2014/11/26のWindows7 64bitの最新版は「OTP 17.3 Windows 64-bit Binary File (91.0 MB) 」でした

インストールに関しては特に問題ないと思います
サイズがでかくダウンロードに時間がかかるのとローカルのストレージの残容量にご注意ください

ERLANG_HOMEの設定

デフォルトだと「C:\Program Files\erl6.2」にインストールされるようです
これをERLANG_HOMEとしてWindowsのシステム環境変数に追加します

コントロールパネル -> システムとセキュリティ -> システム -> システムの詳細設定 -> 環境変数

erlang_path_config.png
必ずシステムの環境変数に設定してください
これでerlangの設定はOKです

RabbitMQのインストール

https://www.rabbitmq.com/releases/rabbitmq-server/v3.4.1/rabbitmq-server-windows-3.4.1.zip
をダウンロードします
ダウンロードしてできたzipファイルを解凍します
あとは解凍したファイルを適当なパスに配置します

mkdir -p ~/Documents/work/rabbitmq/
cd ~/Downloads/
unzip rabbitmq-server-windows-3.4.1.zip
mv rabbitmq_server-3.4.1 ~/Documents/work/rabbitmq/

これでインストールは完了です

RabbbitMQの起動

では起動するか確認してみましょう
先ほどインストールしたディレクトリに移動してbatファイルを実行します
同じターミナルで作業している場合は一旦閉じるか別のターミナルで作業をしてください
ERLANG_HOMEをターミナルに反映させるためです

cd ~/Documents/work/rabbitmq/rabbitmq_server-3.4.1
cd sbin
./rabbitmq-server.bat

で以下のように起動すればOKです

username@localhost ~/Documents/work/rabbitmq/rabbitmq_server-3.4.1/sbin
$ ./rabbitmq-server.bat

              RabbitMQ 3.4.1. Copyright (C) 2007-2014 GoPivotal, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: C:/Users/username/AppData/Roaming/RabbitMQ/log/rabbit@localhost.log
  ######  ##        C:/Users/username/AppData/Roaming/RabbitMQ/log/rabbit@localhost-sasl.log
  ##########
              Starting broker... completed with 0 plugins.

停止する場合は

./rabbitmqctl.bat stop

で停止できます

管理UIを有効にする

一旦stopした後に

./rabbitmq-plugins.bat enable rabbitmq_management

でプラグインを有効化してから、起動してください
その後http://localhost:15672/にアクセスして
guest/guestでログインすることができます(デフォルトのユーザとPWです)

紹介は以上です
意外と簡単にできました
上記のコマンドや作業はすべてCygwin上で実行しています

参考サイト

2014年6月28日土曜日

rabbiqmqでMQTTプロトコルを試してみた

■環境
CentOS release 5.10 (Final)
RabbitMQ 3.0.4
※RabbitMQインストール方法
Java 1.7.0_05
Maven 3.1.0
※MQTT用のJavaのクライアントライブラリを使って接続テストをするために必要です

■MQTTの設定
rabbitmq-plugins enable rabbitmq_mqtt
rabbitmq-plugins list | grep rabbitmq_mqtt
[E] rabbitmq_mqtt                     3.0.4

/etc/init.d/rabbitmq-server start

Webの管理コンソールのOverviewを見てmqttプロトコルが有効になっていることを確認します

■MQTTを試してみる
Javaのクライアントライブラリがありましたのでそれを使ってみます

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.sample.rabbitmq.mqtt -DartifactId=mqtt_test

emacs pom.xml

dependencies タグ内に以下を記載してください
<dependency>
  <groupId>org.fusesource.mqtt-client</groupId>
  <artifactId>mqtt-client</artifactId>
  <version>1.10</version>
  <scope>compile</scope>
</dependency>

project タグ内に以下を記載してください
<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <configuration>
        <mainClass>com.sample.rabbitmq.mqtt.App</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

emacs src/main/java/com/sample/rabbitmq/mqtt/App.java
package com.sample.rabbitmq.mqtt;

import java.net.URISyntaxException;

import org.fusesource.mqtt.client.*;

public class App {

public static void main( String[] args ) throws URISyntaxException, Exception {
        String topic = "test/topic";

        MQTT mqtt = new MQTT();
        mqtt.setHost("localhost", 1883);
        BlockingConnection bc = mqtt.blockingConnection();
        bc.connect();
        // subscribe
        Topic[] topics = {
            new Topic(topic, QoS.AT_LEAST_ONCE)
        };
        byte[] qoses = bc.subscribe(topics);
        for (byte qos: qoses) {
            System.out.println(qos);
        }

        // send message
        bc.publish(topic, "payloadA".getBytes(), QoS.AT_LEAST_ONCE, false);
        bc.publish(topic, "payloadB".getBytes(), QoS.AT_LEAST_ONCE, false);

        // receive message
        Message message = bc.receive();
        System.out.println(message.getTopic());
        byte[] payload = message.getPayload();
        message.ack();
        System.out.println(new String(payload, "UTF-8"));

        message = bc.receive();
        System.out.println(message.getTopic());
        payload = message.getPayload();
        message.ack();
        System.out.println(new String(payload, "UTF-8"));

        bc.disconnect();
    }

}

mvn clean compile exec:java
1
test/topic
payloadA
test/topic
payloadB
(・・・ここで停止する・・・)

■動作説明
接続前に subscribe することで MQTT で使用する Exchange とそれにバインドする Routing Key を決定します


本ライブラリを使った RabbitMQ での MQTT の場合は Exchange を経由してとメッセージのやりとりをするようです
subscribe 時に指定している Topic 名は Exchange にバインドするRouting Keyとして使用されます(何でもOKです)
ただ、publish するときや receive するときはこのバイティングされた Routing Key を指定する必要があります

publish するときの第一引数には subscribe 時に指定した Routing Key を指定します
receive 時には subscribe で指定した Routing Key を自動で判断してメッセージの受信を行います

MQTT でのメッセージのやり取りがあった場合には RabbitMQ 側に一時的なキューが作成されます
disconnect するとこのキューは削除されなくなります
(connect するたびにキューが作成されるようです)


サンプルでは2回 publish して3回 receive しています
receive 時にキューにメッセージがない場合は次のメッセージが到着するまで待ち続けます
MQTT 用に一時的に作られたキューに対して管理コンソールなどから publish message するとそのメッセージを受信して処理が終了します

サンプルでは同期処理でメッセージのやり取りをやっています
FutureConnection という機能がありこれを使うと非同期でメッセージのやり取りを行うことができます

以上です
とりあえず RabbitMQ を使って MQTT を動作させることができました
実際に HTTP や AMQP との比較は行っていないのでどれだけ軽量なのかわかっていませんが
せっかく動いたので次は比較でもできればなと思います

■参考サイト

2013年6月27日木曜日

Federation exchange 'amq.rabbitmq.trace' in vhost '/' connected to exchange 'amq.rabbitmq.trace' in vhost '/' on amqp://localhost:5672

ローカルホストを設定するとき
amqp://localhost

リモートホストを設定するとき
amqp://guest:guest@rabbittest(違うホスト)


URIの最後に/を入れるとはまります
特にvhost「/」指定しようとした場合です

2013年5月28日火曜日

【erlang】rabbitmqで使っているmnesiaの中身を直接さわってみた

■概要
rabbitmqはerlangで実装されている分散型メッセージキューシステムです
そのrabbitmqが使っているDBがmnesiaと呼ばれる分散DBMSでerlangをインストールするとデフォルトで組み込まれているDBを使っています
今回は勉強も兼ねてrabbitmqのデータが保存されているmnesiaに直接触ってみました
使えそうなコマンドをざっくばらん書いたので見づらいです。。。

■mnesia起動
erl -sname rabbit -mnesia dir '"/var/lib/rabbitmq/mnesia/rabbit\@localhost/"'
いきなりポイントですが、erlコマンドで対話式のモードに入る際にrabbitmqを起動するユーザとrabbitmqのデータを保存しているmnesiaのディレクトリを保存しなければなりません
これを指定しないとデフォルトユーザとノードでmnesiaで起動してしまうためrabbitmqのDBにアクセスできません

mnesia:start().
erlangの対話型になったら上記コマンドを実行してmnesiaを起動します。以後はmnesia系のコマンドがTABで補完されるようになります

■データ閲覧
以下閲覧系のコマンドを紹介します
mnesia:info().
でデータベースの一覧やmnesiaの情報を閲覧できます
ram_copiesで表示されているテーブルが再起動するとrabbitmpから消えてしまうテーブルで
disc_copiesに表示されているテーブルが再起動後もデータ保存されているテーブルです
running db nodesにrabbitユーザで動作しているノード情報が表示されていることを確認します
そうなっていないとrabbitmqが保持しているmnesiaデータに問い合わせできません

mnesia_schema:info().
mnesia_schema:info(rabbit_vhost).
全テーブルのスキーム情報が詳細に閲覧できます
テーブルを指定してあるテーブルのみ参照することも可能です

mnesia:system_info(tables).
上記同様にmnesiaのテーブルの一覧を閲覧することができます

mnesia:dirty_all_keys(rabbit_vhost).
rabbit_vhostテーブルを一位に識別することができるのkeyオブジェクトが取得できます
ここで取得したkey名を使って問い合わせることになります

mnesia:dirty_first(rabbit_vhost).
rabbit_vhostのはじめの要素を取得することができます

mnesia:dirty_read(rabbit_vhost, <<"/">>).
指定したkeyの情報を取得します
ここのkeyの情報はdirty_all_keysで取得した形式のkey情報をそのまま入力しました
ちなみに上記だと[{vhost,<<"/">>,undefined}]なのが取得できました

mnesia:dirty_match_object(rabbit_vhost, {'_','_','_'}).
rabbit_vhostテーブルに格納されているすべてのレコードを抽出します
テーブルのカラム分「'_'」を記載すると全レコードを抽出できるようです(めんどくさい、他にもっと簡単に全部のレコードを取得できるコマンドがあると思います)
mnesia:schemaを実行した際に結果の下の方に表示されるwild_pattternと同じフォーマットを入力しても大丈夫です

■データ投入・削除
mnesia:dirty_write(rabbit_vhost, {'vhost',<<"testvhost">>,'undefined'}).
rabbit_vhostテーブルにレコードを1行追加します
第2引数のレコードはdirty_match_objectで取得できた形式で入力すれば大丈夫です
ついでに、直接データを投入したあとに、erlを抜けてrabbitmqをスタートしてみたけど普通に動作してかつrabbitmtctl list_vhostsで閲覧できた
(実際にdeclareできたかまでは検証してません)
ただ、このやり方は通常のレコード投入とは異なる方法ですので全くおすすめはしません
またtestvhostの部分は「<<>>」で囲んでバイナリデータとして投入しないとダメみたいです

mnesia:dirty_delete_object(rabbit_vhost, {vhost,'<<"testvhost">>',undefined}).
rabbit_vhostからレコードを1行削除する方法です
object削除なので、こちらもレコード情報をすべて指定しないと削除できません

■その他
・mnesia:table(rabbit_vhost).
でテーブルのデータが見れるが情報がよくわからない
・regs().
・nregs().
ノード登録情報を表示します
nがついているほうはクラスタとして登録してあるノード情報も表示します
・ets:hogehoge
mnesiaと一緒でデフォルトで入っている別のDBMS
どうやらrabbitmqはこちらにも保存している?(すいません調査できてません)
・c(test.erl).
test.erlで定義したerlangの関数が使えるようになる
成功する.beamというファイルができます
本来はこうやって独自でアクセサ的なもの作成してDBにはアクセスするみたいです
・erlangは大文字で始まるのが変数として管理される
・mnesia:dirty_hogehoge系のコマンドに関して
読んで字のごとくあまり使わないコマンドで本来なら自分でerlangスクリプトを書いて所謂、専用のアクセサ的なものを作成して問い合わせするようです

2013年5月8日水曜日

rabbitmq clusterやってみた

■概要
rabbitmqでclusterを構成を組んだ上でキューの作成やメッセージの送受信をしてみました

■rabbitmqインストール
以下の記事を参考に2台のrabbitmqサーバを作成します
chefによるインストールを紹介していますが、普通にchefじゃなくても大丈夫です
http://kakakikikeke.blogspot.com/2013/05/rabbitmq.html

■cluster構成作成
・スレーブ側操作
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@マスタ側サーバIP
rabbitmqctl start_app
・マスタ側操作
rabbitmqctl cluster_status

クラスタとして追加したサーバはRAMモードとDISKモードというキューの保存方法が異なる形式を選択することができます
DISKモードに変更したい場合は以下の操作をスレーブ側で実行します
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
rabbitmqctl start_app

クラスタから外したいときは以下の操作をスレーブ側で実行します
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

■キュー作成とメッセージのやりとり
※guestユーザでvhost「/」に対して実行した場合です
rabbitmqadmin --host サーバのIPアドレス declare queue name=testqueue001
rabbitmqadmin --host サーバのIPアドレス list queues
rabbitmqadmin --host サーバのIPアドレス publish routing_key=testqueue001 payload="test message 001" exchange=amq.default
rabbitmqadmin --host サーバのIPアドレス get queue=testqueue001 requeue=false

上記実施後にマスタサーバとスレーブサーバ両方でキューの確認をすると両方のサーバに情報が反映されていることがわかります

■注意事項
The nodes provided are either offline or not running
上記のエラーが出るときはerlang.cookiesという設定ファイルがサーバ同志で共有されてない場合にでます
/var/lib/rabbitmq/.erlang.cookie
上記を共有したあとにrabbitmqを再起動すると直ります

2013年5月7日火曜日

rabbitmqやってみた

■概要
rabbitmqサーバ1台とクライアント1台で簡単なキュー処理をやってみた
ユーザとかvhostとか権限とかもやってみた

■rabbitmqインストール
今回はchefでインストールします、なのであらかじめchefをインストールしておいてください
http://kakakikikeke.blogspot.jp/2013/03/chefomnibus.html
またrabbitmqのchefインストールは以下に必要なcookbooksも含めてまとめています(一番したの方)
http://kakakikikeke.blogspot.jp/2013/05/opscodecookbooks.html

■rabbitmqadminインストール
※rabbitmqctlではクライアントツールとして動作しないのでデフォルトで付属している専用のクライアントツールをインストールする
※15672のWeb-API用のポートを使って通信する
・サーバ側操作
rabbitmq-plugins enable rabbitmq_management
/etc/init.d/rabbitmq-server restart
netstat -an | grep 15672
15672で新しくプロセスが上がっていることを確認する
・クライアント側操作
cd /usr/local/sbin
wget http://サーバ側IPアドレス:15672/cli/rabbitmqadmin
chmod 755 rabbitmqadmin
以下からはクライアント側で操作する

■ユーザとvhostと権限の作成
rabbitmqadmin --host サーバのIPアドレス declare vhost name=testvhost
rabbitmqadmin --host サーバのIPアドレス declare user name=kakakikikeke password=********** tags=testtag
rabbitmqadmin --host サーバのIPアドレス declare permission vhost=testvhost user=kakakikikeke configure=".*" write=".*" read=".*"

rabbitmqではユーザを指定しないとguest:administratorでアクセスされます
vhostも「/」のみが有効になっています
「ユーザ」「vhost」「権限」のつながりをまとめると
ユーザとvhostを作成してvhostに対してどんな権限かと誰が触れるかを設定します

■クライアント・サーバで検証
キューを作成して確認したあとメッセージを送信し受信します

rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** declare queue name=testqueue001
rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** list queues
rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** publish routing_key=testqueue001 payload="test message 001" exchange=amq.default
rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** get queue=testqueue001 requeue=false

他のアクションコマンドの一覧を表示
rabbitmqadmin help subcommands

AMQP互換のrabbitmqには様々なクライアントが用意されており簡単に触れます
今回は付属のcliツールを使いましたが、他にもいろいろありかつクライアントによっては
実装されていない機能もあるので、結構良し悪しがありそうです

■Tips
キューを作成する際にdurable=falseで作成するとrabbitmqが再起動した後にキューが削除されている