2014年09月

2014年3月23日に発生した障害について

2014年3月23日から28日までErogameScapeに接続できない事象が発生いたしました。
当時は大変ご迷惑をおかけいたしました。

※私が海外に行くたびに障害が発生するのはなぜなんでしょうか…
 ちなみに先日8日間ドイツに行って参りましたが、今回は大丈夫でした…ドキドキです… 

調査の結果、障害を発生させたスクリプトはつきとめたのですが、なぜそのスクリプトが悪いのかの原因は分かりませんでした。
以下に当時起こった事象を記しておきます。

ErogameScapeはpgpoolを使っています。
PostgreSQLは物理的なサーバー2台に配置していて冗長化されています。

3月22日5時30分、pgpoolにおいて、DB node 0が切り離されました。
2014-03-22 05:30:01 LOG:   pid 32311: postmaster on DB node 0 was shutdown by administrative command
2014-03-22 05:30:01 LOG:   pid 32311: degenerate_backend_set: 0 fail over request from pid 32311
2014-03-22 05:30:01 LOG:   pid 20333: starting degeneration. shutdown host erogamescape14(5432)
2014-03-22 05:30:01 LOG:   pid 20333: Restart all children
2014-03-22 05:30:01 LOG:   pid 20333: failover: set new primary node: -1
2014-03-22 05:30:01 LOG:   pid 20333: failover: set new master node: 1
2014-03-22 05:30:02 LOG:   pid 20333: failover done. shutdown host erogamescape14(5432)
2014-03-22 05:30:02 LOG:   pid 29718: worker process received restart request
2014-03-22 05:30:03 LOG:   pid 29717: pcp child process received restart request
2014-03-22 05:30:03 LOG:   pid 20333: PCP child 29717 exits with status 256 in failover()
2014-03-22 05:30:03 LOG:   pid 20333: fork a new PCP child pid 4058 in failover()
2014-03-22 05:30:03 LOG:   pid 20333: worker child 29718 exits with status 256
2014-03-22 05:30:03 LOG:   pid 20333: fork a new worker child pid 4059

3月23日5時30分、pgpoolにおいて、DB node 1が切り離されました。
2014-03-23 05:30:01 LOG:   pid 2306: postmaster on DB node 1 was shutdown by administrative command
2014-03-23 05:30:01 LOG:   pid 2306: degenerate_backend_set: 1 fail over request from pid 2306
2014-03-23 05:30:01 LOG:   pid 20333: starting degeneration. shutdown host erogamescape13(5432)
2014-03-23 05:30:01 ERROR: pid 20333: failover_handler: no valid DB node found
2014-03-23 05:30:01 LOG:   pid 20333: Restart all children
2014-03-23 05:30:01 LOG:   pid 20333: failover: set new primary node: -1
2014-03-23 05:30:01 LOG:   pid 20333: failover done. shutdown host erogamescape13(5432)
2014-03-23 05:30:01 LOG:   pid 4059: worker process received restart request
2014-03-23 05:30:02 LOG:   pid 4058: pcp child process received restart request
2014-03-23 05:30:02 LOG:   pid 20333: PCP child 4058 exits with status 256 in failover()
2014-03-23 05:30:02 LOG:   pid 20333: fork a new PCP child pid 4518 in failover()
2014-03-23 05:30:02 LOG:   pid 20333: worker child 4059 exits with status 256
2014-03-23 05:30:02 LOG:   pid 20333: fork a new worker child pid 4519
nodeが2つとも切り離されちゃっているので、ApacheからPostgreSQLに接続できなくなってサービス中断です。

この時のPostgreSQLのログは以下の通りです。
DB node 0にあたるPostgreSQLのログ
< 2014-03-22 05:30:01.538 JST >FATAL:  terminating connection due to administrator command

DB node 1にあたるPostgreSQLのログ
< 2014-03-23 05:30:01.492 JST >FATAL:  terminating connection due to administrator command
何かがコネクションを解放しています。

