rabbitmqはerlangで実装されている分散型メッセージキューシステムです
そのrabbitmqが使っているDBがmnesiaと呼ばれる分散DBMSでerlangをインストールするとデフォルトで組み込まれているDBを使っています
今回は勉強も兼ねてrabbitmqのデータが保存されているmnesiaに直接触ってみました
使えそうなコマンドをざっくばらん書いたので見づらいです。。。
その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で補完されるようになります
■データ閲覧
以下閲覧系のコマンドを紹介します
ram_copiesで表示されているテーブルが再起動するとrabbitmpから消えてしまうテーブルで
disc_copiesに表示されているテーブルが再起動後もデータ保存されているテーブルです
running db nodesにrabbitユーザで動作しているノード情報が表示されていることを確認します
そうなっていないとrabbitmqが保持しているmnesiaデータに問い合わせできません
テーブルを指定してあるテーブルのみ参照することも可能です
ここで取得したkey名を使って問い合わせることになります
ここのkeyの情報はdirty_all_keysで取得した形式のkey情報をそのまま入力しました
ちなみに上記だと[{vhost,<<"/">>,undefined}]なのが取得できました
テーブルのカラム分「'_'」を記載すると全レコードを抽出できるようです(めんどくさい、他にもっと簡単に全部のレコードを取得できるコマンドがあると思います)
mnesia:schemaを実行した際に結果の下の方に表示されるwild_pattternと同じフォーマットを入力しても大丈夫です
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).
・nregs().
・mnesia:dirty_hogehoge系のコマンドに関して
でテーブルのデータが見れるが情報がよくわからない
・regs().・nregs().
ノード登録情報を表示します
nがついているほうはクラスタとして登録してあるノード情報も表示します
・ets:hogehogenがついているほうはクラスタとして登録してあるノード情報も表示します
mnesiaと一緒でデフォルトで入っている別のDBMS
どうやらrabbitmqはこちらにも保存している?(すいません調査できてません)
・c(test.erl).どうやらrabbitmqはこちらにも保存している?(すいません調査できてません)
test.erlで定義したerlangの関数が使えるようになる
成功する.beamというファイルができます
本来はこうやって独自でアクセサ的なもの作成してDBにはアクセスするみたいです
・erlangは大文字で始まるのが変数として管理される成功する.beamというファイルができます
本来はこうやって独自でアクセサ的なもの作成してDBにはアクセスするみたいです
・mnesia:dirty_hogehoge系のコマンドに関して
読んで字のごとくあまり使わないコマンドで本来なら自分でerlangスクリプトを書いて所謂、専用のアクセサ的なものを作成して問い合わせするようです
0 件のコメント:
コメントを投稿