最近のマザーボードでは、標準のSATAでRAIDが組めるようになっているものが多く、このページを運用しているサーバもIntel G965チップセットのMatrix RAIDでRAID1を組んで動かしています。OS/データを入れてもお釣りがくる320GのSATA HDDが1万円を切っているご時勢ですし、マザーボードの価格自体もRAID機能の有無では変わらないので、保険としては安いもんです。
さておき、最近メインで開発に使っているPen4マシンの動きがちょっと怪しいので、こちらもRAID構成マシンへのリプレースを画策。
◆ ASUSTek P5Kで痛い目を見る
サーバには、前述の通りコンサバにIntelのマザーボードを使ったので、今回は冒険してASUSTekのP5Kというマザーボードを買ってみたのですが、これが大失敗。
まず、RAIDを使う場合、写真の右上にある通常の内蔵用SATAコネクタは利用不可で、必ず緑線で囲んだ2個のコネクタを使わなければならない。見ての通り、1個は外部コネクタでもう1個もなぜかPCIスロットの間のバックパネル側に配置されています。ホットスワップ(ホットプラグにあらず)には対応していない、eSATAは通常本体と連動しない別電源になる、という不利があるのに、あえて外付けを強要するなんてなにを考えてるのかさっぱり分かりません。内部コネクタの配置からして、2本とも外付けのような使い方を意識しているのは見て取れるのですが、だったらなぜ両方ともeSATAにしないと小一時間(略)。
さらに内蔵側のコネクタもなぜこんな狭いところにわざわざといった変な位置にあり、PCIカードによってはL型、ストレートいずれのコネクタでも干渉して使えない。ビデオ非内蔵のマザーでこれは無いでしょう。
そうした不満を抱えつつ、eSATA-SATA変換ケーブルを買ってきて外部コネクタからケーブルをケース内に引き戻して接続。やっとこさスタートラインについたと思ったら更なる試練が…。
◆ JMicron BIOSにとどめを刺される
起動してBIOSからRAIDを作成、インストールまでは順調でしたが、再起動するといきなりエラー発生でDEGRATE状態に。しかもどっちのコネクタがどっちのHDDなのか分からない。試行錯誤でつきとめ、エラーが発生したディスクを内蔵SATAに繋いで確認すると特に異常なし。もう一度RAID用ポートに繋ぎなおしてBIOSに入ると、"Mirror Conflict"とおっしゃる。どうやらどちらのHDDが正常な方なのか、人間の方で覚えておいて、こっちをマスターとして使ってねと指示する必要があるようです。なんじゃそりゃ。
で、コンフリクトを解消してやっていざリビルドをかけようとすると今度はリビルドエラー。障害が出ているのは内蔵コネクタ側で、ケーブルはSATAポートを使って正常に動くことは確認済み。
一縷の望みをかけて、RAIDをいったん消去して作り直すと正常に戻ったように見える。もう一度OSをインストールしなおして再起動するとまた同じエラー。あとは内蔵側のコネクタぐらいしか考えられないんですが、ここまでですっかり嫌気がさしていた上、異常の発生したディスクの差し替えを認識できずに"Mirror Conflict"は無いっしょということで、このボードは黒歴史決定。ヤフオクで売る気にもなりません。いちおう生き残り策としてSATA(3G)RAIDカードを物色してみたのですが、玄人志向の製品がやたらと安い以外にはIntelのマザーボードを買うのとたいして変わらないか、逆に高くつく状況だったので、結局コンサバな構成に戻ることに。
結局、P5Kよりも安いIntelのBOXDG965WHMKRというマザーを買いなおして組み立て直し。ここでふと思い立ちFreeBSDをインストールしてMatrix RAIDで遊んでおくことに。
◆ FreeBSDからのRAID構築
まず、SATAとして一方のHDDにFreeBSDをインストールして、コマンドラインからRAIDを構築。
# dmesg | grep '^ad'
ad8: 476940MBat ata4-master SATA300
ad10: 476940MBat ata5-master SATA300
という構成で、ad8にOSがインストールしてある状態でこのディスクをRAID化できるかどうか実験。
# atacontrol create raid1 ad8 ad10
ar0 created
dmesgを確認
# dmesg | grep '^ar'
ar0: 476940MBstatus: READY
ar0: disk0 READY (master) using ad8 at ata4-master
ar0: disk1 READY (mirror) using ad10 at ata5-master
statusを確認
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad8 ad10 status: READY
READYはおかしいとは気づかずにリビルドをかける。
# atacontrol rebuild ar0
atacontrol: ioctl(IOCATARAIDREBUILD): Device not configured
ありゃ??再起動してBIOSで状態を確認しても変わらず。リビルドはかかっていないので、見事に危険なシステムが一丁上がり。というわけで、この方法は駄目っぽい。
もしかすると、detach→attach→addspare→rebuild→/etc/fstab編集でいけるのかもしれないけど、BIOSでRAID構築してからインストールすれば済む話なので、これ以上深追いはしないことに。
結論としては、atacontrolを使ったRAIDの構築は、HDDを増設して新しいRAIDパーティションを作る時に使うものだということで納得することに。
◆ リカバリ実験
今度はBIOSでRAIDを構築しておいて、ar0にOSインストール。HDD障害をわざと発生させてリビルドの練習。
まずad10側のケーブルを抜いてdmesg確認
ar0: WARNING - mirror protection lost. RAID1 array in DEGRADED mode
subdisk10: detached
ad10: detached
ar0の状態確認
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad8 DOWN status: DEGRADED
ad10のケーブルを挿しなおす。
ad10: 476940MBat ata5-master SATA300
挿しなおしたディスクをスペアとしてRAIDに登録
# atacontrol addspare ar0 ad10
dmesg確認
ad10: inserted into ar0 disk1 as spare
リビルド。状態確認。
# atacontrol rebuild ar0
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad8 ad10 status: REBUILDING 1% completed
ということで、いちおう稼動させたままリビルドは可能だということが分かったので、とりあえず満足して実験終了。
あ、リプレース作業がまったく進んでない。
久々のソースからのコンパイルでちょっと手間取ったのでメモ。
README.jに書いてある通りにconfigure & make すると、次のようなエラーが出てコンパイルに失敗する。
gcc -O2 -DHAVE_CONFIG_H -DAICONFIG=\"/usr/local/naregi-ca/lib/aica.cnf\" -DPREFIX=\"/usr/local/naregi-ca\" -DLOCKDIR=\"/usr/local/naregi-ca/lock\" -I../ -I../include -I../aicrypto/include -c aireg_op.c
aireg_op.c: In function `aiop_regidone':
aireg_op.c:389: warning: assignment makes pointer from integer without a cast
aireg_op.c:393: error: `LDAP_SUCCESS' undeclared (first use in this function)
aireg_op.c:393: error: (Each undeclared identifier is reported only once
aireg_op.c:393: error: for each function it appears in.)
aireg_op.c: In function `aiop_upd_userentry':
aireg_op.c:628: error: `LDAPMessage' undeclared (first use in this function)
aireg_op.c:628: error: `res' undeclared (first use in this function)
aireg_op.c:628: error: `ent' undeclared (first use in this function)
aireg_op.c:630: error: `LDAP_SCOPE_BASE' undeclared (first use in this function)
aireg_op.c:639: warning: assignment makes pointer from integer without a cast
aireg_op.c:641: error: `LDAP_SUCCESS' undeclared (first use in this function)
aireg_op.c:658: error: `LDAP_MOD_REPLACE' undeclared (first use in this function)
aireg_op.c:659: error: `LDAP_MOD_ADD' undeclared (first use in this function)
*** Error code 1
LDAP_SUCCESSの定義を探す。
% grep LDAP_SUCCESS /usr/local/include/*.h
/usr/local/include/ldap.h:#define LDAP_SUCCESS 0x00
ldap.hをincludeしていない?
configure時に生成されるaiconfig.hをチェック。
% grep LDAP aiconfig.h
/* #undef HAVE_LDAP_H */
/* #undef HAVE_LDAP_LIB */
ありゃ。もう一回configureして結果をチェック。
% sh configure
loading cache ./config.cache
:
checking for ldap_unbind in -lldap... (cached) no
:
checking for ldap.h... (cached) no
:
/usr/local/libや/usr/local/includeを見ていないっぽい。
% gcc -print-search-dirs
install: /usr/libexec/(null)
programs: =/usr/bin/:/usr/libexec/
libraries: =/usr/lib/
configureのキャッシュを消して--with-cflagsを試す。
% rm config.cache
% sh configure --with-cflags="-I/usr/local/include -L/usr/local/lib"
creating cache ./config.cache
:
checking for ldap_unbind in -lldap... no
:
checking for ldap.h... no
:
だめなので、マニュアルを読んで環境変数でパス指定。
% setenv CPATH /usr/include:/usr/local/include
% setenv LIBRARY_PATH /lib:/usr/lib:/usr/lib/compat:/usr/local/lib
% rm config.cache
% sh configure
creating cache ./config.cache
:
checking for ldap_unbind in -lldap... yes
:
checking for ldap.h... yes
configureが成功したようなので、make clean & make
% make clean
:
% make
:
これでコンパイルも最後まで進み、ちょっと試した限りでは問題なく使えている模様。
ちなみに、README.jには「FreeBSD4.3で動作確認済み」とあるが、手元の4.11マシンでは同じエラーでコンパイルできなかった。謎。
出席してきました。テクノロジーカンファレンスではなく技術発表会と言った方がピッタリとはまってたんじゃないかと思いましたが、非常に満足のいく内容でした。
「企業買収」を「内製化」と変換し、「楽天のアプリはほぼ全て内製です」と言っていたあたり、『うまい』なーと思いましたが、それはむしろ瑣末で、技術としてそれらのアプリを抱え込んでいるという事実と、なによりそうしたアプリを支えているインフラを構築してきた技術は本物で、感心するばかりでした。また、特に今回はインフラ周りの発表が多かったわけですが、そうした技術を惜しげもなく公開できたのは、楽天がインフラ業ではなくサービス業であることと、まつもとさんの影響もしくはまつもとさんをフェローとして迎えたことに現れているようなオープンへの理解がうまい具合に働いた結果なのかなと思いました。
別の視点としては、ITサービスの世界は、Google、楽天、(あともう数社欲しい。ドワンゴ? USEN?)といった巨大なコングロマリットがインフラを整備し、筋の良いベンチャーはそうしたコングロマリットに買収されるというのが、業界の構造として出来上がりつつあるのかな、という感想を持ちました。Google1社でそういう構造に向かう気配が漂っていることにはちょっと危機感を抱いていたのですが、Rakutenにはその対抗馬としてがんばって欲しいところです。日本の業界がすでにライブドア・ショックを経験しているというのも、ある意味重要かも。
◆ パネルディスカッション
最後のパネルディスカッションも面白い話が多かったので、メモ。
Adobe ギャレット社長の「デザイン」と「開発」の融合という話。振り返ってみると単なるAIRの宣伝とも言えるが、「これからの10年、これからのテクノロジー〜エンジニアに求められるもの」というお題目とのすりあわせが見事で、今後生き残るためにもAIR買わなきゃ!と思わせるほどの説得力。こういうお題目と自分の利益を融和させて説得力を生むプレゼンを作り上げるというやり方は見習わないと。
生産性が十分に上がった後に来る開発者の仕事の質の変化に対する対応。インプリメンターとして勝負していたのではオフショアに負けてしまうので、創造(想像)力を発揮する分野で勝負。「おもてなし」とか「こんなこともあろうかと」が重要。
エンジニアのやりがい。開発プロジェクトを自分のものと意識させる。生産性を上げ、プロジェクトを少人数化させることによる貢献度の自覚化:「このビルは父さんが造ったんだぞ」でもいいような気もするが、違いはなんだろう?エンジニアと顧客の接点を増やし、顧客から直接的に感謝を受けさせる:人見知りをするエンジニアには返って苦行となるが、そこをどうするか。
編成(?)権を利用者に渡す。参加意識による満足度上昇。