PostgreSQLのログを確認すると以下のような記録がありました。
[root@erogamescape14 ap2]# cat /var/lib/pgsql/9.3/data/pg_log/postgresql-Fri.log | grep " 05:30:01"
< 2014-03-28 05:30:01.268 JST > user=nobody p=7416 LOG:  statement:  DISCARD ALL
< 2014-03-28 05:30:01.334 JST > user=nobody p=7416 LOG:  statement:  DISCARD ALL
< 2014-03-28 05:30:01.472 JST > user=[unknown] p=7439 LOG:  connection received: host=192.168.0.14 port=34851
< 2014-03-28 05:30:01.745 JST > user=nobody p=7062 LOG:  statement:  DISCARD ALL
< 2014-03-28 05:30:01.754 JST > user=[unknown] p=7471 LOG:  connection received: host=192.168.0.13 port=43955
< 2014-03-28 05:30:01.755 JST > user=[unknown] p=7472 LOG:  connection received: host=[local]
< 2014-03-28 05:30:01.755 JST > user=nobody p=7471 LOG:  connection authorized: user=nobody database=ap2
< 2014-03-28 05:30:01.756 JST > user=ap2 p=7472 LOG:  connection authorized: user=ap2 database=ap2
< 2014-03-28 05:30:01.757 JST > user=ap2 p=7472 LOG:  statement: SELECT pg_terminate_backend(pid)
< 2014-03-28 05:30:01.784 JST > user=nobody p=5117 LOG:  disconnection: session time: 0:09:58.828 user=nobody database=ap2 host=192.168.0.13 port=43902
< 2014-03-28 05:30:01.794 JST > user=nobody p=7196 LOG:  disconnection: session time: 0:02:11.888 user=nobody database=ap2 host=192.168.0.14 port=59202
< 2014-03-28 05:30:01.797 JST > user=nobody p=6216 LOG:  disconnection: session time: 0:05:02.909 user=nobody database=ap2 host=192.168.0.14 port=54374
< 2014-03-28 05:30:01.844 JST > user=nobody p=7166 LOG:  disconnection: session time: 0:02:22.012 user=nobody database=ap2 host=192.168.0.14 port=58929
< 2014-03-28 05:30:01.845 JST > user=nobody p=7217 LOG:  disconnection: session time: 0:02:09.908 user=nobody database=ap2 host=192.168.0.14 port=59242赤字のSELECT文が実行されたので、pgpoolにおいてDB nodeが切り離されたことが確認されました。
誰がSELECT pg_terminate_backend(pid)を実行しているのかが分かりません。

この事象は必ず5時30分に起きるので、この時刻付近に起動するスクリプトが原因だと思いましたが、私が旅行中の出来事ですので、何も変更していません…
当時、その時刻に動いていそうなスクリプトは2つありました。
そのスクリプトを試しに止めて見ると事象が発生しなくなりました。

え?なんで?というのが正直な気持ちでした。

そこでPostgreSQLのログをもっと詳細にとりつつ、pgpoolもデバッグモードで起動して、ログを確認しました。
※ErogameScapeは小さいサービスですが、それでもすごい大量のログを吐くのでドキドキでした。

PostgreSQLのログは以下の通りです。
< 2014-03-30 05:20:01.385 JST > user=[unknown] p=18477 LOG:  connection received: host=192.168.0.14 port=35869
< 2014-03-30 05:20:01.386 JST > user=ap2 p=18477 LOG:  connection authorized: user=ap2 database=ap2
< 2014-03-30 05:20:01.393 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:01.620 JST > user=ap2 p=18477 LOG:  statement: BEGIN
< 2014-03-30 05:20:01.621 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:01.622 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:01.623 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:01.624 JST > user=ap2 p=18477 LOG:  statement: COMMIT
< 2014-03-30 05:20:01.625 JST > user=ap2 p=18477 LOG:  statement: BEGIN
< 2014-03-30 05:20:01.626 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:01.626 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:01.627 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:01.628 JST > user=ap2 p=18477 LOG:  statement: COMMIT

以下略

< 2014-03-30 05:20:18.793 JST > user=ap2 p=18477 LOG:  statement: BEGIN
< 2014-03-30 05:20:18.798 JST > user=ap2 p=18477 LOG:  statement:
< 2014-03-30 05:20:18.798 JST > user=ap2 p=18477 LOG:  statement:

