2017年2月16日木曜日

CLVMに挑戦(その1)

というわけで、CLVM(Clustered Logical Volume Manager)に挑戦だ。

クラスタ環境で、ボリュームマネージャにLVMを用いるのなら、CLVMを使用するのがほぼ必須。
今までは使わずに済ませてたけど、流石に避けて通るわけにはいかない。

というわけで、とりあえずインストールしてみる。
(gemini) $ sudo apt-get update
(gemini) $ apt-cache search clvm
(gemini) $ sudo apt-get --simulate install clvm
(gemini) $ sudo apt-get install clvm

インストールしたら、どんなファイルが導入されたか確認してみよう。
(gemini) $ dpkg -L clvm
う~ん。ちょっと良くわからないな。

ただ、systemd用のサービスユニットは導入されたので、ちょっと確認を。
(gemini) $ systemctl status clvm
おや、inactiveだ。

だったらスタートしてみるか。
(gemini) $ systemctl is-active clvm
(gemini) $ systemctl is-enabled clvm
(gemini) $ sudo systemctl start clvm
(gemini) $ systemctl status clvm
起動は成功したっぽいな。

さて、設定をいじる前に、マニュアルエントリを読んでおくか。
(gemini) $ man clvmd
…ヨクワカラン…

色々ググってみると、単にVGにクラスタマークを付ける(vgchange -c y)だけでいいとか何とか…。
だったらまず、clvm未導入なcancerの方で実施してみるか。
(cancer) $ sudo vgchange -c y vg-ocfs2
LVM cluster daemon (clvmd) is not running. Make volume group "vg-ocfs2" clustered anyway? [y/n]:
ほう。clvmdが稼働していないよ、と警告が出るのね。
とりあえずnで抜けてしまおう。

んじゃぁ、先程clvmを導入し起動させたgeminiの方ではどうだろう?
(gemini) $ sudo vgchange -c y vg-ocfs2
LVM cluster daemon (clvmd) is not running. Make volume group "vg-ocfs2" clustered anyway? [y/n]:
…あれ?
(gemini) $ ps -ef | grep clvmd
確かに上がってきてない…起動できてなかったか?

(gemini) $ systemctl status clvm
よく見てみたら「 * clvmd: cluster not configured. Aborting.」って出てるぢゃん。
設定を施してないから、起動できてないよってことか。

じゃぁ何を設定すれば…?

なんか、clvmに関するコマンドが幾つかあることが分かった。
1つはlvmconfig、もう1つはlvmconf。似たような名前だ…。
前者はlvmの設定を変更するコマンド、後者はlvmの設定情報を確認するコマンドのようだ。

って、lvmの設定情報って、/etc/lvm/lvm.confじゃないのかな?
ちょっと叩いてみよう。
(gemini) $ sudo lvmconfig
なんか、設定情報がズラズラと出てきたぞ。

ちょっとファイルに出してみよう。普通にリダイレクトしてもいいんだろうけど、なんかファイルに出力するオプションもあるぞ。
(gemini) $ sudo lvmconfig -f lvmconfig.out
(gemini) $ sudo chmod 666 lvmconfig.out
(gemini) $ cat lvmconfig.out

これ、既存の /etc/lvm/lvm.conf との差は何だろう?
(gemini) $ grep -v '^\s*#' /etc/lvm/lvm.conf | grep -v '^\s*$' > lvmconfig.current
(gemini) $ diff -w -c lvmconfig.current lvmconfig.out
って単純diffじゃ差異が激しすぎる…。

というわけで、テキストファイルを手で差分取ってみた。
結果、ほとんど同じだった。
明確な違いは…
/etc/lvm/lvm.conf
global {
umask = 077
}
lvmconfigの出力
global {
umask=63
}
だけだった。
って、8進数077って、10進数で63だな。ってことは表記の違いだけで、中身は同じか。

ってことは、起動時に/etc/lvm/lvm.confが読み込まれて、その設定をメモリ中にキャッシュしていて、それをlvmconfigコマンドで出力するってことか。

対してlvmconfは設定を変更するコマンド。
これはオンラインでも(システム稼働中でも)変更可能なのかな?
もしそうなら、
  • 稼働中に変更するのならlvmconfコマンド
  • 変更結果が問題なければ、lvmconfigコマンドで/etc/lvm/lvm.confへ出力
  • 次回再起動時は/etc/lvm/lvm.confが読み込まれるので、変更結果が反映される
