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スクリプトを書いて所謂、専用のアクセサ的なものを作成して問い合わせするようです

0 件のコメント:

コメントを投稿