< 2014-03-30 05:30:01.948 JST > user=[unknown] p=20374 LOG:  connection received: host=[local]
< 2014-03-30 05:30:01.949 JST > user=ap2 p=20374 LOG:  connection authorized: user=ap2 database=ap2
< 2014-03-30 05:30:01.950 JST > user=ap2 p=20374 LOG:  statement: SELECT pg_terminate_backend(pid)

< 2014-03-30 05:30:02.008 JST > user=ap2 p= FATAL:  terminating connection due to administrator command
< 2014-03-30 05:30:02.008 JST > user=ap2 p=18477 LOG:  disconnection: session time: 0:10:00.623 user=ap2 database=ap2 host=192.168.0.14 port=35869
< 2014-03-30 05:30:02.009 JST > user=nobody p=20018 LOG:  disconnection: session time: 0:04:27.115 user=nobody database=ap2 host=192.168.0.14 port=46445
< 2014-03-30 05:30:02.009 JST > user=nobody p=19999 LOG:  disconnection: session time: 0:04:38.157 user=nobody database=ap2 host=192.168.0.14 port=46026

5時20分18秒にBEGINではじまったトランザクションが終わらないっぽくて、おそらく…pgpoolが何かを検知してSELECT pg_terminate_backend(pid)を発行しています。その結果、pgpoolからPostgreSQLが切り離されます。

pgpoolのログは以下の通りです。
2014-03-30 05:30:02 LOG:   pid 21726: postmaster on DB node 1 was shutdown by administrative command
2014-03-30 05:30:02 LOG:   pid 21726: degenerate_backend_set: 1 fail over request from pid 21726
2014-03-30 05:30:02 LOG:   pid 27495: starting degeneration. shutdown host erogamescape13(5432)
2014-03-30 05:30:02 LOG:   pid 27495: Restart all children
2014-03-30 05:30:02 LOG:   pid 27495: failover: set new primary node: -1
2014-03-30 05:30:02 LOG:   pid 27495: failover: set new master node: 0
2014-03-30 05:30:02 LOG:   pid 27800: worker process received restart request
2014-03-30 05:30:02 LOG:   pid 27495: failover done. shutdown host erogamescape13(5432)
2014-03-30 05:30:03 LOG:   pid 27799: pcp child process received restart request
2014-03-30 05:30:03 LOG:   pid 27495: PCP child 27799 exits with status 256 in failover()
2014-03-30 05:30:03 LOG:   pid 27495: fork a new PCP child pid 24558 in failover()
2014-03-30 05:30:03 LOG:   pid 27495: worker child 27800 exits with status 256
2014-03-30 05:30:03 LOG:   pid 27495: fork a new worker child pid 24559
2014-03-30 05:32:00 LOG:   pid 24454: pool_send_and_wait: Error or notice message from backend: : DB node id: 0 backend pid: 25060 statement:
5時20分に開始するスクリプトはBEGINしてCOMMITしてを繰り返すスクリプトでしたので、このスクリプトが原因だ!と分かりました。
しかし、このスクリプトを普通に起動すると正常に動作が完了します。
なぜ5時20分に起動すると18秒後にBEGINしたまま止まるのか…原因が分かりませんでした。
100%再現するので何かと競合しているのですが、当時何もいじっていないので見当がつかず現在に至っています。

結局、そのスクリプトは「まあ、毎日動かさなくてもいいから、私が手動で動かせばいいかー」というものでしたので、気がついたら手動で動かしております。

大変ご迷惑をおかけいたしました。
今後ともよろしくお願いします。

同一物理ネットワークで2つのブロードバンドルータを使う場合の注意

通常のご家庭には、ブロードバンドルータが2つあるなんてない…と思いますが、ErogameScapeを運用している自宅サーバーの環境はブロードバンドルータが2つあります。

1つはErogameScape用で、もう1つは私がプライベート用です。

