読者です 読者をやめる 読者になる 読者になる

双六工場日誌

平凡な日常を淡々と綴ります。

DRBD-MC で適当に MySQL のHAクラスタを作ってみた。

DRBD-MC で適当にクラスタをつくる。

前回の記事でもリンクを貼りましたが、DRBD-MCを使って10分でクラスタを組もう(動画デモ)を参考に適当にHAクラスタを作ってみました。

DRBD-MCはとてもいいですね!

DRBD-MCは、対象サーバにSSHでログインしてコマンドを実行する仕組みになっているのですが、その結果がそのままGUI上に表示され、どのコマンドを実行していて、どのような値が返ってきているのかが見られるようになっています。
そのため、それを追いかけていくと、Pacemakerの基本的なコマンドを一通り実行する様を確認できるので「俺にはGUIなんか必要ない!」とか「GUIなんて飾りです。偉い人にはそれがわからんのですよ。」という人でも、基本動作の勉強用に使えると思います。GUIと言っても動作が隠蔽されていないので清々しいです^^

試してみたところ、動画デモに従ったDRBD-MC上からの操作+αでMySQLのHAクラスタ化ができ、GUI上からフェイルオーバーとクラスタの切り戻しまで確認できました。
その結果がイカ*1です。

矢印はクラスタ上にあるサービスの依存関係を示していて、DRBDのディスクをフェイルオーバーしたあと、/var/lib/mysqlをマウントして、MySQLサービスを起動、という流れになっています。
KVM上のゲストマシンにつくってので、そこで出た問題もありましたが、それは記事の最後に。

動作中には、syslogにログが大量に出力されるので、デモの内容を試してみる際には、対象サーバのsyslogをtailfで流しておくのがおすすめです。
動画の通りに設定していくとクラスタ関連のログはすべてsyslogに書かれます。最初は、yum関連のログとDRBD・Pacemaker関連のログが並んで見えるのが便利ですが、Pacemaker・Heartbeatは非常に多くのログを出力するので、設定が終わったあとは別のところにログを書き出すようにしておくのがいいと思います。

動作させた環境は、KVM上のゲストOSという以外は動画の条件とほぼ同じ。
みんなが大好きなSELinuxは、涙を飲んでDisabledにしました(´;ω;`) それと、iptables も外した状態です。また、KVMホストが1台の上に、VMを2台並べてつくったので、前々回の記事で書いた方法でInterconnect LANをつくっています。

基本的には動画の通りでできたんですが、ひとつだけ、自分の環境では違うところがあって、そこでちょっとはまりました。
違ったのは、Cluster Manager内のStonith Enabledのところ(下の図の中の丸がついているところ)です。Stonith サービスを設定していないのに、ここにチェックが入っていて、そのためのDRBDのサービスを動かすことができませんでした。Stonith設定はまだしていないので、このチェックを外してサービスを起動させました。

また、動画デモにしたがって、DRBD + File Systemのサービスを作りましたが、これをあとでMySQLクラスタのデータディレクトリにするので、File SystemのMount pointは「/var/lib/mysql」にしています。

MySQLの設定

今回はCentOS5.5の標準となっている5.0.77を使いました。まずは、それぞれのノードにMySQLをインストールして、現在DRBD + File Systemのサービスが動いている方のノードで、/etc/my.cnfの設定を行います。設定後、MySQLを起動し問題なく動作することを確認。その後、MySQLを停止し、my.cnfをもう一方のノードにコピー(もう一方のノードではMySQLを起動させないでください)。
MySQLはHeartbeatから起動させるので、OS側での自動起動の設定は行いません。

次に、MySQLのリソースエージェントの設定。yumの標準レポジトリからMySQL5.0,77を入れた場合、リソースエージェントに書かれているパスとインストール先が若干異なるので、イカ*2の通りに設定変更。

/usr/lib/ocf/resource.d/heartbeat/mysql

63: OCF_RESKEY_binary_default="/usr/bin/safe_mysqld"OCF_RESKEY_binary_default="/usr/bin/mysqld_safe"
69: OCF_RESKEY_pid_default="/var/run/mysql/mysqld.pid"OCF_RESKEY_pid_default="/var/run/mysqld/mysqld.pid"

そのほかに設定を行なっている場合は、「/usr/lib/ocf/resource.d/heartbeat/mysql」の63行目からイカ*3のような設定値が並んでいるので、ここを自分の環境に合わせて書き換えてください。

OCF_RESKEY_binary_default="/usr/bin/mysqld_safe"
OCF_RESKEY_config_default="/etc/my.cnf"
OCF_RESKEY_datadir_default="/var/lib/mysql"
OCF_RESKEY_user_default="mysql"
OCF_RESKEY_group_default="mysql"
OCF_RESKEY_log_default="/var/log/mysqld.log"
OCF_RESKEY_pid_default="/var/run/mysqld/mysqld.pid"
OCF_RESKEY_socket_default="/var/lib/mysql/mysql.sock"
OCF_RESKEY_test_user_default="root"
OCF_RESKEY_test_table_default="mysql.user"
OCF_RESKEY_test_passwd_default=""
OCF_RESKEY_enable_creation_default=0
OCF_RESKEY_additional_parameters_default=""

その後、DRBD-MCのクラスターサービス画面からFile Systemを右クリックし、Add New Dependant Service > OCF Resource Agents > mysql と選んでサービスを作成すれば、MySQLのサービス作成は完了です。GUIなので、だいたいのことはフィーリングでなんとかなるはず^^

あと、あくまでここに書いたものは「適当に」つくったものなので、内容については責任を負いかねますので、ご容赦。
MySQLクラスタリングの技術的な詳細は、『Linux-DB システム構築/運用入門(松信 嘉範著)』が個人的にはおすすめです。ほかの本をよく知らないだけということもありますが。。。
Linux-DB システム構築/運用入門 (DB Magazine SELECTION)


virtioディスクとの相性問題?

と、ここまで書いてきましたが、実は最初はこんなに順風満帆だったわけではなくDRBD + virtio問題ではまっていました。

KVMホスト1台の上に、2台のVMをつくってその上にクラスタ環境をつくっていたのですが、前回のブログに載せたエラーが出て、試行錯誤しているうちにファイルシステムを潰してしまいました。
あのエラーは、8.3.9 特有のものらしく、「DRBD virtio」で検索するとDRBDのMLに流れていた情報がひっかかりました。その内容は、

というものです。(書き直すのが面倒なので、自分のつぶやき引用w)

このMLでは、そこは直したということなので8.3.10にバージョンを上げて試したところ、ここは治っていたのですが、ペアのうち、一方のメタデータがうまく書けていないようで、イカ*4のようなエラーがでました。

OSは、CentOS5.5を最小構成+開発ツール・開発ライブラリでインストールして、ネットワーク関連の設定のみを終えた状態です。

この記事で紹介した成功したパターンは、DRBDのバージョンが8.3.9で、KVMゲストが使用する仮想ディスクをSCSIエミュレーション(デバイスファイルが/dev/sdXなどになる)で試したパターン。virtioはまだ新しいデバイスなので、そのあたりの相性の問題なのかなーと予想してますが、現時点では詳細不明です。。。

*1:誤植ではありません。

*2:ここも誤植ではありません。

*3:やはり誤植ではありません。

*4:しつこいですが誤植ではありません