重い腰を上げてようやくMovableType7に上げました。
ついでにOSも最新まで上げたくて、そこから新規で作ったので、かなり手こずりました。
OSをバージョンアップしたことでMySQLも5.7から8に上がったのですが、データがフルバックアップからインポートできず、結局データベース単位でバックアップし直してインポートしたり、Apabheのパッケージで追加するものがわからなかったり。
気になった事をメモしたり、 備忘録だったり、 思いついたまま書き連ねてみたり
重い腰を上げてようやくMovableType7に上げました。
ついでにOSも最新まで上げたくて、そこから新規で作ったので、かなり手こずりました。
OSをバージョンアップしたことでMySQLも5.7から8に上がったのですが、データがフルバックアップからインポートできず、結局データベース単位でバックアップし直してインポートしたり、Apabheのパッケージで追加するものがわからなかったり。
Ubuntu 18.04LTSでDRBD9の分散ストレージを作るメモです。
DRBD(Distributed Replicated Block Device)とは、Linux上でネットワークを介したストレージをリアルタイムにミラーリングするためのソフトウェアです。
何が出来るかと言えば、2台〜4台のコンピュータ間のストレージで完全に同期を取ることが出来ます。
Active/Standbyで動作しているActive側でストレージに書き込みが行われると、ネットワークを介してSlave側のストレージにも書き込みが行われることで、データが同期されるという仕組みです。
また、同期はブロック単位でおこなわれるので、スライス(パーティション)がそっくり同期されます。その為、ファイルシステムに依存しない事も特徴です。(ファイル単位での同期ならrsync使うとか、他にも方法は色々あるけれど)
通常クラスタ構成のシステムでは共有ストレージなど「高価なハードウェア」を使うか、レプリケーションソフトで定期的に同期を行う方式が一般的だと思います。レプリケーションソフトの同期では同期のタイミングによって時間差が生まれてしまうため、同期が取れていないタイミングが発生しますが、DRBDではブロック単位の書き込みをそのままネットワークを介して行いますのでほぼリアルタイムの同期が行えます。
(市販のクラスタソフトウェアでも似たような仕組みを備えている製品があるようだ・・・)
Linuxではクラスタ自体はPacemaker(旧 Heartbeat)で行えますので、複数のコントローラ、複数のパスを備えた高価なストレージを使わずにクラスタのシステムが作れる事になります。とはいえネットワークを介して同期するってことは、ネットワークに相当負荷が掛かるということですので、高パフォーマンスを要求されると厳しい気がします。
仕組み自体は昔からあった(カーネル2.6の頃・・・2009年位?・・・に生まれたらしい)のですが、これまで触ってこなかったので、今更ながらちょっと触ってみましょうという感じです。
先日自宅サーバの障害復旧で面倒な目に遭ってしまったので、色々と見直し。。。
まずサーバのバックアップ
反省。定期的に取りましょう(^^; 少なくともバージョンアップ前には・・・
LVMだったのでスナップショットに頼り切っていて、バックアップを怠っていたので
Acronisでイメージバックアップが取れるようにExt3を使用することに
ということで、スナップショットは便利だけど捨てて、地味に昔ながらのファイルバックアップを行う事に。
結局完全なバックアップは難しいのでファイルへのダンプと、データベースのクラスタを併用することに。
mysqldumpでフルダンプ。テキストファイルに吐き出しておく。
/usr/bin/mysqldump -x -A -u データベースのユーザ --password='パスワード' --opt > /var/db-backup/DB-dump.`/bin/date +'%Y%M%d%k%M'`
gzip /var/db-backup/DB-dump.`/bin/date +'%Y%M%d%k%M'`
とか、そんな感じのシェルスクリプトを作ってcronで定時実行する。
まずマスターサーバ側でネットワークソケットを空けたり、bin-log取ったりと、クラスタ化の準備。こんな感じでMySQLのファイルダンプと、MySQLのレプリケーションを設定した。
/etc/mysql/my.cnfに
[server]
server-id = 1
log-bin
を追記。
データベースに設定を反映させるために再起動する
(Slave)# sudo service mysql restart
レプリケート用にREPLICATION SLAVE権限を与えたユーザを作っておく。mysql(Master)> GRANT REPLICATION SLAVE ON *.* TO repl@10.0.0.2 IDENTIFIED BY 'password';データベースの更新をストップしてmysql(Master)> FLUSH TABLES WITH READ LOCK;バイナリログを確認(スレーブで同期させるときに必要な情報)mysql(Master)> SHOW MASTER STATUS; +-----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-----------------+----------+--------------+------------------+ | dbsv-bin.000001 | 79 | | | +-----------------+----------+--------------+------------------+ 1 row in set (0.00 sec)ファイルが取れたのでデータベースの更新を許可
スレーブ側にコピーする為にデータベースのダンプを取る
(Master)# tar zcf backupfile.tar.gz /var/lib/mysql/
(取ったファイルはスレーブ機にコピーする)mysql(Master)> UNLOCK TABLES;
別のホストでスレーブサーバを立てて、レプリケートを行う。
データベースを停止して
(Slave)# sudo service mysql stop
スレーブの設定を記述する
/etc/mysql/my.cnfに
[server]
server-id = 2
を追記。
データベースに設定を反映させるために再起動する
(Slave)# sudo service mysql restart
マスターで採取したファイルを解凍&展開
(Slave)# cd /
(Slave)# tar zxf backupfile.tar.gz
データベースを動作させて
(Slave)# sudo service mysql start
マスターとの同期情報を設定してmysql(Slave)> CHANGE MASTER TO MASTER_HOST='10.0.0.1', ← マスターのホスト名/IPアドレス同期を開始させる
MASTER_USER='repl', ← マスター接続に使用するユーザー名 MASTER_PASSWORD='password', ← パスワード MASTER_LOG_FILE='dbsv-bin.000001', ← さっきマスターで確認したファイル MASTER_LOG_POS=79; ← さっきマスターで確認した位置
mysql(Slave)> START SLAVE;