なんでこうなっているか?というと、ブロードバンドルータが1つですと「http://erogamescape.dyndns.org/~ap2/ero/toukei_kaiseki/」で接続しようとすると、接続できなかった…おそらく名前解決すると自身に設定されているIPアドレスなのでルーティングできなかったからだと思うのですが…のと、「ErogameScapeに接続できない」AND「内部ネットワークからはErogameScapeに接続できる」といった場合に、
自宅 --- ブロードバンドルータ1 --- プロバイダ1 --中略-- プロバイダ2 ---- ブロードバンドルータ2 ---- 自宅な接続が出来る?ということを確かめたかったからです。

ここまで書いて、現在はスマホがあるから、後者のErogameScape用のブロードバンドルータの外部からの接続の正常性の確認はスマホで代用できる気がしました…

さて、本題です。
ブロードバンドルータの内部LANの初期設定は、自身のアドレスが192.168.0.1だったりすると思います。
ある日、プライベート用のブロードバンドルータの電源をOFF/ONしましたら設定が初期化されまして、デフォルトの設定に戻りました。
プライベート用のブロードバンドルータのアドレスが192.168.0.1になりました。
ErogameScape用のブロードバンドルータのアドレスは192.168.0.1です。

自身のPCからプライベート用のブロードバンドルータにログインできなくなるし、なぜかErogameScapeのトラヒックのグラフがおかしくなるし、なんでかなーと思い、今やったのはプライベート用のブロードバンドルータの電源のOFF/ONでしたので、とりあえずこれを切り離すかーと思って、切り離したらErogameScapeのトラヒックが回復しました。

また繋ぐとおかしくなるなるので、原因はプライベート用のブロードバンドルータだと分かったのですが、なぜおかしくなったのかが分からなくて、なんとなく「設定初期化された?」と気がついて調べたらあたりでした。

同一物理ネットワークで2つのブロードバンドルータを使う場合は、設定が初期化されてしまうことも考えて、初期設定のアドレスから変更しておきべきだなあ…と思いました。
ブロードバンドルータを2つ使うことなんてないと思いますが…

CentOSのソフトウェアRAID1を構成するHDDの1つが故障したので、新HDDに交換する手順

ErogameScapeはLinuxのソフトウェアRAID1でHDDを冗長化しています。
ソフトウェアRAID1を採用してはじめてHDDが壊れましたので、その復旧手順をメモしておきます。

ErogameScapeではHDDが壊れてもメールする…という仕組みを設定してなくて、Muninのグラフを見て「あ、壊れた」と判断します。
ちなみに壊れたことにまったく気がついていなくて、気がついたときには5日くらい経っていました…
HDDが壊れたときのMUninのグラフを以下に示します。

無題
いつもは100%ですが、1つ壊れると50%になります。

/proc/mdstatの出力は以下のようになりました。
[ap2@erogamescape13 ~]$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdf1[1](F) sde1[0]
      1060244 blocks super 1.0 [2/1] [U_]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md1 : active raid1 sdf3[1](F) sde3[0]
      942138801 blocks super 1.1 [2/1] [U_]
      bitmap: 7/8 pages [28KB], 65536KB chunk

unused devices: 
正常時は以下の通りです。
[ap2@erogamescape13 ~]$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sde1[0] sdf1[2]
      1060244 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md1 : active raid1 sdf3[2] sde3[0]
      942138801 blocks super 1.1 [2/2] [UU]
      bitmap: 2/8 pages [8KB], 65536KB chunk

unused devices: 
/dev/sdfが壊れているので、/dev/sdfをRAIDから切り離します。
[root@erogamescape13 ap2]# mdadm /dev/md0 -r /dev/sdf1
mdadm: hot removed /dev/sdf1 from /dev/md0
[root@erogamescape13 ap2]# mdadm /dev/md1 -r /dev/sdf3
mdadm: hot removed /dev/sdf3 from /dev/md1
[root@erogamescape13 ap2]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sde1[0]
      1060244 blocks super 1.0 [2/1] [U_]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md1 : active raid1 sde3[0]
      942138801 blocks super 1.1 [2/1] [U_]
      bitmap: 7/8 pages [28KB], 65536KB chunk
/proc/mdstatから/dev/sdfがいなくなりました。
/dev/sdfを交換します。

※HDDを交換するとき、今回で言うとどのHDDが/dev/sdfなのかが、ぱっと見分からないです…
 同じHDDを積んでいないのでHDD本体を見れば「こっちか」と分かるのですが、外さないと型番が見にくいです。
 何かいい方法はないでしょうか、おそらくあると思うのですが…

