2024/01/01にクラッシュしてしまった私の32bit FreeBSD/arm 上で動作させているMySQLサーバー。約1週間かけて復旧させたので、その道のりに関しての記録。
何が元になったのかは不明ですが、MySQLサーバーを動かしていたHDD上に不良セクターが発生し、OS自体が使えなくなったのが 1/1 の深夜。HDDからMySQL内のデータを吸い出して、HTTPサーバー上にMySQLサーバーを立て、データを引っ越し、仮復旧したのが 1/2の早朝。
HDDを交換してOSを入れ直せば復旧かと思っていたら、RPI2 上の32bit FreeBSD の場合、USB HDDとの相性問題が発生するようで、問題回避策を見つけて、動作確認できるまでさらに二日。ようやく 1/4から復旧作業を再開できました。
以下、作業内容の記録。
- 「FreeBSD-13.2-RELEASE-arm-armv7-GENERICSD.img.xz」イメージから RPI Imager を使って、3.5inch USB HDD に OSを書き込み。
- RPI2 と USB HDDを接続して、RPI2からOSを仮起動。OSは、32bit FreeBSD/arm 13.2。
- 途中で、mountroot> シェルに落ちるため、ufs:/dev/ufs/rootfs で手動起動。
- /boot/loader.conf に「kern.cam.boot_delay=”10000″」を追加。
- /etc 下のカスタマイズが必要なファイルをバックアップから戻す。rc.conf, syslog.conf など。
/var/log/console.log を touch する。
TZを設定する。 - 必要なアカウントを作成し、管理者とデフォルトユーザーのパスワードをデフォルトから変更。
root のプロファイルにシステム管理に必要なコマンドを追加。 - 再起動して本番動作開始。
- 必要パッケージをインストール。mysql, ttyload, htop, iftop, git など。
- MySQLサーバーを起動。rootパスワードの設定。
- portsnap auto を実行して、/usr/ports を構築
- git clone を実行して /usr/src を構築
- /etc/aliases をカスタマイズ。管理者宛レポートを送信できるようにする。
- 仮設MySQLデータベースをダンプし、復旧中のデータベースサーバーにコピー。
- RPI2上で MySQLにリストアー。(約2時間くらいかかる)
- この間、/usr/src 下で、「make -j3 kernel」を実行して、カーネル脆弱性を塞ぐ。
- /usr/local/mysql/my.cnf を編集して、HTTPサーバーからデータベースに接続できるようにする。
- MySQL へのインポートが終わって時点で再起動して、新しいカーネルで動作を開始する。
- HTTPサーバーの wp-config.php を再度編集して、データベースサーバーのデータにアクセスできることを確認。(サイトの数だけ)
- HTTPサーバー上で動いていた仮MySQLサーバーを停止。
1/5 の深夜というか 1/6 に入ってデーターベースを元のRPI2に切り替え終了。
データーベースの復旧はこの時点で完了。続いてOSの脆弱性を塞ぐ作業を開始。(バックアップデータベースサーバーは、現時点では復旧できていないため、NFSクライアントCPUを使ったソースビルドは不可能でした。)
/usr/src 下に移動し、
- make -j4 build を実施。(後から考えると -j3 の方がよかった~)
- 1/7 15時頃、ビルドが終了。
- 1/7 深夜に make installworld を実施(インストール時間は約30分)
- OSを再起動して、データーベースサーバーの完全復旧完了。
たまたま使用したUSB HDDがRPI2との相性が良かったためか、RPI2を外付けHDDで使用することは何の苦労も要らないと思っていたのですが、同じRPI2でも別のHDDに切り替えようとしたら SATA HDDを入れたUSB HDDケースではOSは起動中に停止してしまうし、PATA HDDをUSB HDDとして使う場合、FreeBSD/arm を起動するためには loader.conf に遅延を入れるカスタマイズしないと自動起動しないことが判明し、手探り状態でOS復旧することになりました。
まあ、データベースのデータさえ残っていれば、時間が掛かるとしても復旧は可能なので、結局のところ大切なものは細目にバックアップしましょうというのが結論ということになります。
ただし、昨年、HTTPサーバー負荷を減らすために、一緒に動いていたMySQLサーバーを低消費電力コンピュータRaspberry Pi2に分離したわけですが、これ、本当に正しいプラットフォーム選択だったのか?と、疑問に思い始めたところです。Raspberry Pi のマイクロSDスロットに入れたSDメモリは、結構頻繁に壊れるし、USB HDDにも相性問題がある。ファイルシステムがジャーナルだからといって、データ破損に対する耐久性はあまり高くなさそうだと思い直しているところ。