Ubuntu 18.04LTSでDRBD9の分散ストレージを作るメモです。
DRBD(Distributed Replicated Block Device)とは、Linux上でネットワークを介したストレージをリアルタイムにミラーリングするためのソフトウェアです。
何が出来るかと言えば、2台〜4台のコンピュータ間のストレージで完全に同期を取ることが出来ます。
Active/Standbyで動作しているActive側でストレージに書き込みが行われると、ネットワークを介してSlave側のストレージにも書き込みが行われることで、データが同期されるという仕組みです。
また、同期はブロック単位でおこなわれるので、スライス(パーティション)がそっくり同期されます。その為、ファイルシステムに依存しない事も特徴です。(ファイル単位での同期ならrsync使うとか、他にも方法は色々あるけれど)
通常クラスタ構成のシステムでは共有ストレージなど「高価なハードウェア」を使うか、レプリケーションソフトで定期的に同期を行う方式が一般的だと思います。レプリケーションソフトの同期では同期のタイミングによって時間差が生まれてしまうため、同期が取れていないタイミングが発生しますが、DRBDではブロック単位の書き込みをそのままネットワークを介して行いますのでほぼリアルタイムの同期が行えます。
(市販のクラスタソフトウェアでも似たような仕組みを備えている製品があるようだ・・・)
Linuxではクラスタ自体はPacemaker(旧 Heartbeat)で行えますので、複数のコントローラ、複数のパスを備えた高価なストレージを使わずにクラスタのシステムが作れる事になります。とはいえネットワークを介して同期するってことは、ネットワークに相当負荷が掛かるということですので、高パフォーマンスを要求されると厳しい気がします。
仕組み自体は昔からあった(カーネル2.6の頃・・・2009年位?・・・に生まれたらしい)のですが、これまで触ってこなかったので、今更ながらちょっと触ってみましょうという感じです。
前に書き漏れていた項目
ロケール設定
日本語表示にする
$ sudo localectl list-locales
$ sudo apt-get install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
タイムゾーン設定
JSTにする
$ sudo timedatectl list-timezones
$ sudo timedatectl set-timezone Asia/Tokyo
systemd-timesyncdサービスの停止
ntpdが動かなくなるので止める。
$ sudo systemctl stop systemd-timesyncd.service
$ sudo systemctl disable systemd-timesyncd.service
IPv6をDisableする
/etc/sysctl.confに以下の設定を追加する
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
NICのデバイス名を伝統的な名前に戻す(ens160 → eth0)
ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
ほぼこれだけではダメなので
/etc/default/grubに以下の設定を行う
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
GRUBを書き換える
sudo grub-mkconfig -o /boot/grub/grub.cfg
やっと動きました。。。
MovableTypeが動かなくて、かなり手こずりました。
事の発端はUbuntu Serverを12.04LTSから14.04LTSにアップグレードしたことですが。
Apacheが2.4に上がってたり、
Perlが5.18に上がってたり、
PHPが5.5に上がってたりして、
MovableType5が動かなくなってしまいました。
はい。
仕方無いのでMovableTypeを6に上げて、
Apache直して、MovableTypeのphp/extlib/smarty/libs/Smarty_Compiler.class.phpも
/* replace special blocks by "{php}" */ /* 修正後 */ $source_content = preg_replace_callback($search, create_function ('$matches', "return '" . $this->_quote_replace($this->left_delimiter) . 'php' . "' . str_repeat(\"\n\", substr_count('\$matches[1]', \"\n\")) .'" . $this->_quote_replace($this->right_delimiter) . "';") , $source_content);
/* 修正前
$source_content = preg_replace($search.'e', "'"
. $this->_quote_replace($this->left_delimiter) . 'php'
. "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
. $this->_quote_replace($this->right_delimiter)
. "'"
, $source_content);
*/
という感じで直して、、、やっと動いたところです。
MovableTypeはバージョンアップする度に全てのテンプレートを一度リセットしないと、どこかに綻びが出てしまうのが悩ましいところですね。いっそのこと全部データベースに持ってくれて、アップデートしても影響無いようになっていると嬉しいのですが。
# まだまだ、あっちこっち死んでる気がするけど。
これまで(UbuntuでProxyサーバロードバランス(1)、UbuntuでProxyサーバロードバランス(2))構築したとおり、Ubuntu Server 12.04LTSを使ってロードバランサーを構築し、Proxyサーバの負荷分散、障害検知と自動での切り離し、組み込みを動作させるところまで構築しました。
残った問題である、ロードバランサーがダウンしたときに結局システムが止まってしまうという問題に対処するため、ロードバランサーをクラスタ構成してみようと思います。
クラスタ構成と言っても色々ありますが、今回はkeepalivedのVRRPをそのまま使ってロードバランサーをActive / Standby型のクラスタにしてしまいます。
単純にロードバランサー2を追加します。そしてProxyサーバの仮想IPアドレス(192.168.100.10)をVRRPによるフローティングアドレスにしてしまいます。