交換が終わりましたら、/dev/sdeと同じようにfdiskで領域を確保します。
/dev/sdfの領域は以下のようになっています。
[root@erogamescape13 ap2]# fdisk -l /dev/sde

ディスク /dev/sde: 1000.2 GB, 1000204886016 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000b174e

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sde1   *           1         132     1060258+  fd  Linux raid 自動検出
/dev/sde2             133        4310    33559785   82  Linux スワップ / Solaris
/dev/sde3            4311      121601   942139957+  fd  Linux raid 自動検出

[root@erogamescape13 ap2]# fdisk /dev/sdf
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x1fd65b05 で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): m
コマンドの動作
   a   ブート可能フラグをつける
   b   bsd ディスクラベルを編集する
   c   dos 互換フラグをつける
   d   領域を削除する
   l   既知の領域タイプをリスト表示する
   m   このメニューを表示する
   n   新たに領域を作成する
   o   新たに空の DOS 領域テーブルを作成する
   p   領域テーブルを表示する
   q   変更を保存せずに終了する
   s   空の Sun ディスクラベルを作成する
   t   領域のシステム ID を変更する
   u   表示/項目ユニットを変更する
   v   領域テーブルを照合する
   w   テーブルをディスクに書き込み、終了する
   x   特別な機能 (エキスパート専用)

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-121601, 初期値 1):
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-121601, 初期値 121601): +1G

コマンド (m でヘルプ): p

ディスク /dev/sdf: 1000.2 GB, 1000204886016 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x1fd65b05

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdf1               1         132     1060256+  83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
Partition 1 does not start on physical sector boundary.

コマンド (m でヘルプ): a
パーティション番号 (1-4): 2
警告: 領域 2 は空のタイプです。

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 2
最初 シリンダ (132-121601, 初期値 132):
初期値 132 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (132-121601, 初期値 121601): +32G

コマンド (m でヘルプ): p

ディスク /dev/sdf: 1000.2 GB, 1000204886016 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x1fd65b05

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdf1               1         132     1060256+  83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
Partition 1 does not start on physical sector boundary.
/dev/sdf2             132        4310    33551756   83  Linux

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 3
最初 シリンダ (4310-121601, 初期値 4310):
初期値 4310 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (4310-121601, 初期値 121601):
初期値 121601 を使います

コマンド (m でヘルプ): p

ディスク /dev/sdf: 1000.2 GB, 1000204886016 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x1fd65b05

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdf1               1         132     1060256+  83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
Partition 1 does not start on physical sector boundary.
/dev/sdf2             132        4310    33551756   83  Linux
/dev/sdf3            4310      121601   942147988+  83  Linux

コマンド (m でヘルプ): m
コマンドの動作
   a   ブート可能フラグをつける
   b   bsd ディスクラベルを編集する
   c   dos 互換フラグをつける
   d   領域を削除する
   l   既知の領域タイプをリスト表示する
   m   このメニューを表示する
   n   新たに領域を作成する
   o   新たに空の DOS 領域テーブルを作成する
   p   領域テーブルを表示する
   q   変更を保存せずに終了する
   s   空の Sun ディスクラベルを作成する
   t   領域のシステム ID を変更する
   u   表示/項目ユニットを変更する
   v   領域テーブルを照合する
   w   テーブルをディスクに書き込み、終了する
   x   特別な機能 (エキスパート専用)

コマンド (m でヘルプ): t
パーティション番号 (1-4): 1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): t
パーティション番号 (1-4): 2
16進数コード (L コマンドでコードリスト表示): 82
領域のシステムタイプを 2 から 82 (Linux スワップ / Solaris) に変更しました

コマンド (m でヘルプ): t
パーティション番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 3 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/sdf: 1000.2 GB, 1000204886016 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x1fd65b05

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdf1               1         132     1060256+  fd  Linux raid 自動検出
パーティション 1 は、シリンダ境界で終わっていません。
Partition 1 does not start on physical sector boundary.
/dev/sdf2             132        4310    33551756   82  Linux スワップ / Solaris
/dev/sdf3            4310      121601   942147988+  fd  Linux raid 自動検出

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
[root@erogamescape13 ap2]#
[root@erogamescape13 ap2]#
[root@erogamescape13 ap2]# fdisk /dev/sdf

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): a
パーティション番号 (1-4): 1