ということだろうか。

対してlvmconfコマンド。
これのman( man lvmconf )を見ると、いきなり「--enable-cluster」というオプションが出て来る。
これじゃないか?
さっそくやってみよう。
(gemini) $ sudo lvmconf --enable-cluster
あっさり実行できた。
設定の差異はどうなったかな?
(gemini) $ sudo lvmconfig -f lvmconfig.out2
(gemini) $ sudo chmod 666 lvmconfig.out2
(gemini) $ diff lvmconfig.out lvmconfig.out2
出た出た。
global {} の中の
locking_typeが1から3に変化。
use_lvmetadが1から0に変化。

実はずっと、この2つのパラメータをいじる必要がある、と考えていたんだ。
狙ったとおりだ。

実はこの後、色々悩んで再起動等を行っていたので、いつ変化したのか分からないんだけど、/etc/lvm/lvm.confが書き換わっていた。
変更内容は、lvmconfig --type diff で出力されたのと同じだ。
もしかしたら、lvmconfで/etc/lvm/lvm.confも書き換わるのかもしれない。
後ほど、cancer側も同様に変更するので、その時に確認してみたい。

さて、これでvgにクラスタマークは付けられるのかな?
(gemini) $ sudo vgchange -c y vg-ocfs2
あれ?やっぱりワーニングが出た。
あ~もしかしたら、設定変更後に反映処理が必要なのかも。

(gemini) $ sudo lvmconfig --type diff
あ、やっぱりそうだ。
「現在の設定内容と、新しい設定内容」の差が出た。
と思ったけど、diffオプションは「デフォルト値と現在の設定値の差」だ。ってことは反映済みか?
うん?上述のlocking_typeとuse_lvmetadの他に、devices{}のcache_dirとissue_discardsが出てきたな。

lvmconfのマニュアルに、「--services」というオプションと「--startstopservices」というオプションが載っている。
イマイチ違いが分からないけど、クラスタ関連の設定を施した場合は、多分「--startstopservices」の方じゃないかな?
試しに、「--services」の方を実行してみる。
(gemini) $ sudo lvmconf --services
む?使い方が違う…。
(gemini) $ sudo lvmconf --startstopservices
こっちは、--servicesと一緒じゃないとアカンよ、ということらしい。
(gemini) $ sudo lvmconf --services --startstopservices
やっぱりアカンやん…。

じゃぁこうかな?
(gemini) $ sudo lvmconf --enable-cluster --services
出来た…のか?
いや、まだのようだ。
となるとこうか?
(gemini) $ sudo lvmconf --enable-cluster --services --startstopservices
むぅ。なんかエラーになった。

(gemini) $ systemctl status lvm2-clvmd.service
やっぱりコケてるな。
何かが足りないんやな…。

ちょっとマテよ…。lvm2-clvmd.serviceの他に、clvm.serviceというユニットもあるぞ?
(gemini) $ systemctl | grep clvm
これ、systemd-sysv-generatorによって作成されたユニット…ってことは、/etc/init.dの下にあるのか。
ちょいと見てみよう。
(gemini) $ cat /etc/init.d/clvm
これを見てみると、/etc/cluster/cluster.confファイルが無いと何もせずに終了している。
が…そのファイルを使っていない…?

う~む。これ、pacemakerとかで使うファイルじゃないのか?
ヨクワカランので、空ファイルを作ってみよう。
(gemini) $ ls -ld /etc/cluster
(gemini) $ sudo mkdir /etc/cluster
(gemini) $ ls -ld /etc/cluster
(gemini) $ sudo touch /etc/cluster/cluster.conf
(gemini) $ ls -l /etc/cluster

これで試してみる…。
(gemini) $ sudo systemctl start clvm.service
(gemini) $ systemctl status clvm.service
う~ん。これでいいのかなぁ?
clvmはエラーは無くなった。(active (exited)というステータスなので、正しい状態には思えないが…)

(gemini) $ sudo systemctl start lvm2-clvmd.service
エラーメッセージをよく見てみたら「unit lvm2-clvmd.service may be requested by dependency only」とのこと。
これってもしかして、依存関係のあるunitからの起動しか受け付けてない?

(gemini) $ sudo systemctl start lvm2-cluster-activation.service
こちらのエラーメッセージを見てみたら…「A dependency job for lvm2-cluster-activation.service failed.」って。へ?依存関係がおかしい?

