how-to create a high-availability mysql setup with corosync pacemaker and drbd on ubuntu
前言
穴はどこにもない.各コンポーネントに対しては,みな仁者見仁智者見智である.
各コンポーネントの動作原理の適用シーンは一つ一つ述べていない.......引き続き……環境準備Corosyncインストールと構成Pacemakerインストールと構成DRBDインストールと構成MySQLインストールと構成Crmリソース管理
システム構造
環境準備
ssh相互信頼
SelinuxUbuntuはデフォルトでインストールされていません.sudo service iptables stopをスキップします.
Corosyncのインストールと構成
プロファイルの変更と認証ファイルの生成
ファイルをcaliノードに同期
認証ファイル
認証ファイルもcaliホストにコピー
サービスを開始
Pacemakerインストール構成
クラスタ内のノード情報の表示
DRBD取付と配置
新しいディスクパーティションの作成
drbdのインストールとプロファイルの変更
ubuntu14.4.04 kernelでコンパイルされたdrbd moduleバージョンは8.4.5ですが、公式trustyで提供されているdrbd 8-utilsのバージョンは8.4.4までで、手動でコンパイルするしかありません.詳細はhttp://suzf.net/thread-0628-918.html
DRBDには,プロトコルA:非同期レプリケーションプロトコルの3パターンがある.ローカル書き込みに成功するとすぐに戻り、送信bufferにデータが置かれ、失われる可能性があります.プロトコルB:メモリ同期(半同期)コピープロトコル.ローカル書き込みに成功し、データを相手に送信した後、すぐに戻ります.デュアルマシンがダウンすると、データが失われる可能性があります.プロトコルC:レプリケーションプロトコルを同期する.ローカルと相手が成功確認を書いて戻ってきます.デュアルマシンの電源が切れたり、ディスクが破損したりすると、データが失われる可能性があります.使用する場合、一般的にプロトコルCを使用します.プロトコルCは,ローカルと相手が書き込みに成功した場合に書き込みに成功したと考えるため,一定の遅延がある.
drbdプロファイルの変更
brbdプロファイルをcaliノードに同期
drbdのリソースを初期化し、drbdを起動してリソースを作成する前にパーティションフォーマットは必要ありません.フォーマットされている場合は、次の操作を行います.
DRBDリソースの作成
Caliノード操作
パーティションのフォーマット
Mysqlのインストールと構成
Mysqlをインストールしてデータディレクトリを変更
いずれかのnodeでデータを初期化
エヴァに測定データベースを作成する
mysqlサービスを停止しdrbdマウントディレクトリをアンインストール
Caliにマウントし、データが同期していることを確認
データが同期されているかどうかを確認
ここで、第1の動作DRBDのバージョン情報、第2の動作DRBDの開発は、ソースコードが最後にコミットされた時点である.3行目はDRBDのステータス情報です.cs:connection status接続ステータスro:roleロール、ネイティブロール/リモートホストロール(注:旧バージョンDRBDはst)ds:data statusデータ同期ステータス、ネイティブステータス/リモートホストステータス(例ではホストが設定されていないため、両方のステータスにIncosistentが表示されます)Cで使用される同期プロトコル
Crmリソース管理はクラスタリソースを定義する必要があり、mysql、drbdはクラスタのリソースであり、クラスタ管理のリソースから起動することは必ずしも自分で起動できない.
mysqlのサービスを閉じてdrbdパーティションとdrbdのサービスをアンインストールし、mysqlの起動禁止を設定します.
現在の構成をオンラインで表示
検証#ケンショウ#
最初のリソースはすべてevaというノードに表示されます
エヴァノードがstandbyに設定されている場合、リソースがcaliノードにすべて移行していることがわかります.
~~~ END made in suzf.net ~~~
License:Attribution-NonCommercial-ShareAlike 4.0 International本稿はSuzf Blogから出ている.未記載の場合、いずれもSUZFである.NETオリジナル.転載は以下のことを明記してください.http://suzf.net/thread-0630-927.html
drbd, Mysql
穴はどこにもない.各コンポーネントに対しては,みな仁者見仁智者見智である.
各コンポーネントの動作原理の適用シーンは一つ一つ述べていない.......引き続き……環境準備Corosyncインストールと構成Pacemakerインストールと構成DRBDインストールと構成MySQLインストールと構成Crmリソース管理
システム構造
環境準備
$cat /etc/issue
Ubuntu 14.04.4 LTS
\l
$uname -r
4.2.0-27-generic
[Both]
$grep '10\|20' /etc/hosts
172.16.9.10 eva.suzf.net eva
172.16.9.20 cali.suzf.net cali
ssh相互信頼
eva
ssh-keygen -t rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub cali
cali
ssh-keygen -t rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub eva
SelinuxUbuntuはデフォルトでインストールされていません.sudo service iptables stopをスキップします.
Corosyncのインストールと構成
[Both]
sudo apt-get update
sudo apt-get install corosync -y
プロファイルの変更と認証ファイルの生成
$grep -v "^.*#\|^$" /etc/corosync/corosync.conf
totem {
version: 2
token: 3000
token_retransmits_before_loss_const: 10
join: 60
consensus: 3600
vsftype: none
max_messages: 20
clear_node_high_bit: yes
secauth: off
threads: 0
rrp_mode: none
interface {
member{
memberaddr: 172.16.9.10
}
member{
memberaddr: 172.16.9.20
}
ringnumber: 0
bindnetaddr: 172.16.9.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
}
amf {
mode: disabled
}
quorum {
provider: corosync_votequorum
expected_votes: 1
}
aisexec {
user: root
group: root
}
logging {
fileline: off
to_stderr: yes
to_logfile: no
to_syslog: yes
syslog_facility: daemon
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
tags: enter|leave|trace1|trace2|trace3|trace4|trace6
}
}
ファイルをcaliノードに同期
rsync -av corosync.conf cali:/etc/corosync/
認証ファイル
corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy (bits = 152).
# , , ,
認証ファイルもcaliホストにコピー
rsync -av authkey cali:/etc/corosync/
サービスを開始
cat /etc/default/corosync
# start corosync at boot [yes|no]
START=yes
[both]
sudo service corosync start
Pacemakerインストール構成
[Both]
sudo apt-get-install pacemaker -y
sudo service pacemaker start
クラスタ内のノード情報の表示
$sudo crm status
Last updated: Wed Jun 29 14:35:21 2016
Last change: Mon Jun 27 16:18:55 2016 via crmd on eva
Stack: corosync
Current DC: cali (739248404) - partition with quorum
Version: 1.1.10-42f2063
2 Nodes configured
0 Resources configured
Online: [ cali eva ]
DRBD取付と配置
新しいディスクパーティションの作成
[Only on node]
@eva ~]$sudo fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x56c8d4fc.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-81788927, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-81788927, default 81788927):
Using default value 81788927
Command (m for help): p
Disk /dev/sdb: 41.9 GB, 41875931136 bytes
255 heads, 63 sectors/track, 5091 cylinders, total 81788928 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x56c8d4fc
Device Boot Start End Blocks Id System
/dev/sdb1 2048 81788927 40893440 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
sudo pvcreate /dev/sdb1
sudo vgcreate vol2 /dev/sdb1
sudo lvcreate -L 3G -n mysql-drbd vol2
# sudo mkfs.ext4 /dev/vol2/mysql-drbd #
drbdのインストールとプロファイルの変更
[both]
sudo apt-get install drbd8-utils -y
ubuntu14.4.04 kernelでコンパイルされたdrbd moduleバージョンは8.4.5ですが、公式trustyで提供されているdrbd 8-utilsのバージョンは8.4.4までで、手動でコンパイルするしかありません.詳細はhttp://suzf.net/thread-0628-918.html
DRBDには,プロトコルA:非同期レプリケーションプロトコルの3パターンがある.ローカル書き込みに成功するとすぐに戻り、送信bufferにデータが置かれ、失われる可能性があります.プロトコルB:メモリ同期(半同期)コピープロトコル.ローカル書き込みに成功し、データを相手に送信した後、すぐに戻ります.デュアルマシンがダウンすると、データが失われる可能性があります.プロトコルC:レプリケーションプロトコルを同期する.ローカルと相手が成功確認を書いて戻ってきます.デュアルマシンの電源が切れたり、ディスクが破損したりすると、データが失われる可能性があります.使用する場合、一般的にプロトコルCを使用します.プロトコルCは,ローカルと相手が書き込みに成功した場合に書き込みに成功したと考えるため,一定の遅延がある.
drbdプロファイルの変更
@eva ~]$uname -n
eva
$pwd
/etc/drbd.d
$cat global_common.conf
global {
usage-count no;
}
common {
protocol C;
startup {
wfc-timeout 10;
degr-wfc-timeout 1;
outdated-wfc-timeout 1;
}
}
$cat mysql-drbd.res
resource mysql-drbd {
protocol C;
device /dev/drbd0;
disk /dev/vol2/mysql-drbd;
meta-disk internal;
net {
cram-hmac-alg sha1;
shared-secret "mysql-drbd";
#allow-two-primaries;
}
syncer {
verify-alg crc32c;
rate 1000M;
}
on eva {
address 172.16.9.10:7789;
}
on cali {
address 172.16.9.20:7789;
}
}
brbdプロファイルをcaliノードに同期
rsync -av ./* cali:/etc/drbd.d/
drbdのリソースを初期化し、drbdを起動してリソースを作成する前にパーティションフォーマットは必要ありません.フォーマットされている場合は、次の操作を行います.
dd if=/dev/zero of=/dev/vol2/mysql-drbd bs=1M count=1
DRBDリソースの作成
@eva ~]$sudo drbdadm create-md mysql-drbd
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
@eva ~]$sudo service drbd start
* Starting DRBD resources [
create res: mysql-drbd
prepare disk: mysql-drbd
adjust disk: mysql-drbd
adjust net: mysql-drbd
]
[ OK ]
Caliノード操作
sudo drbdadm create-md mysql-drbd
sudo service drbd start
パーティションのフォーマット
@eva ~]$sudo drbdadm primary --force mysql-drbd
@eva ~]$sudo cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 5A4F43804B37BB28FCB1F47
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate B r-----
ns:0 nr:0 dw:0 dr:728 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:3145596
@eva ~]$sudo mke2fs -t ext4 /dev/drbd0
mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
196608 inodes, 786399 blocks
39319 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=805306368
24 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
@eva ~]$sudo mkdir -p /data/mysql-drbd/
@eva ~]$sudo chown -R mysql /data/mysql-drbd/
@eva ~]$sudo chgrp -R mysql /data/mysql-drbd/
@eva ~]$sudo chmod -R 755 /data/mysql-drbd/
Mysqlのインストールと構成
Mysqlをインストールしてデータディレクトリを変更
[Both]
sudo apt-get install mysql-server -y
#vim /etc/my.cnf
datadir = /data/mysql-drbd
# grep data -B 2 /etc/apparmor.d/usr.sbin.mysqld
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/data/mysql-drbd/ r,
/data/mysql-drbd/** rwk,
sudo service apparmor restart
いずれかのnodeでデータを初期化
@eva ~]$sudo mysql_install_db --user=mysql --datadir=/data/mysql-drbd/
@eva ~]$sudo service mysql start
エヴァに測定データベースを作成する
mysql> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| eva |
| #mysql50#lost+found |
| mysql |
| performance_schema |
+---------------------+
5 rows in set (0.00 sec)
mysql> system hostname
eva
mysqlサービスを停止しdrbdマウントディレクトリをアンインストール
# Eva
sudo service mysql stop
sudo umount /dev/drbd0
sudo drbdadm secondary mysql-drbd # drbd
Caliにマウントし、データが同期していることを確認
# Cali
sudo drbdadm primary mysql-drbd # drbd
sudo chown -p /data/mysql-drbd/
sudo chown -R mysql /data/mysql-drbd/
sudo chgrp -R mysql /data/mysql-drbd/
sudo chmod -R 755 /data/mysql-drbd/
sudo mount /dev/drbd0 /data/mysql-drbd
sudo service mysql start # ,
データが同期されているかどうかを確認
@cali ~]$sudo mysql -e "show databases;"
+---------------------+
| Database |
+---------------------+
| information_schema |
| eva |
| #mysql50#lost+found |
| mysql |
| performance_schema |
+---------------------+
@eva ~]$sudo cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 5A4F43804B37BB28FCB1F47
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate B r-----
ns:159000 nr:2400 dw:161400 dr:8738 al:38 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
@cali ~]$sudo cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 5A4F43804B37BB28FCB1F47
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate B r-----
ns:2388 nr:159000 dw:161388 dr:7602 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
@cali ~]$sudo service drbd status
drbd driver loaded OK; device status:
version: 8.4.5 (api:1/proto:86-101)
srcversion: 5A4F43804B37BB28FCB1F47
m:res cs ro ds p mounted fstype
0:mysql-drbd Connected Primary/Secondary UpToDate/UpToDate B /data/mysql-drbd ext4
ここで、第1の動作DRBDのバージョン情報、第2の動作DRBDの開発は、ソースコードが最後にコミットされた時点である.3行目はDRBDのステータス情報です.cs:connection status接続ステータスro:roleロール、ネイティブロール/リモートホストロール(注:旧バージョンDRBDはst)ds:data statusデータ同期ステータス、ネイティブステータス/リモートホストステータス(例ではホストが設定されていないため、両方のステータスにIncosistentが表示されます)Cで使用される同期プロトコル
Crmリソース管理はクラスタリソースを定義する必要があり、mysql、drbdはクラスタのリソースであり、クラスタ管理のリソースから起動することは必ずしも自分で起動できない.
mysqlのサービスを閉じてdrbdパーティションとdrbdのサービスをアンインストールし、mysqlの起動禁止を設定します.
=== CRM CMD START ===
# verify
# commit
sudo crm configure
# drbd ( drbd RA OCF linbit )
property stonith-enabled=false
property no-quorum-policy=ignore
primitive p_mysql_drbd ocf:linbit:drbd params drbd_resource=mysql-drbd op monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20 op start timeout=240 op stop timeout=100
# drbd
ms m_mysql_drbd p_mysql_drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
#
primitive p_fs_mysql_data ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/data/mysql-drbd" fstype="ext4" op monitor interval=40 timeout=40 op start timeout=60 op stop timeout=60
colocation c_mysql_drbd inf: p_fs_mysql_data m_mysql_drbd:Master
order o_mysql_drbd mandatory: m_mysql_drbd:promote p_fs_mysql_data:start
# vip 、mysql
primitive p_mysql_vip ocf:heartbeat:IPaddr2 \
params ip="172.16.9.33" cidr_netmask="24" \
op monitor interval="30s"
primitive p_mysqld ocf:heartbeat:mysql \
params binary="/usr/sbin/mysqld" config="/etc/mysql/my.cnf" datadir="/data/mysql-drbd" \
pid="/var/run/mysqld/mysqld.pid" socket="/var/run/mysqld/mysqld.sock" log="/var/log/mysql/error.log" \
op start interval="0" timeout="120" \
op stop interval="0" timeout="120" \
op monitor interval="10" timeout="30" depth="0"
colocation c_mysql_with_data inf: p_mysqld p_fs_mysql_data
order o_drbd_before_mysql mandatory: p_fs_mysql_data:start p_mysqld:start
colocation p_mysql_vip_with_mysql inf: p_mysql_vip p_mysqld
order o_mysql_vip_before_mysql mandatory: p_mysql_vip p_mysqld
commit
=== CRM CMD END ===
現在の構成をオンラインで表示
crm(live)configure# show
node $id="739248394" eva \
attributes standby="off" maintenance="off"
node $id="739248404" cali \
attributes standby="off" maintenance="off"
primitive p_fs_mysql_data ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/data/mysql-drbd" fstype="ext4" \
op monitor interval="40" timeout="40" \
op start timeout="60" interval="0" \
op stop timeout="60" interval="0"
primitive p_mysql_drbd ocf:linbit:drbd \
params drbd_resource="mysql-drbd" \
op monitor role="Master" interval="10" timeout="20" \
op monitor role="Slave" interval="20" timeout="20" \
op start timeout="240" interval="0" \
op stop timeout="100" interval="0"
primitive p_mysql_vip ocf:heartbeat:IPaddr2 \
params ip="172.16.9.33" cidr_netmask="24" \
op monitor interval="30s"
primitive p_mysqld ocf:heartbeat:mysql \
params binary="/usr/sbin/mysqld" config="/etc/mysql/my.cnf" datadir="/data/mysql-drbd" pid="/var/run/mysqld/mysqld.pid" socket="/var/run/mysqld/mysqld.sock" log="/var/log/mysql/error.log" \
op start interval="0" timeout="120" \
op stop interval="0" timeout="120" \
op monitor interval="10" timeout="30" depth="0"
ms m_mysql_drbd p_mysql_drbd \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
location cli-prefer-p_mysql_vip p_mysql_vip inf: eva
colocation c_mysql_drbd inf: p_fs_mysql_data m_mysql_drbd:Master
colocation c_mysql_with_data inf: p_mysqld p_fs_mysql_data
colocation p_mysql_vip_with_mysql inf: p_mysql_vip p_mysqld
order o_drbd_before_mysql inf: p_fs_mysql_data:start p_mysqld:start
order o_mysql_drbd inf: m_mysql_drbd:promote p_fs_mysql_data:start
order o_mysql_vip_before_mysql inf: p_mysql_vip p_mysqld
property $id="cib-bootstrap-options" \
stonith-enabled="false" \
no-quorum-policy="ignore" \
dc-version="1.1.10-42f2063" \
cluster-infrastructure="corosync"
検証#ケンショウ#
最初のリソースはすべてevaというノードに表示されます
エヴァノードがstandbyに設定されている場合、リソースがcaliノードにすべて移行していることがわかります.
~~~ END made in suzf.net ~~~
License:Attribution-NonCommercial-ShareAlike 4.0 International本稿はSuzf Blogから出ている.未記載の場合、いずれもSUZFである.NETオリジナル.転載は以下のことを明記してください.http://suzf.net/thread-0630-927.html
drbd, Mysql