コマンド (m でヘルプ): p

ディスク /dev/sdf: 1000.2 GB, 1000204886016 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
ディスク識別子: 0x1fd65b05

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdf1   *           1         132     1060256+  fd  Linux raid 自動検出
パーティション 1 は、シリンダ境界で終わっていません。
Partition 1 does not start on physical sector boundary.
/dev/sdf2             132        4310    33551756   82  Linux スワップ / Solaris
/dev/sdf3            4310      121601   942147988+  fd  Linux raid 自動検出

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!


ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
/dev/sdfをRAIDに組み込みます。
[root@erogamescape13 ap2]# mdadm /dev/md0 --add /dev/sdf1
mdadm: added /dev/sdf1
[root@erogamescape13 ap2]# mdadm /dev/md1 --add /dev/sdf3
mdadm: added /dev/sdf3
組み込むとRebuildがはじまります。
/dev/md0は1Gしかないのであっという間に終わりますが、/dev/md1は相当時間がかかります。
[root@erogamescape13 ap2]# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.0
  Creation Time : Thu Jul 28 04:17:57 2011
     Raid Level : raid1
     Array Size : 1060244 (1035.57 MiB 1085.69 MB)
  Used Dev Size : 1060244 (1035.57 MiB 1085.69 MB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Tue Jun 24 23:21:19 2014
          State : active
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : localhost.localdomain:0
           UUID : 02707424:61b2b644:717d3829:948376d3
         Events : 223

    Number   Major   Minor   RaidDevice State
       0       8       65        0      active sync   /dev/sde1
       2       8       81        1      active sync   /dev/sdf1
[root@erogamescape13 ap2]# mdadm --detail /dev/md1
/dev/md1:
        Version : 1.1
  Creation Time : Thu Jul 28 04:17:59 2011
     Raid Level : raid1
     Array Size : 942138801 (898.49 GiB 964.75 GB)
  Used Dev Size : 942138801 (898.49 GiB 964.75 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Tue Jun 24 23:21:51 2014
          State : active, degraded, recovering
 Active Devices : 1
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 1

 Rebuild Status : 0% complete

           Name : localhost.localdomain:1
           UUID : e1c4e9e4:ed5a8be1:2e5318e8:3fc28250
         Events : 1335745

    Number   Major   Minor   RaidDevice State
       0       8       67        0      active sync   /dev/sde3
       2       8       83        1      spare rebuilding   /dev/sdf3
[root@erogamescape13 ap2]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdf1[2] sde1[0]
      1060244 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md1 : active raid1 sdf3[2] sde3[0]
      942138801 blocks super 1.1 [2/1] [U_]
      [>....................]  recovery =  0.3% (3171840/942138801) finish=218.2min speed=71696K/sec
      bitmap: 7/8 pages [28KB], 65536KB chunk

unused devices: 
/dev/sdfから起動できるようにgrubを書き込んでおきます。
/dev/sdfがhd0なのかhd1なのか分からないので(いや…分かる方法はあると思うのですが…)、とりあえずhd0にもhd1にも書き込んでおればいいかーということで、両方にgrubを書き込んでおきます。
Rebuild中でも大丈夫です。
[root@erogamescape13 ap2]# grub
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root(hd0,0)
root(hd0,0)

Error 2: Unrecognized command
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  26 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+26 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> root (hd1,0)
root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd1)"...  26 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd1) (hd1)1+26 p (hd1,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit
以上で作業は完了です。

HDDが毎日とか週単位で壊れる環境だったら問題ないですが、個人でRAIDを使っているレベルだとごく稀にしか壊れないため、実際に壊れた場合に「さて、どうするんだっけ?」となると思います。
RAIDを組む際には、組んだ際に壊れたときの対処方法を何回か練習しておくべきだと思っています。
実際に壊すことはできないので、SATAのケーブルを抜いてみるとかそういう感じになってしまいますが…

記事検索