トップページ > 技術
技術 Archive
CloudFrontは安いのか?
- 2008-11-21 (金)
- 技術
花金ということで、浮かれ連続更新モードです。
といっても花金なので今日はこれで終わりだと思いますが。
CloudFront来ましたねぇ。
但し、S3比でメリットは速度だけっぽいですね。
まぁ、それだけでも十分といえば十分なのですが、S3と同じくあの転送量だけでなくGET数にも課金される仕組みが、どうも気に入らないです。
例えば日本なら1GBあたり0.22ドルで、それプラス10,000GETで0.013ドルになるわけです。
この数字だけ見ればGET数に掛かる金額は誤差みたいなものに思えるのですが、実際に計算すると事情が変わってきます。
例えば、サムネイルサービスなどで、平均5KBのファイル(縦横100pxのjpgファイルなど)を合計1TB送信した場合、単純に計算してGET数は
1TB ÷ 5KB で200,000,000GET(2億GET)になるわけです。
転送量に対する金額は、1T(1000GB) x 0.22ドル = 220ドル となりますが、
一方のGET数に対する金額は、2億GET x 0.013ドル/1万GET = 260ドル と、転送量に対する金額を上回ってしまいます。
逆転現象が起きるようにわざわざ平均5KBという異常な数値をもちだしたのではないか?と思われる方もいらっしゃるかもしれませんが、動画配信などの大容量コンテンツを配信するサイト以外では、平均5KBというのは普通なのです。
今までの自分の実績と照らし合わせると、むしろ5KBでもまだ多いくらいです。
画像中心のサイトでなければ1ファイル平均1KB未満なんてザラですからね。そうなると例で計算した金額のさらに5倍になるということです。
まぁ、そうは言っても、他社と比べたら格安ですし、従量制なので金銭的なリスクもかなり少ないでしょう。
(CDNを月10万円で契約したけど閑古鳥だったとか泣けます。実際どんな契約形態かは知りませんが。)
でも速度を重視せずある程度の転送量があるなら、CloudFrontもS3も使わず転送量無制限の専用サーバーかVPS(EC2含む)で配信したほうが1万GETでいくらとか変な料金が掛からない分、安くなるでしょう。ただ転送量無制限といっても、何らかの形で制限してくるところが多いので要確認ですが。
逆に言えば、大容量のコンテンツを配信するにはもってこいですね。
今のところそんな予定がないのが残念ですが。
iPhoneで縦書き表示
- 2008-11-09 (日)
- 技術
昨日の夜中からiPhone OS Libraryと格闘しておりまして、もちろんちゃんと睡眠はとっていますが、約5時間ほどでNSStringをUIViewに縦書きすることに成功しました!
NDAのせいで詳しく書けないのがアレですが、要はUIViewを継承しdrawRectメソッドをオーバライドし、その中でグラフィックコンテキストに対し、NSStringに実装されているUIStringDrawingプロトコルのdrawAtPointメソッドを使うという方法です。
この方法自体は独創的な方法でも何でもなくて、たぶん普通な方法だと思うのですが、NDAのせいか、いかんせんネット上に情報が少なすぎるのでほかにどういう方法があるのかは今のところ分かりません。
縦書きのアルゴリズム自体はiPhone OS Libraryとは直接関係なく、単に文字のサイズを考慮しながら縦に1文字ずつ描画していってるだけです。
もちろん今回のテストは技術的興味だけではなく目的があってのことです。
AppStoreで配信されたらNDAも緩和されるらしいので、もしそのときが来ればもっと詳しく書こうかなと思います。
出来れば今年中にできたらいいなぁ。
awstatsをCGI起動で更新
- 2008-11-06 (木)
- 技術
awstatsとかはあまり個人的には好きではありません。
webサーバーの生ログが膨大になると、awstatsを動かすためだけに別の特別な仕組みを考えなきゃ実用にならないくらい時間/負荷が掛かるからです。
awstatsだけではなく、他の「基本的にwebサーバーと同じマシンで生ログを解析するプログラム」も同じです。
正直Google Analyticsだけで良いんじゃないのと思ってるぐらいです。
あくまで自分の用途に限定した話ですから、みんなAnalyticsを使ったほうが良いなんていう主張はしませんが。
仕事でたまにawstatsを組み込んで欲しいという依頼があります。
基本的にはCronで自動的に一日一回更新するようにする事が多いのですが、
レンタルサーバーに設置する場合だと、Cronが使えない場合も多く
ブラウザから手動で更新をせざるを得なかったり、
さらに生ログが最近1週間分しか保持されなかったりすると、
手動での更新を1週間以上忘れると、ログが途切れてしまったりとかいう問題が起きてしまいます。
ということで、その問題を解決するために
自分が管理しているサーバーからCronでターゲットのレンタルサーバーにwgetを行い、
ブラウザからの更新処理の真似事をしようという考えが当然浮かぶわけです。
awstatsの設定ファイルのAllowToUpdateStatsFromBrowserが1にセットされていれば、
解析結果のページのURLパラメータにupdate=1を追加してwgetするだけでうまく行きます。
しかし、レンタルサーバーだと負荷の観点からユーザーに好き勝手更新させないために
AllowToUpdateStatsFromBrowserを0にしている場合も多いと思いますが、
その場合はwgetするだけではもちろん更新されません。
まぁ、awstats.plのソースをいじって更新用のパラメータをupdateからユーザーが推測しづらい文字列に変更してAllowToUpdateStatsFromBrowserを1にしておくという手も比較的ハードルは低い方法だとは思いますが、
ソースがソースなだけに弄りたくはないところです。(なぜ?と思った方は実際にソースを読んでみたら分かると思います。)
じゃあCGI経由でシェルスクリプト呼び出せばいいんじゃない?という考えが浮かびますが、
/usr/local/bin/perl ./awstats.pl -config=example.com -update=1
などと書いたスクリプトをCGIから実行しても更新されません。
awstats.plはGATEWAY_INTERFACE環境変数の有無でWebサーバーから実行されたのかシェルから実行されたのか判別するようになっています。
CGIから実行したシェルスクリプトへは呼び出しが何段階になっても環境変数がそのまま引き継がれてしまう(というか同じ環境で動作すると言ったほうが正確か)ため、
ブラウザから更新を行ったとみなされ、AllowToUpdateStatsFromBrowserが0の場合は更新されません。
じゃあどうすりゃいいのか?って事ですが、そこは簡単に
awstats更新用のシェルスクリプトでawstats.plを実行する前に
GATEWAY_INTERFACE=
export GATEWAY_INTERFACE
の2行を追加して、GATEWAY_INTERFACE環境変数をクリアしてしまえば良いわけです。(shの場合)
要はAllowToUpdateStatsFromBrowserが0のawstatsをwget等で更新する場合は、GATEWAY_INTERFACE環境変数をクリアしてからawstats.plを呼び出せば良いということです。
但し、レンタルサーバーだとCGI経由でのシェルスクリプトの実行も禁止されてる場合も多々あり、
そういう場合は、もうどうしようもないと思います。
そういう点でも、HTMLソースさえ自由に編集できさえすれば組み込めるAnalyticsが個人的には好きなわけです。
もちろん、Analyticsはリアルタイムに更新される訳ではないので、自分で管理してるサーバーでほぼリアルタイムにログを解析したい場合は生ログ解析系のプログラムを使うのも悪くはないですが。
Postfix + qmail + vpopmail + Dovecotでメールのバーチャルドメインで問題が
- 2008-10-10 (金)
- 技術
このタイトルでピンと来た方もおられると思いますが、
バーチャルドメイン設定(Postfix&Dovecot+qmail&vpopmail) - CentOSで自宅サーバー構築を参考にしながらバーチャルドメインの設定を行っていました。
(このサイトには非常に助けられています。感謝してもしきれないくらい。)
ほぼ丸々コピペで設定を進めて、といってもSELinuxを有効にした状態での運用を目指していたので、その辺の設定は追加で独自に行ったりしましたが、
まぁ、何とかバーチャルドメインの設定も完了しました。
で複数ドメインを実際に使って送受信のテストを行って、大丈夫かなと思ったところで
info@example.comといったメールアドレスを作成した場合に、
そのアドレスで受信できず、何故かLinuxのrootユーザー宛にメールが届くといった不可解な現象が発生することが判明。
現象を詳しく書くと、独自に作成したinfo@example.comへ外部からでも内部からでもいいのでメールを送信すると、
info@example.comの本来のMaildir(/home/vpopmail/domains/example.com/info/Maildir)へ、
メールが全く配信されず、rootユーザー宛にメールが配信されます。
うまく行く場合とうまく行かない場合の/var/log/maillogの違いを抽出すると以下の2行となりました。
うまく行く場合
postfix/pipe[1984]: 8F8787E01A1: to=<aiueo@example.com>, relay=vdelivermail, delay=0.18, delays=0.07/0/0/0.11, dsn=2.0.0, status=sent (delivered via vdelivermail service)
qmail: 1223454553.853712 starting delivery 59: msg 8257958 to local example.com-aiueo@example.com
うまく行かない場合
postfix/pipe[4467]: B11897E019C: to=<root@okechan.net>, orig_to=<info@example.com>, relay=vdelivermail, delay=0.19, delays=0.07/0/0/0.12, dsn=2.0.0, status=sent (delivered via vdelivermail service)
qmail: 1223619090.991671 starting delivery 3: msg 8257945 to remote root@okechan.net
※root@okechan.netは/etc/aliasesに設定したroot宛のメールの送信先。
ここでは例として書いているだけで、実際はroot@okechan.netというアドレスは存在しません。
うまく行かない場合は、何故か送信先がroot宛に書き換えられ、
さらにvpopmailで仕分けをするために、example.com-aiueo@example.comという形式でローカルに送信されなければならないところが、
root@okechan.net宛に外部に送信されてしまっています。
でまぁ、4種類ものソフトを連携させてるので色々と原因を調べるのに苦労したのですが、
(苦労の過程も書いておきたいのですが、面倒なので端折ります)
原因はpostfixの設定でした。
/etc/postfix/main.cfでは、以下の2つの項目が標準で以下のようになっていますが、
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
このままだと、受信してローカルに配送する際に、どうやら
「メールアドレスの@以前をユーザー名とみなして、そのユーザー名で/etc/aliasesを検索し、
該当があれば/etc/aliasesの記述にしたがって配送先を変更する。」
という処理が行われるっぽいです。
今回の環境ではどのアカウント向けのメールも最終的にはrootに行き、root宛のメールはroot@okechan.netという外部のアドレスに送るように
/etc/aliasesに指定していたために上記のような問題が発生していたようです。
それぞれ、以下のように空にし、
alias_maps =
alias_database =
postfixをrestartすることで、Linuxのユーザーアカウントと同じ名前のバーチャルドメインのメールも正しく受け取ることができるようになりました。
いやぁ、バーチャルドメインの設定と今回の問題の解決に丸2日掛かってしまいましたorz
Amazon EBSは複数インスタンスから同時マウント出来ません。(少なくとも今現在は)
- 2008-09-29 (月)
- 技術
http://developer.amazonwebservices.com/connect/thread.jspa?messageID=100605
誰だ~?同時マウントできるとか書いてた奴は~
実際にやってみたけど、やっぱり同時マウント出来ませんでした。
2つのインスタンスの間にEBSを配置したネットワーク図やらソフトウェア構成図をがんばって描いた時間が無駄になったじゃないかorz
先に裏を取らなかった自分が悪いんですけどね。
それにEBSを使ってみたら分かりますが、仮想的であれどHDDそのもののように振舞うから、
普通の1台のHDDが複数マシンにPATAやらSATAやらで繋いで同時に書き込めないことを考えると
最初から同時マウントの話は眉唾モノではあったのです。
しかしあのAmazonなら、という想いで信じ込んでしまいいました。
冒頭で挙げたリンク先の中にも書いてありますが、
複数インスタンスでファイル共有するなら、普通にNFS使えってことですね。
しかし、役割が非対称になるのは何か嫌ですねぇ。
EBSでWebサーバーの静的ファイルを共有する代わりに
S3で静的ファイルを配信するという手もあるのですが、S3は意外と高く付くつきます。
転送量に対するコストはEC2もS3も変わらず1GBあたり$0.170(10TBまで)なのですが、
S3はそれプラス、1万GETにつき$0.01掛かってしまいます。
EC2が一ヶ月立ち上げっぱなしで約$72なので、
1ヶ月で7,200万GET以上ある場合はS3の方が割高になってしまいます。
画像やCSSなどで1PVで20GET発生するようなサイトの場合、
単純計算で1ヶ月360万PV、1日12万PV以上あるようなサイトだと、
S3を使うよりはEC2のインスタンスを増やしたほうが安くあがるでしょう。
まぁ、S3の方がネットワーク帯域が太い気がしますし、
EC2の台数を増やすのはちょっと面倒だったりしますから、
それぞれ長所短所をうまく使い分けるしかありません。
複数台構成計画において、
EBSがらみの部分はもう一度考え直さないといけませんが(多分NFSにするでしょうが)、
他の部分は着々と検証も進んでいます。
EC2のインスタンス2つを使ってMySQL Clusterを動かすのにも成功しました。
この調子だと今週中には実運用に持っていけそうです。
Oracle!?
- 2008-09-24 (水)
- 技術
Amazon(AWS)からメールが届いておりまして、
ざっと目を通してみると、
1.オラクルがOracleDBの動作プラットホームとしてEC2を公式に認証した。
2.オラクルとAWSが協力して、既存のOracleDBサーバーをEC2に移行しやすくした。
3.OracleDBインスタンスを移動できるので追加のライセンスは要らない。
4.機密を保持しながらOracleDBをS3に簡単にバックアップできるようになった。
5.MySQL Enterpriseをサポートした。つまりEC2上のMySQLに関してMySQL(Oracle)から有償のサポートが受けられる。
6.SimpleDBの宣伝。
て感じの事が書いてありました。
僕の読み違いもあるかもしれないので鵜呑みにしないように。
間違いの指摘は大歓迎です。
MySQLの項にEC2上でMySQLクラスタを組む方法のチュートリアルへのリンクがあり、
EC2でMySQLをセットアップする方法が一通り書かれていて興味深かったです。
ただし、やってる内容は単にEBSのボリューム上にMySQLのデータを置いておくだけで
一般的なクラスタリングのイメージとは違う感じでした。
多分、EBS自体が複数のサーバーでクラスタリングされてるから、
データをEBSに乗っけるだけでクラスタリングになるよって言いたいのかもしれません。
個人的にはちょっと納得できませんが。
オラクルから金もらってAmazonが代理で宣伝してるのかと思いきや、ちゃっかり最後にSimpleDBはサイコーだよ!って書いてあってウケました。
まぁ、Oracleにはあまりいい思い出が無いので
Oracle?イラネ。って感じです。
関係のない話題です。
最近JavascriptとFlashでごちゃごちゃやる何かを作っていて気付いたのですが、
MacのFirefoxは、スクロール中にすべての表示処理がブロックされる感じですね。
つまりスクロール中はFlashの表示は止まるし(音は止まらない)、
スクロールイベントで何かJavascriptを実行しようとしてもスクロールが終わってからしか反映されないです。
表示だけがブロックされてて、処理は実行されてるのかもしれませんが、そのへんは未確認です。
OCZSSD2-2C30G
- 2008-09-17 (水)
- 技術
BLESSで27,800円でした。
BLESSの店頭ではショーケースの中の商品に対して4桁の番号が振ってあり、それをレジに伝えるだけで買えるので好きです。
オーシーゼットエスエスディツーハイフンツーシーサンジュウジー、とか(何かの呪文かw)
オーシーゼットの~エスエスディーの~さんじゅうギガの~ユーエスビーがついてるやつ、とか言うのはすごく面倒ですからねぇ。
もちろんAspire oneに入れてみました。
一筋縄ではいきませんでしたがw
外付けのCDドライブなどを使って、普通にWindowsをインストールし、ドライバを入れるような方法だとすんなり行くんだと思いますが、
手元に外付けのCDドライブが無かったことと、リカバリ領域も含めて移行してみたかったため、イメージごとコピーする方法をとることにしました。
この場合、一番大きい問題としてHDDとSSDの容量の差が挙げられます。(Aspire oneに元々入ってるHDDは120GBで今回買ったSSDは30GBしかありません。)
なので、まず交換前にEASEUS Partition Managerを使いHDDの中のパーティションサイズをSSDに入るサイズに変更しました。
HDDのリカバリ領域のサイズ + HDDの通常パーティションのサイズ = SSDのサイズ
になるようにHDDの通常パーティションのサイズだけを変更しました。
リカバリ領域は6GBほどあり、約半分空いてたのですが、
不具合が出ると怖いので、リカバリ領域のサイズには手をつけていません。
その後、USBメモリからEASEUS Disk Copyを起動し、HDDからSSDにイメージコピーをしようとしたのですが、
USBブートの方法が分からず断念orz
次にGPartedをUSBメモリから起動しようとしましたが、起動途中でフリーズし使えませんでした。
どーせそういうイメージコピーツールなんて実体はddコマンドでしょ?と思い立ち、
Mac miniにUSBでHDDとSSDを繋ぎddコマンドでコピーすることにしました。
さすがりんごのマークのUNIX!
※以下の操作は、ちょっとしたミスでHDDの内容をリカバリ領域とか関係なく吹き飛ばす可能性が大いにありますのでご注意ください。
# dd if=/dev/disk1 of=/dev/disk2
※デバイスファイル名は一例です。このままコピペで実行しないように!
とかでイメージコピーできます。
if(infile)とof(outfile)のデバイスファイル名は挿した順に付くようですが、
ディスクユーティリティやdfコマンドなどで、どっちがどっちなのか確実に確認してください。
ifとofを逆に指定したら泣けますw
ただしこれだとすごく時間が掛かるので、bs(入出力ブロックサイズ)とcount(ブロック数)を指定します。
# dd if=/dev/disk1 of=/dev/disk2 bs=16k count=1953125
※デバイスファイル名や数値は一例です。このままコピペで実行しないように!
dfコマンドで各ディスクのブロックサイズ512バイトのときのブロック数が表示されるので、
その中のSSDのブロック数を参考に数値を決定します。
例えばブロックサイズ512バイトでブロック数が62500000の場合、
bs=16k(512バイトの32倍)ならcountは62500000の32分の1の1953125となります。
うちの環境では、試してみた範囲ではbs=16kが一番早く、7MB/sのコピー速度が出てました。
bs未指定では3MB/sぐらいでした。
もっとスピード出ても良さそうですが、とにかくコピーできればいいのであまりこの辺は突き詰めてません。
ちなみに、ddコマンドの進捗状況はCtrl+Tで見ることができます。
イメージコピーが終われば、あとはSSDをAspire oneに組み込み、電源ONで普通にさっきまで使ってた状態でWindowsが起動しました。
リカバリも試してみましたが、普通にできました。
容量が少ないからダメだよ的なメッセージが出てリカバリできず、結局外付けのCDドライブを購入して普通にWindowsをインストールする羽目になるところまで予想してましたが、
予想外に何の問題も出ませんでしたw
気になるのはOCZの前のバージョンのSSD(というかMLCタイプのSSD全般?)でWindowsを使ったときのプチフリーズ問題ですが、
今回のCore V2もプチフリーズ問題があると言えばあります。
うちの環境ではWindowsの起動後、スタートアップ項目が一通り起動し終わった直後にHDDアクセスランプが点灯し十数秒フリーズというか書き込みがブロックされた状態になります。
そのタイミング以外では今のところプチフリーズと思われる問題はありません。
Windowsの起動自体は速くなったのでもったいないです。
– 追記 –
その後、色々日常的に使うソフトをインストールしたり、デフラグしたりしただけなのですが、
いつの間にか、起動直後のプチフリーズが発生しなくなっていました。
しかし、一度MagicDisk関連でブルーバックが発生したのですが、再起動してみるとその直前に作業してた内容が保存されていませんでした。(Live Messengerの設定とスタートメニューの全てのプログラムの並び順)
直前とはいってもブルーバックが発生する数分前のことでしたし、EWFとかも特に設定してないしで、ちょっと不可解な現象でした。
それ以来再現してない(というか再現させようとしてない)のですが、いきなり電源を落とすと何か問題があるかもしれません。
基本的にFirefox使いながら映像通話するだけだしAspire oneは元々キビキビ動いてたので、SSDに換装して正直そんなに早くなった気はしませんが、
今回はとにかくSSDを使ってみたかったことと、振動に弱いHDDを外すことが主目的だったのでOKです。
これで移動中に気兼ねなくAspire oneをいじれるようになったわけです。
超インドア派な僕にそんなシチュエーションが訪れるかどうかは分かりませんがw
ついでに、この前換装した無線LANモジュールですが、特に問題もなく快調に動作しています。
当然いきなりデバイスマネージャから消えることもなく、感度の問題も発生することなく、換装したことを忘れそうなくらい普通に動いてます。
Aspire oneがいくら安いといっても、結局は色々パーツ交換したりして高くついてしまってますねw
こんなんだったらEeePCの方がいいんじゃない?とか言われそうですが、
個人的にはあの昔のウィスパーに似たテイストのロゴマークが許せないので、選択肢にはあがりません。
以前のASUSロゴが格好良かったと思うのですが、当時は手に入れたくても品薄で手に入りませんでしたからねぇ。
最後にCrystalDiskMark2.2の結果を上からAspire one標準HDD(日立製)、OCZSSD2-2C30G(USB接続)、OCZSSD2-2C30G(SATA接続)の順に乗せておきます。
ベンチは全てウイルス対策ソフトやOfficeなど常用環境としていろんなソフトを入れた後に計測しています。
HTS543212L9A300(Aspire one標準 2.5インチ SATA HDD 120GB)