というわけでファイルを見てみる…。
(gemini) $ cat /lib/systemd/system/lvm2-cluster-activation.service
う~ん。「After」宣言に「lvm2-cmirrord.service」が入っているな…。
まさか、このサービスが必要なのか?

でもインストールされてない…。

探してみたけど、lvm2-cmirrord.serviceに相当するパッケージはUbuntu16.04には存在していないようだ。
あまり考えたくは無いけど、もしかしたらパッケージングのミスかもしれない。

更に、/lib/systemd/system/lvm2-clvmd.service、/lib/systemd/system/lvm2-cluster-activation.serviceのいずれにも、${prefix}/etc/sysconfig/clvmdという環境定義ファイルの指定があるが…どこにもそんなファイルは無い。

それらしいファイルを持ったパッケージも見つからず。

他にも、lvm2-clvmd.serviceの方は、/sbin/clvmdというのを呼び出す設定になっているけど、そのようなファイルは実際には無く、/usr/sbin/clvmdが多分正しいんじゃないかな?

こうまでくると、なんとなくパッケージングミスだと思う。
Ubuntu Japaneseにでも報告しておいた方がいいな…。

それはさておき、とりあえずやっつけでclvmdが動くようにする。

(gemini) $ cd /lib/systemd/system
まずは2つの.servicesファイルのバックアップ
(gemini) $ sudo cp -pi lvm2-cluster-activation.service \
lvm2-cluster-activation.service.orig
(gemini) $ sudo cp -pi lvm2-clvmd.service \
lvm2-clvmd.service.orig
一つずつ修正。
(gemini) $ sudo vi lvm2-cluster-activation.service
--ココから
After=lvm2-clvmd.service lvm2-cmirrord.service
↓(コメント化して、lvm2-cmirrord.serviceを削除した行を作成)
#After=lvm2-clvmd.service lvm2-cmirrord.service
After=lvm2-clvmd.service

EnvironmentFile=-${prefix}/etc/sysconfig/clvmd
↓(コメント化)
#EnvironmentFile=-${prefix}/etc/sysconfig/clvmd
--ココまで

(gemini) $ sudo diff lvm2-cluster-activation.service.orig \
lvm2-cluster-activation.service
--出力結果
4c4,5
< After=lvm2-clvmd.service lvm2-cmirrord.service
---
> #After=lvm2-clvmd.service lvm2-cmirrord.service
> After=lvm2-clvmd.service
12c13
< EnvironmentFile=-${prefix}/etc/sysconfig/clvmd
---
> #EnvironmentFile=-${prefix}/etc/sysconfig/clvmd
--出力結果ココまで

(gemini) $ sudo vi lvm2-clvmd.service
--ココから
EnvironmentFile=-${prefix}/etc/sysconfig/clvmd
↓(コメント化)
#EnvironmentFile=-${prefix}/etc/sysconfig/clvmd

ExecStart=/sbin/clvmd $CLVMD_OPTS
↓(この行はコメントにし、パスを/usr/sbin/clvmdにした行を作成
#ExecStart=/sbin/clvmd $CLVMD_OPTS
ExecStart=/usr/sbin/clvmd $CLVMD_OPTS
--ココまで
(gemini) $ sudo diff lvm2-clvmd.service.orig \
lvm2-clvmd.service
--出力ココから
16,17c16,18
< EnvironmentFile=-${prefix}/etc/sysconfig/clvmd
< ExecStart=/sbin/clvmd $CLVMD_OPTS
---
> #EnvironmentFile=-${prefix}/etc/sysconfig/clvmd
> #ExecStart=/sbin/clvmd $CLVMD_OPTS
> ExecStart=/usr/sbin/clvmd $CLVMD_OPTS
--出力ココまで

サービス定義読み直し
(gemini) $ sudo systemctl daemon-reload

起動してみる
(gemini) $ sudo systemctl start lvm2-cluster-activation.service
(gemini) $ systemctl status lvm2-cluster-activation.service
(gemini) $ systemctl status lvm2-clvmd.service
どうやら無事に起動したっぽい。

今度こそ、クラスタマークを付けてみる。
(gemini) $ sudo vgchange -c y vg-ocfs2
成功した。
(gemini) $ sudo vgdisplay vg-ocfs2
「Clusterd yes」という文字が見える。

多分、これで大丈夫じゃないかな?
今度は、これまで実施してきた内容を、対向のcancer側にも施して、CLVMが機能するかどうか試してみる。

0 件のコメント:

コメントを投稿