<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ricollab Web Tech Blog &#187; mogilefs</title>
	<atom:link href="http://blogs.ricollab.jp/webtech/tag/mogilefs/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.ricollab.jp/webtech</link>
	<description>ricollab engineers' blog</description>
	<lastBuildDate>Mon, 26 Apr 2010 02:09:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MogileFS のために MySQL の NDB Cluster を動かす</title>
		<link>http://blogs.ricollab.jp/webtech/2008/07/mysql_ndb_cluster/</link>
		<comments>http://blogs.ricollab.jp/webtech/2008/07/mysql_ndb_cluster/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 04:33:39 +0000</pubDate>
		<dc:creator>StL</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[mogilefs]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[NDB Cluster]]></category>

		<guid isPermaLink="false">http://blogs.ricollab.jp/webtech/2008/07/mysql_ndb_cluster/</guid>
		<description><![CDATA[お久しぶりです、日野原です。引き続き MogileFS の話題です。
と言っても前回の続きで開発環境上での話ではなく、サーバに MogileFS を入れていこうと言う話になります。
そこで MogileFS についてちゃんと調べ始めると、「Learning MogileFS」という資料の「mysql database cluster」のところになんと「その名の通りNDB Cluster推奨」と書いてあるではありませんか。
というわけで今回は MySQL の NDB Cluster を 3 台の CentOS 5.2 のマシンにセットアップします。NDB Cluster 自体の説明はThink ITの記事などいろいろとあるので、参考にしてください。
インストールにはrpm 形式で配布されているバイナリを使います。（CentOS 5.2 なので Red Hat Enterprise Linux 5 用の RPM をダウンロードします。記事中ではダウンロードの部分は省略します。）
配布されているページに行くとバージョン番号が MySQL Cluster 6.2.15 となっていて面食らいますが、管理ツールの出力によると MySQL 自体は 5.1.23 で、その上に ndb の 6.2.15 が載っているようです。
今回の構成では、クラスタの 3 種類のノードは以下のように構成します。

3台のマシンのホスト名は srv[1-3] 、IPは 192.168.10.[1-3] とします。そして srv1 上で管理ノード（ndb_mgmd）、srv2 [...]]]></description>
			<content:encoded><![CDATA[<p>お久しぶりです、日野原です。引き続き MogileFS の話題です。</p>
<p>と言っても前回の続きで開発環境上での話ではなく、サーバに MogileFS を入れていこうと言う話になります。</p>
<p>そこで MogileFS についてちゃんと調べ始めると、「<a href="http://d.hatena.ne.jp/ZIGOROu/20061020/1161361212">Learning MogileFS</a>」という資料の「mysql database cluster」のところになんと「その名の通りNDB Cluster推奨」と書いてあるではありませんか。</p>
<p>というわけで今回は MySQL の NDB Cluster を 3 台の CentOS 5.2 のマシンにセットアップします。NDB Cluster 自体の説明は<a href="http://www.thinkit.co.jp/article/95/2/">Think ITの記事</a>などいろいろとあるので、参考にしてください。<br />
インストールには<a href="http://dev.mysql.com/downloads/cluster/index.html">rpm 形式で配布されているバイナリ</a>を使います。（CentOS 5.2 なので Red Hat Enterprise Linux 5 用の RPM をダウンロードします。記事中ではダウンロードの部分は省略します。）</p>
<p>配布されているページに行くとバージョン番号が MySQL Cluster 6.2.15 となっていて面食らいますが、管理ツールの出力によると MySQL 自体は 5.1.23 で、その上に ndb の 6.2.15 が載っているようです。</p>
<p>今回の構成では、クラスタの 3 種類のノードは以下のように構成します。<br />
<a href="http://blogs.ricollab.jp/webtech/wp-content/uploads/2008/07/mysql_cluster.png"><img src="http://blogs.ricollab.jp/webtech/wp-content/uploads/2008/07/mysql_cluster.png" style="float: none" /></a></p>
<p>3台のマシンのホスト名は srv[1-3] 、IPは 192.168.10.[1-3] とします。そして srv1 上で管理ノード（ndb_mgmd）、srv2 と srv3 上で SQLノード（mysqld）とデータノード（ndbd）を動かします。</p>
<p>この構成だと管理ノードが単一故障点になってしまっていますが、ここを複数構成にするための説明はまだ見つかっていないので今後の課題とさせてください。</p>
<p>それでは実際にインストール作業を始めていきます。<br />
ちなみに、今回のサーバはちゃんと識者に CPAN が使えるようにしてもらってあるので、perl のモジュールのインストールは yum ではなく CPAN から行います。</p>
<p>まずは管理ノードです。<br />
管理ノードに必要なのは以下の3つです。</p>
<ul>
<li> perl の Class::MethodMaker モジュール</li>
<li> MySQL-Cluster-gpl-management-6.2.15-0.rhel5.i386.rpm</li>
<li> MySQL-Cluster-gpl-tools-6.2.15-0.rhel5.i386.rpm</li>
</ul>
<p>これらを srv1 にインストールします。</p>
<pre><code>% sudo cpan -i Class::MethodMaker
% sudo rpm -ivh MySQL-Cluster-gpl-management-6.2.15-0.rhel5.i386.rpm
% sudo rpm -ivh MySQL-Cluster-gpl-tools-6.2.15-0.rhel5.i386.rpm</code></pre>
<p>次に設定ファイルを作成します。今回は設定ファイルは /var/lib/mysql-cluster/config.ini という名前で配置します。また、管理ノードは mysql というユーザで起動しますので、ユーザを作成しておいてください。</p>
<pre><code>% sudo /usr/sbin/useradd mysql -d /var/lib/mysql-cluster
% cd /var/lib
% sudo mkdir mysql-cluster
% sudo chown mysql:mysql mysql-cluster
% cd mysql-cluster
% sudo vim config.ini
% cat config.ini
[NDBD DEFAULT]
NoOfReplicas = 2
DataDir = /var/lib/mysql-cluster
ServerPort = 63132[MGM]
Id = 1
HostName = 192.168.10.1
DataDir = /var/lib/mysql-cluster

[NDBD]
Id = 11
HostName = 192.168.10.2

[NDBD]
Id = 12
HostName = 192.168.10.3

[MYSQLD]
Id = 21
HostName = 192.168.10.2

[MYSQLD]
Id = 22
HostName = 192.168.10.3</code></pre>
<p>ここで、NDBD DEFAULT セクションの最後の ServerPort がはまりどころです。<br />
<a href="http://dev.mysql.com/doc/refman/5.1/ja/mysql-cluster-ndbd-definition.html">オフィシャルのドキュメント</a>を見ると「旧式」となっており、「デフォルトのポートは同じコンピュータ上の 2 つのノードが同じポート番号を受信しないようにダイナミックに割り当てられているため、通常このパラメータの値を指定する必要はありません。」とあるのですが、これを指定しておかないとファイアーウォールに阻まれて通信がうまくいきません。ひょっとしたら将来のバージョンでは不要になるかもしれませんが、今回インストールしたバージョンでは必要です。<br />
具体的には、データノードから管理ノードに一見ちゃんと接続されているように見えているのに接続されておらず、SQLノードが管理ノードに接続できないという現象が起こります。<br />
私はこれで2日つぶしました。</p>
<p>そのほかのオプションについては<a href="http://dev.mysql.com/doc/refman/5.1/ja/mysql-cluster-config-file.html">オフィシャルのドキュメント</a>を見てください。<a href="http://dev.mysql.com/doc/refman/5.1/ja/mysql-cluster-config-example.html">基本的な設定例</a>等を見ればわかると思います。</p>
<p>設定ファイルができたら管理ノードにアクセスするためのポートを開けます。</p>
<pre><code>% sudo /usr/sbin/lokkit</code></pre>
<p>デフォルトのポートの 1186 は CentOS 5.2 では /etc/services に書いてあるので、カスタマイズのボタンから「その他のポート」に「mysql-cluster:tcp」を追加します。</p>
<p>そして、管理ノードを起動します。</p>
<pre><code>% sudo -u mysql /usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini</code></pre>
<p>起動したら、管理クライアントを起動して show コマンドで状況を確認してみましょう。</p>
<pre><code>% ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm&gt; show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=11 (not connected, accepting connect from 192.168.10.2)
id=12 (not connected, accepting connect from 192.168.10.3)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.10.1  (mysql-5.1.23 ndb-6.2.15)

[mysqld(API)]   2 node(s)
id=21 (not connected, accepting connect from 192.168.10.2)
id=22 (not connected, accepting connect from 192.168.10.3)</code></pre>
<p>これで管理ノードの準備はOKです。</p>
<p>次にデータノードとSQLノードの設定をしますが、これは srv2 と srv3 の両方に対して実行します。以下では srv2 に対して実行しているものとして解説しますが、srv3 に対しても実行してください。</p>
<p>まず、最低限必要なのは以下の4つです。</p>
<ul>
<li>perl の DBI モジュール</li>
<li>MySQL-Cluster-gpl-client-6.2.15-0.rhel5.i386.rpm</li>
<li>MySQL-Cluster-gpl-storage-6.2.15-0.rhel5.i386.rpm</li>
<li>MySQL-Cluster-gpl-server-6.2.15-0.rhel5.i386.rpm</li>
</ul>
<p>これらを順にインストールします。</p>
<pre><code>% sudo cpan -i DBI
% sudo rpm -ivh MySQL-Cluster-gpl-client-6.2.15-0.rhel5.i386.rpm
% sudo rpm -ivh MySQL-Cluster-gpl-storage-6.2.15-0.rhel5.i386.rpm
% sudo rpm -ivh MySQL-Cluster-gpl-server-6.2.15-0.rhel5.i386.rpm
% mysqladmin -u root password rootpass</code></pre>
<p>（mysql のルートのパスワードは適切に設定してください）</p>
<p>次に設定ファイルを作成します。ひな形はrpmで提供されているので、これを /etc/ 以下にコピーして、NDB Clusterに必要な設定を追加します。</p>
<pre><code>% sudo cp /usr/share/doc/MySQL-Cluster-gpl-server-6.2.15/my-large.cnf /etc/my.cnf
% sudo vim /etc/my.cnf</code></pre>
<p>追加するのは以下の内容です。<br />
[mysqld]セクション内に以下の2行</p>
<pre><code>ndbcluster
ndb-connectstring = 192.168.10.1</code></pre>
<p>ファイル末尾に [mysql_cluster] セクションを追加して1行。</p>
<pre><code>ndb-connectstring = 192.168.10.1</code></pre>
<p>そしてファイアーウォールの設定をします。</p>
<pre><code>% sudo /usr/sbin/lokkit</code></pre>
<p>で、受信を許可する「その他のポート」に「63132:tcp mysql:tcp」と書きます。</p>
<p>また、これだけだと mysql が管理ノードにアクセスしに行くときに selinux に引っかかってエラーになるのですが、そのエラーをわざと一度起こして許可ルールを作るためのログを吐かせます。<br />
もし、/var/log/audit というディレクトリが存在しない場合、audit をインストールしておいてください。</p>
<pre><code>% sudo yum install audit
% sudo /etc/init.d/auditd start% sudo /etc/init.d/mysql start
% sudo grep denied /var/log/audit/audit.log</code></pre>
<p>これで、</p>
<pre><code>type=AVC msg=audit(1216111039.402:59893): avc:  denied { name_con
nect } for  pid=29878 comm="mysqld" dest=32960 scontext=user_u:sy
stem_r:mysqld_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tc
p_socket</code></pre>
<p>というような行が見つかればOKです。（適当に改行してありますが、本当は一行です。）<br />
mysql はこのまま起動に失敗してプロセスが残ったままになってしまうので、ちゃんとプロセスを kill しておいてください。<br />
次にこのログから許可ルールを作成します。</p>
<pre><code>% sudo audit2allow -a -M mysqlcluster</code></pre>
<p>すると mysqlcluster.pp というファイルが生成されるのでこれをselinuxに取り込ませます。</p>
<pre><code>% sudo /usr/sbin/semodule -i mysqlcluster.pp</code></pre>
<p>ただ、これだとmysqlがネットワークにアクセスするのを全て許可してしまうので、宛先やポートを指定して許可したい場合には適切な te ファイルを作成して設定してください。<br />
ちなみに、srv2 でこの pp ファイルを作れば、srv3 ではログを吐かせるあたりは省略して pp ファイルをコピーして読みこませるだけでOKです。</p>
<p>ここまで来たらあとはデータノードとSQLノードを起動するだけです。<br />
まずデータノードを起動します。</p>
<pre><code>% sudo -u mysql /usr/sbin/ndbd</code></pre>
<p>この時点で srv1 の ndb_mgm から確認すると以下のようになっているでしょう。</p>
<pre><code>ndb_mgm&gt; show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=11   @192.168.10.2  (mysql-5.1.23 ndb-6.2.15, starting, Nodegroup: 0, Master)
id=12   @192.168.10.3  (mysql-5.1.23 ndb-6.2.15, starting, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1   @192.168.10.1  (mysql-5.1.23 ndb-6.2.15)

[mysqld(API)]   2 node(s)
id=21 (not connected, accepting connect from 192.168.10.2)
id=22 (not connected, accepting connect from 192.168.10.3)</code></pre>
<p>ここでndbdのどちらにもMasterの表示がない場合、外からndbdへのアクセスに失敗している可能性があります。srv1 の config.ini の [NDBD DEFAULT] セクションで SeverPort が 63132 に設定された上で、srv2 と srv3 でポートが空いているかどうか確認してください。</p>
<p>次にsrv2 とsrv3 でmysqlを起動します。</p>
<pre><code>% sudo /etc/init.d/mysql start</code></pre>
<p>そして srv1 で確認します。</p>
<pre><code>ndb_mgm&gt; show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=11   @192.168.10.2  (mysql-5.1.23 ndb-6.2.15, starting, Nodegroup: 0, Master)
id=12   @192.168.10.3  (mysql-5.1.23 ndb-6.2.15, starting, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1   @192.168.10.1  (mysql-5.1.23 ndb-6.2.15)

[mysqld(API)]   2 node(s)
id=21   @192.168.10.2  (mysql-5.1.23 ndb-6.2.15)
id=22   @192.168.10.3  (mysql-5.1.23 ndb-6.2.15)</code></pre>
<p>この画面がちゃんと表示されれば、インストールは成功です。</p>
<p>それでは srv2 と srv3 でデータが同期されることを確認しましょう。</p>
<p>まずは srv2 で。</p>
<pre><code>% mysql -u root -p
mysql&gt; create database cluster_test;
Query OK, 1 row affected (0.24 sec)</code></pre>
<p>そして srv3 で。</p>
<pre><code>% mysql -u root -p
mysql&gt; show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cluster_test       |
| mysql              |
| ndb_12_fs          |
+--------------------+
4 rows in set (0.00 sec)</code></pre>
<p>を！？</p>
<p>では srv3 で</p>
<pre><code>mysql&gt; use cluster_test
Database changed
mysql&gt; create table foo(bar int(10) primary key, name varchar(255))
    -&gt; engine=ndbcluster;
Query OK, 0 rows affected (0.82 sec)</code></pre>
<p>そして srv2 で</p>
<pre><code>mysql&gt; use cluster_test
Database changed
mysql&gt; show tables;
+------------------------+
| Tables_in_cluster_test |
+------------------------+
| foo                    |
+------------------------+
1 row in set (0.00 sec)</code></pre>
<p>をを！？</p>
<p>では srv2 で</p>
<pre><code>mysql&gt; insert into foo values(1, 'ggrecus');
Query OK, 1 row affected (0.01 sec)</code></pre>
<p>そして srv3 で</p>
<pre><code>mysql&gt; select * from foo;
+-----+---------+
| bar | name    |
+-----+---------+
|   1 | ggrecus |
+-----+---------+
mysql&gt; drop database cluster_test;
Query OK, 2 rows affected (0.82 sec)
1 row in set (0.02 sec)</code></pre>
<p>うむ。<br />
そして srv2 で</p>
<pre><code>mysql&gt; show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ndb_11_fs          |
+--------------------+
3 rows in set (0.00 sec)</code></pre>
<p>素敵ですね。</p>
<p>ちなみにテーブルを作るときに engine=ndbcluster を入れ忘れると同期されないので寂しいです。</p>
<p>さて、これでやっと MogileFS をインストールする準備ができました。</p>
<p>長かったですね。当初の目的を忘れるところでしたよ…</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ricollab.jp/webtech/2008/07/mysql_ndb_cluster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MogileFS を Ruby の mogilefs-client から触ってみた</title>
		<link>http://blogs.ricollab.jp/webtech/2008/06/mogilefs_with_ruby/</link>
		<comments>http://blogs.ricollab.jp/webtech/2008/06/mogilefs_with_ruby/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 01:29:00 +0000</pubDate>
		<dc:creator>StL</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[mogilefs]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blogs.ricollab.jp/webtech/2008/06/mogilefs_with_ruby/</guid>
		<description><![CDATA[日野原です。
今回はこの前に引き続いて MogileFS の話題です。
前回の最後に唐突に ruby から触ると言う話をした通り ruby のクライアントライブラリから MogileFS を操作してみましょう。
まず環境ですが、前回と同じ Fedora7 on coLinux です。
その上に、ruby と rubygems をインストールしておきます。
% sudo yum install ruby ruby-ri ruby-rdoc ruby-libs\
  ruby-irb ruby-devel rubygems
次に MogileFS のクライアントを gem でインストールします。
% sudo gem install mogilefs-client
ではこれで ruby のプログラムから触ってみましょう。
まずは下準備です。
% irb
irb(main):001:0&#62; require 'rubygems'
=&#62; true
irb(main):002:0&#62; require 'mogilefs'
=&#62; true
次に domain と class を作成します。（結果は見やすいように改行しています）
irb(main):003:0&#62; mogadm = MogileFS::Admin.new :hosts =&#62; ["127.0.0.1:7001"]
=&#62; #&#60;MogileFS::Admin:0xb7649c10
 [...]]]></description>
			<content:encoded><![CDATA[<p>日野原です。</p>
<p>今回は<a href="http://blogs.ricollab.jp/webtech/2008/06/mogilefs_on_fedora7/">この前</a>に引き続いて MogileFS の話題です。</p>
<p>前回の最後に唐突に ruby から触ると言う話をした通り ruby のクライアントライブラリから MogileFS を操作してみましょう。</p>
<p>まず環境ですが、前回と同じ Fedora7 on coLinux です。<br />
その上に、ruby と rubygems をインストールしておきます。</p>
<pre><code>% sudo yum install ruby ruby-ri ruby-rdoc ruby-libs\
  ruby-irb ruby-devel rubygems</code></pre>
<p>次に MogileFS のクライアントを gem でインストールします。</p>
<pre><code>% sudo gem install mogilefs-client</code></pre>
<p>ではこれで ruby のプログラムから触ってみましょう。<br />
まずは下準備です。</p>
<pre><code>% irb
irb(main):001:0&gt; require 'rubygems'
=&gt; true
irb(main):002:0&gt; require 'mogilefs'
=&gt; true</code></pre>
<p>次に domain と class を作成します。（結果は見やすいように改行しています）</p>
<pre><code>irb(main):003:0&gt; mogadm = MogileFS::Admin.new :hosts =&gt; ["127.0.0.1:7001"]
=&gt; #&lt;MogileFS::Admin:0xb7649c10
              @readonly=false,
              @backend=#&lt;MogileFS::Backend:0xb7649bc0
                                   @mutex=#&lt;Mutex:0xb7649b70&gt;,
                                   @lasterrstr=nil,
                                   @lasterr=nil,
                                   @hosts=["127.0.0.1:7001"],
                                   @socket=nil,
                                   @timeout=3,
                                   @dead={}&gt;,
              @hosts=["127.0.0.1:7001"],
              @timeout=nil&gt;
irb(main):004:0&gt; mogadm.create_domain "hoge"
=&gt; "hoge"
irb(main):005:0&gt; mogadm.create_class "hoge", "important", 3
=&gt; "important"
irb(main):006:0&gt; mogadm.create_class "hoge", "normal", 2
=&gt; "normal"</code></pre>
<p>これでファイルを保存する準備が整いました。<br />
ここで作った domain とは、保存するファイルのまとまりを表すもので、ファイルは必ず domain に属します。蓄積されているファイルを取得するときには、この domain と key の対を指定します。<br />
key とはファイルごとに一意に定める値です。domain をまたがって key を一意にする必要があるかどうかはまだ調べていないので、興味のある方は自分で調べてみてください。<br />
class はファイルの持つ属性で、class ごとにいくつのコピーを保持しておくかを指定することができます。ここでは、important というクラスを持つファイルは 3つのコピーを、normal クラスのファイルは 2つのコピーを保持しておくように指定しました。</p>
<p>では実際にファイルを保存してみましょう。<br />
irb を起動したカレントディレクトリに test.jpg という JPEG 画像と、「Hello, world!」と書かれている ttt というテキストファイルを置いておきます。（結果は見やすいように改行しています）</p>
<pre><code>irb(main):007:0&gt; mog = MogileFS::MogileFS.new :hosts =&gt; ["127.0.0.1:7001"], :domain =&gt; "hoge"
=&gt; #&lt;MogileFS::MogileFS:0xb76328a8
                @readonly=false,
                @root=nil,
                @backend=#&lt;MogileFS::Backend:0xb7632844
                              @mutex=#&lt;Mutex:0xb76327f4&gt;,
                              @lasterrstr=nil,
                              @lasterr=nil,
                              @hosts=["127.0.0.1:7001"],
                              @socket=nil,
                              @timeout=3,
                              @dead={}&gt;,
                @hosts=["127.0.0.1:7001"],
                @domain="hoge",
                @timeout=nil&gt;
irb(main):008:0&gt; mog.store_file "testimage001", "normal", File.new("test.jpg")
=&gt; 1441195
irb(main):009:0&gt; mog.store_file "testtext001", "important", File.new("ttt")
=&gt; 14
irb(main):010:0&gt; mog.store_file "testtext002", "important", "ttt"
=&gt; 14</code></pre>
<p>store_file の引数は一つ目から順に key, class, ファイルです。<br />
ファイルの指定は File オブジェクトでもファイル名でもいいらしいです。<br />
また、store_content を使えば</p>
<pre><code>irb(main):011:0&gt; mog.store_content "testtext003", "normal", "I'm hungry..."
=&gt; 13</code></pre>
<p>のように文字列を直接保存することもできます。</p>
<p>ちなみに、これらのファイルは /etc/mogilefs/mogstored.conf の中で指定した docroot 以下に保存されています。<br />
実際にちょっと見てみましょう。</p>
<pre><code>% ls -l /var/mogdata/dev1/0/000/000/
合計 1420
-rw-r--r-- 1 root root 1441195 2008-06-26 21:23 0000000002.fid
-rw-r--r-- 1 root root      14 2008-06-26 21:24 0000000003.fid
-rw-r--r-- 1 root root      14 2008-06-26 21:25 0000000004.fid
% ls -l /var/mogdata/dev2/0/000/000/
合計 1424
-rw-r--r-- 1 root root 1441195 2008-06-26 21:23 0000000002.fid
-rw-r--r-- 1 root root      14 2008-06-26 21:24 0000000003.fid
-rw-r--r-- 1 root root      14 2008-06-26 21:25 0000000004.fid
-rw-r--r-- 1 root root      13 2008-06-26 21:28 0000000005.fid
% ls -l /var/mogdata/dev3/0/000/000/
合計 12
-rw-r--r-- 1 root root 14 2008-06-26 21:24 0000000003.fid
-rw-r--r-- 1 root root 14 2008-06-26 21:25 0000000004.fid
-rw-r--r-- 1 root root 13 2008-06-26 21:28 0000000005.fid
% file /var/mogdata/dev1/0/000/000/0000000002.fid
0000000002.fid: JPEG image data, EXIF standard
% cat /var/mogdata/dev1/0/000/000/0000000003.fid
Hello, world!
% cat /var/mogdata/dev3/0/000/000/0000000005.fid
I'm hungry...</code></pre>
<p>ファイルサイズで判断すると、ちゃんとimportant で指定したファイルが 3つずつ、normal で指定したファイルが 2つずつ生成されていますね。<br />
このファイル名は環境によっては異なってくるかもしれないので、バイナリファイルを cat してしまわないように気をつけてください。</p>
<p>ファイルを読み込むときは get_file_data に key を指定します。</p>
<pre><code>irb(main):012:0&gt; mog.get_file_data "testtext003"
=&gt; "I'm hungry..."
irb(main):013:0&gt; mog.get_file_data "testtext002"
=&gt; "Hello, world!\n"</code></pre>
<p>また、MogileFS::Admin を使ってデバイスや保存されているファイルの情報を取得することもできます。（結果は見やすいように改行しています）</p>
<pre><code>irb(main):037:0&gt; mogadm.get_stats
=&gt; {"fids"=&gt;{"max"=&gt;5, "count"=&gt;0},
    "device"=&gt;[{"status"=&gt;"alive", "files"=&gt;"3",
                "id"=&gt;"1", "host"=&gt;"localhost"},
               {"status"=&gt;"alive", "files"=&gt;"4",
                "id"=&gt;"2", "host"=&gt;"localhost"},
               {"status"=&gt;"alive", "files"=&gt;"3",
                "id"=&gt;"3", "host"=&gt;"localhost"}],
    "replication"=&gt;[{"files"=&gt;"2", "class"=&gt;"important",
                     "devcount"=&gt;"3", "domain"=&gt;"hoge"},
                    {"files"=&gt;"2", "class"=&gt;"normal",
                     "domain"=&gt;"hoge", "devcount"=&gt;"2"}],
    "file"=&gt;[{"files"=&gt;"2", "class"=&gt;"important", "domain"=&gt;"hoge"},
             {"files"=&gt;"2", "class"=&gt;"normal", "domain"=&gt;"hoge"}]}</code></pre>
<p>さて、これで最低限の読み書きはできました。<br />
これだけできればきっと誰かが rails のファイルアップロードプラグイン（<a href="http://clarkware.com/cgi/blosxom/2007/02/24">attachment_fu</a>とか？）のバックエンドに MogileFS が使えるようにしてくれることでしょう。<br />
楽しみですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ricollab.jp/webtech/2008/06/mogilefs_with_ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MogileFS を Feodra7 on coLinux に yum で入れてみた</title>
		<link>http://blogs.ricollab.jp/webtech/2008/06/mogilefs_on_fedora7/</link>
		<comments>http://blogs.ricollab.jp/webtech/2008/06/mogilefs_on_fedora7/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 04:03:35 +0000</pubDate>
		<dc:creator>StL</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[colinux]]></category>
		<category><![CDATA[mogilefs]]></category>

		<guid isPermaLink="false">http://blogs.ricollab.jp/webtech/2008/06/mogilefs_on_fedora7/</guid>
		<description><![CDATA[日野原です。
今、分散ファイルシステムが熱いです。負荷分散とか冗長化とかを考えていると、当然ファイルシステムも分散させたくなるのです。…なりますよね?
というわけで手元の Fedora7 on coLinux に分散ファイルシステムの一つの実装である MogileFS を入れてみました。
ただ、CPAN を使える人向けの情報はこのページ（Six Apart &#8211; Tech Talk Blog: MogileFS のインストールと初期設定）にすでにあるので、今回は perl をちゃんと使ったことがなくてもできるやり方でインストールしてみました。正確に言うと私が CPAN を使って入れようとしてできなかったので回避しただけなんですけど…
というわけでインストールの手順は独自ですが、その後の初期設定などは前述のページで説明されているやり方とほとんど同じです。
前提となる環境は Fedora7 (coLinux) で yum と vi と svn、make が使える状態です。
まず、必要とされているパッケージをインストールします。先ほども言ったように CPAN は使わずに yum でインストールします。とある CPAN Author に言わせると「yum で perl のモジュールを入れる感覚が受け付けない」そうですが、私は perl はまともに使ったことがないので違和感なしです。まぁ、私も yum で ActiveRecord とかをインストールされるとしょんぼりするので同じようなものなのでしょう。
% sudo yum install perl-Net-Netmask perl-Danga-Socket perl-IO-AIO \
Perlbal mysql-server
次に MogileFS も yum [...]]]></description>
			<content:encoded><![CDATA[<p>日野原です。</p>
<p>今、分散ファイルシステムが熱いです。負荷分散とか冗長化とかを考えていると、当然ファイルシステムも分散させたくなるのです。…なりますよね?</p>
<p>というわけで手元の Fedora7 on <a href="http://colinux.org/">coLinux</a> に分散ファイルシステムの一つの実装である <a href="http://www.danga.com/mogilefs/">MogileFS</a> を入れてみました。</p>
<p>ただ、CPAN を使える人向けの情報は<a href="http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs_install.html">このページ（Six Apart &#8211; Tech Talk Blog: MogileFS のインストールと初期設定）</a>にすでにあるので、今回は perl をちゃんと使ったことがなくてもできるやり方でインストールしてみました。正確に言うと私が CPAN を使って入れようとしてできなかったので回避しただけなんですけど…</p>
<p>というわけでインストールの手順は独自ですが、その後の初期設定などは<a href="http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs_install.html">前述のページ</a>で説明されているやり方とほとんど同じです。</p>
<p>前提となる環境は Fedora7 (coLinux) で yum と vi と svn、make が使える状態です。</p>
<p>まず、必要とされているパッケージをインストールします。先ほども言ったように CPAN は使わずに yum でインストールします。とある CPAN Author に言わせると「yum で perl のモジュールを入れる感覚が受け付けない」そうですが、私は perl はまともに使ったことがないので違和感なしです。まぁ、私も yum で ActiveRecord とかをインストールされるとしょんぼりするので同じようなものなのでしょう。</p>
<pre><code>% sudo yum install perl-Net-Netmask perl-Danga-Socket perl-IO-AIO \
Perlbal mysql-server</code></pre>
<p>次に MogileFS も yum で提供されているので入れてしまいます。<br />
そういえば、上で入れた yum は MogileFS を入れるときに依存関係で勝手に入ったかもしれないですね…</p>
<pre><code>% sudo yum install perl-MogileFS-Client perl-MogileFS-Utils</code></pre>
<p>で、これだけだと<a href="http://code.sixapart.com/svn/mogilefs/trunk">MogileFSのリポジトリ</a>のサブディレクトリの api と utilities に相当する部分しか入らないので、server の部分は自分でコンパイルします。</p>
<pre><code>% svn co http://code.sixapart.com/svn/mogilefs/trunk mogilefs
% cd mogilefs/server
% perl Makefile.PL</code></pre>
<p>ここで ExtUtils/MakeMaker.pm がないと言われるので入れます。</p>
<pre><code>% sudo yum install perl-ExtUtils-MakeMaker
% perl Makefile.PL
Checking if your kit is complete...
Looks good
Warning: prerequisite Gearman::Client 1.07 not found.
Warning: prerequisite Gearman::Client::Async 0.93 not found.
Warning: prerequisite Gearman::Server 1.08 not found.
Writing Makefile for mogilefs-server</code></pre>
<p>問題ないらしいですが、せっかくなのであった方がいいと言われている（らしい） <a href="http://www.danga.com/gearman/">Gearman</a> も入れてしまいましょう。</p>
<pre><code>% sudo yum install perl-Gearman perl-Gearman-Client-Async \
perl-Gearman-Server
% perl Makefile.PL
Writing Makefile for mogilefs-server</code></pre>
<p>問題なさそうです。これでインストールしてしまいます。</p>
<pre><code>% make
% sudo make install</code></pre>
<p>これでインストールは完了です。ここから初期設定に入ります。</p>
<p>まずは mysql の起動とパスワードの設定</p>
<pre><code>% sudo /etc/init.d/mysqld start
% mysqladmin -u root password 'rootpass'</code></pre>
<p>次に MogileFS の DB スキーマを作成します。</p>
<pre><code>% mogdbsetup --dbrootpass=rootpass --dbpass=mogpass</code></pre>
<p>いろいろ聞かれても yes でいいです。面倒なら &#8211;yes オプションをつけるといいらしい。</p>
<p>ここ以降は<a href="http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs_install.html">前述のページ</a>の説明とほとんど一緒ですが、一応書いておきます。</p>
<p>ここからは tracker の設定です。<br />
まずは mogilefsd 用のユーザを作ります。</p>
<pre><code>% sudo /usr/sbin/useradd -s /sbin/nologin mogile</code></pre>
<p>次に設定ファイルを。</p>
<pre><code>% sudo mkdir /etc/mogilefs
% sudo cp conf/mogilefsd.conf /etc/mogilefs
% sudo vim /etc/mogilefs/mogilefsd.conf</code></pre>
<p>変更点は daemonize の行のコメント解除と db_user、db_pass の設定です。</p>
<pre><code><strong>daemonize = 1</strong>
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = <strong>mogile</strong>
db_pass = <strong>mogpass</strong>
listen = 127.0.0.1:7001
conf_port = 7001
listener_jobs = 10
delete_jobs = 1
replicate_jobs = 5
mog_root = /mnt/mogilefs
reaper_jobs = 1</code></pre>
<p>で、mogilefsd を起動します。</p>
<pre><code>% sudo -u mogile mogilefsd</code></pre>
<p>次は mogstored です。</p>
<p>リポジトリに入っていた mogstored の config ファイルは古い形式らしくて使えないので、新しく作成します。内容は3行だけです。</p>
<pre><code>% cat /etc/mogilefs/mogstored.conf
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /var/mogdata</code></pre>
<p>で、docroot に指定したディレクトリを作成し、起動します。</p>
<pre><code>% sudo mkdir /var/mogdata
% sudo mogstored -d</code></pre>
<p>後は件のサイトの説明に従い使えるようにしていきます。</p>
<pre><code>% mogadm host add localhost --port=7500
% sudo mkdir /var/mogdata/dev1
% sudo mkdir /var/mogdata/dev2
% sudo mkdir /var/mogdata/dev3
% mogadm device add localhost 1
% mogadm device add localhost 2
% mogadm device add localhost 3
% mogadm host mark localhost alive
% mogadm check
Checking trackers...
127.0.0.1:7001 ... OK

Checking hosts...
[ 1] localhost ... OK

Checking devices...
host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev1             3.777      1.257      2.520  33.28%  writeable   0.0
[ 1] dev2             3.777      1.257      2.520  33.28%  writeable   0.0
[ 1] dev3             3.777      1.257      2.520  33.28%  writeable   0.0
---- ------------ ---------- ---------- ---------- ------
total:    11.331      3.771      7.559  33.28%</code></pre>
<p>ここまでで、とうとう ruby の mogilefs-client からさわれるようになりました。</p>
<p>しかし長くなってしまったので、ruby からさわるのは次回にします。<br />
お楽しみに。</p>
<p>補足として、別の環境でやってはまったときの解決策も書いておきます。</p>
<p>mogstored を実行したときに</p>
<blockquote><p>Weak references are not implemented in the version of perl &#8230;</p></blockquote>
<p>というエラーが出てしまった場合、Scalar::Util を入れ直すと直ります。perl 使いの間では有名なエラーだそうです。</p>
<p>あと、MySQL を独自にビルドしていて socket の位置が異なる場合、<br />
/usr/lib/perl5/site_perl/5.8.8/MogileFS/Store/MySQL.pm<br />
の15行目（私の環境のパスです）を</p>
<pre><code>return "DBI:mysql:$dbname;host=$host;mysql_socket=/tmp/mysql.sock"
               . ($port ? ";port=$port" : "");</code></pre>
<p>と書き換えれば（/tmp/mysql.sockの部分はsocketの位置にしてください）とりあえず動きます。けど本当にとりあえずなのでオススメしません。自分しか困らない開発環境でだけやってください。</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ricollab.jp/webtech/2008/06/mogilefs_on_fedora7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