OCZSSD2-2C30G(USB接続 2.5インチ MLC SSD 30GB)

OCZSSD2-2C30G(SATA接続 2.5インチ MLC SSD 30GB)

ついでに↑の画像のテキストデータもおいておきます。
HTS543212L9A300(Aspire one標準 2.5インチ SATA HDD 120GB)
————————————————–
CrystalDiskMark 2.2 (C) 2007-2008 hiyohiyo
Crystal Dew World : http://crystalmark.info/
————————————————–
Sequential Read : 45.743 MB/s
Sequential Write : 38.209 MB/s
Random Read 512KB : 22.472 MB/s
Random Write 512KB : 20.517 MB/s
Random Read 4KB : 0.358 MB/s
Random Write 4KB : 0.998 MB/s
Test Size : 100 MB
Date : 2008/09/16 22:15:48
OCZSSD2-2C30G(USB接続 2.5インチ MLC SSD 30GB)
————————————————–
CrystalDiskMark 2.2 (C) 2007-2008 hiyohiyo
Crystal Dew World : http://crystalmark.info/
————————————————–
Sequential Read : 30.548 MB/s
Sequential Write : 25.760 MB/s
Random Read 512KB : 30.306 MB/s
Random Write 512KB : 22.461 MB/s
Random Read 4KB : 5.419 MB/s
Random Write 4KB : 1.803 MB/s
Test Size : 100 MB
Date : 2008/09/16 22:22:08
OCZSSD2-2C30G(SATA接続 2.5インチ MLC SSD 30GB)
————————————————–
CrystalDiskMark 2.2 (C) 2007-2008 hiyohiyo
Crystal Dew World : http://crystalmark.info/
————————————————–
Sequential Read : 116.490 MB/s
Sequential Write : 68.725 MB/s
Random Read 512KB : 110.869 MB/s
Random Write 512KB : 40.062 MB/s
Random Read 4KB : 12.480 MB/s
Random Write 4KB : 1.828 MB/s
Test Size : 100 MB
Date : 2008/09/20 17:22:38
Aspire oneの無線LANモジュールを交換してみました
- 2008-09-12 (金)
- 技術
この前、接触不良で落ちたのではと思われていたAspire one内蔵の無線LANモジュール(Atheros)ですが、あの後さらに2回落ちました。
落ちたのはすべてMessengerで映像通話をしてる最中で、無線LANモジュールに負荷がかかっていた時だと思われます。
まぁ、一晩中映像通話しっぱなしという使い方が普通であるとは思ってないので、価格と筐体のサイズ的に仕方ないかなという気持ちです。
だからといって熱暴走で無線LANが落ちるのを指をくわえて見てるつもりもないので、別の無線LANモジュールを買いました。
Intelの3945ABGです。
PCI Express Mini Cardの中では大手メーカー製のノートパソコンへの採用実績も多く、単体での信頼性は高いと思います。
日曜に秋葉で方々探したのですが、見つけるのにかなり苦労しました。
価格はいつものアークで4000円弱でした。(なんかアークとは自分の趣味と合う感じです。)
普通に交換して、普通にドライバ入れるだけで、普通に使えています。
無線LAN On/Offのスイッチもちゃんと使えてます。
信頼性についてはもう少し長く使ってみないと何ともいえませんが、一応未だ落ちたことはありません。
MySQL5.1のMySQL Clusterでマシン再起動後にNDB上のTABLESPACEのテーブルにアクセスできない問題
- 2008-09-11 (木)
- 技術
タイトル長くてすいません。
VMWare Serverを使って例の複数台構成の検証をしてたのですが、
MySQL5.1のMySQL Clusterでマシン再起動後にNDB上のTABLESPACEのテーブルにアクセスできない問題が発生しました。
SIGSEGV: 【プログラミング】MySQL 5.0, 5.1 でクラスタを組んでみる
このサイト参考にインストールとテストを行ってたのですが、
最初は正常にクラスタリングできるのに、マシンを再起動したらNDB上のデータにアクセスできませんでした。
オンディスクじゃなくてオンメモリになってるのかと思いましたが、ディスク上にデータファイルも残ってるし、色々調べたら何らかのエラーでデータファイルが読み込めていない様子でした。
(エラーコードを頼りにperrorを使ってみましたが、エラーの説明文が酷くて役に立ちませんでした。)
それでも色々調べたり試したりしてたら原因が分かりました。
(さらっと書いてますが、実際はここで2,3日がんばってます)
Dataノードの2回目以降の起動の仕方を間違ってたのが原因でした。
Dataノードは初回は ndbd –initial で起動するのですが、2回目以降は –initial なしで起動しなきゃいけないのです。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 14.6.5.2 ndbdのコマンド オプション
–initialを付けると、Clusterのファイルシステムの全てが消去されるらしいです。
ただ全てといってもクラスタ構築の作業にかかわる全ての痕跡が消去されるわではないみたいなので、作成したTABLESPACEはあるっぽいのに中身が無いといった状態になるようです。
initialなんだからこの動作は至極妥当だと思いますが、どういうレベルのinitialなのか良く調べるべきでした。
ちなみに、–initialを付けると、Clusterのファイルシステムの全てが消去されるらしいと書きましたが、
実際に、一度initialしてしまうと簡単に復旧する方法は無いみたいです。
まぁ、再起動後の検証も行わずにいきなり実運用に投入する人は居ないと思いますが、お気をつけ下さい。
NoOfReplicasが2以上なら1台消去されても問題ないかもしれません。
cal_days_in_monthが無い!
- 2008-09-10 (水)
- 技術
久しぶりにphpやりました。
文法がcに似てるのであまり迷うことは無いですが、foreachやif ~ elseの書き方で一瞬止まります。
inだったかなasだったかなとか、else ifだっけelseifだっけelsifだっけとか。
基本的過ぎてググるのもちょっと難しいです。(多分、それ”だけ”を説明してるページは多くないでしょう。)
まぁそういうときは、誰かが書いたソースを見ればすぐ分かるので問題ないですが。
それより、cal_days_in_monthです。
暦の種類(グレゴリウス暦やユリウス暦など)と、年月を渡すと、その月の日数を得ることができる関数です。
例えば、 cal_days_in_month(CAL_GREGORIAN, 2008, 9) とすれば、2008年9月の日数である30が返ってくるわけです。
うるう年の場合なんかもよしなにやってくれるので便利なわけです。
この関数はphpの標準関数だと思っていたのですが、どうも明示的with-calenderオプションをつけてphpをコンパイルしてないと使えないらしいです。
以前はそんなこと無かったような気がするのですが・・・
yumとかaptとかrpmとかportsとかで入るものがどうかは知りません。
たまたま今回使ったxreaのサーバーでcal_days_in_monthが使えなかったのです。
何とかする方法がないかとちょっとだけ調べてみましたが、調べるよりもcal_days_in_monthを独自に実装する手間の方が少ない気がして作ってみました。
if(!function_exists(”cal_days_in_month”)){
function cal_days_in_month($calender, $month, $year){
$year = (int)$year;
$month = (int)$month;
$year = ($year <= 100 && $year >= 0)?(($year < 70)?($year+2000):($year+1900)):$year;
$isLeap = (($year % 4 == 0) && (($year % 100 != 0) || ($year % 400 == 0)));
$days_in_month = array(0, 31, ($isLeap)?29:28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
return $days_in_month[$month];
}
}
短いので説明するまでもないと思いますが、見たら分かるとおり、かなり手抜きです。
グレゴリウス暦にしか対応してませんし、年月にマイナスの数字や整数以外のものが渡されたとき、月が1~12の範囲外だったときはどうなるか分かりません。
CAL_GREGORIAN定数も使ってる場合は、定数が定義されてるか調べて、定義されていない場合は定義するとかしないと、呼び出し元でワーニングが出ると思います。
一応、年は2桁と4桁に対応し、mktimeの仕様に準じて0~69は2000~2069、70~100は1970~2000と解釈します。
文法がcに似てるのであまり迷うことは無いですが、foreachやif ~ elseの書き方で一瞬止まります。
inだったかなasだったかなとか、else ifだっけelseifだっけelsifだっけとか。
基本的過ぎてググるのもちょっと難しいです。(多分、それ”だけ”を説明してるページは多くないでしょう。)
まぁそういうときは、誰かが書いたソースを見ればすぐ分かるので問題ないですが。
それより、cal_days_in_monthです。
暦の種類(グレゴリウス暦やユリウス暦など)と、年月を渡すと、その月の日数を得ることができる関数です。
例えば、 cal_days_in_month(CAL_GREGORIAN, 2008, 9) とすれば、2008年9月の日数である30が返ってくるわけです。
うるう年の場合なんかもよしなにやってくれるので便利なわけです。
この関数はphpの標準関数だと思っていたのですが、どうも明示的with-calenderオプションをつけてphpをコンパイルしてないと使えないらしいです。
以前はそんなこと無かったような気がするのですが・・・
yumとかaptとかrpmとかportsとかで入るものがどうかは知りません。
たまたま今回使ったxreaのサーバーでcal_days_in_monthが使えなかったのです。
何とかする方法がないかとちょっとだけ調べてみましたが、調べるよりもcal_days_in_monthを独自に実装する手間の方が少ない気がして作ってみました。
if(!function_exists(”cal_days_in_month”)){
function cal_days_in_month($calender, $month, $year){
$year = (int)$year;
$month = (int)$month;
$year = ($year <= 100 && $year >= 0)?(($year < 70)?($year+2000):($year+1900)):$year;
$isLeap = (($year % 4 == 0) && (($year % 100 != 0) || ($year % 400 == 0)));
$days_in_month = array(0, 31, ($isLeap)?29:28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
return $days_in_month[$month];
}
}
短いので説明するまでもないと思いますが、見たら分かるとおり、かなり手抜きです。
グレゴリウス暦にしか対応してませんし、年月にマイナスの数字や整数以外のものが渡されたとき、月が1~12の範囲外だったときはどうなるか分かりません。
CAL_GREGORIAN定数も使ってる場合は、定数が定義されてるか調べて、定義されていない場合は定義するとかしないと、呼び出し元でワーニングが出ると思います。
一応、年は2桁と4桁に対応し、mktimeの仕様に準じて0~69は2000~2069、70~100は1970~2000と解釈します。
Home > 技術
- 検索
- フィード
- メタ









