共計 9116 個字符,預計需要花費 23 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 Heartbeat+DRBD 如何實現 MySQL 高可用性,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
DRBD 是一種塊設備,可以被用于高可用 (HA) 之中。它類似于一個網絡 RAID- 1 功能。當你將數據寫入本地文件系統時,數據還將會被發送到網絡中另一臺主機上。以相同的形式記錄在一個文件系統中。本地 (主節點) 與遠程主機 (備節點) 的數據可以保證實時同步。當本地系統出現故障時,遠程主機上還會保留有一份相同的數據,可以繼續使用。
1.3 環境準備
兩臺主機:192.168.100.8,192.168.100.9
需要為本地主機和遠程主機,指定一個 DRBD 使用的硬盤分區。這兩個分區的大小必須相同。我們指定兩臺主機的 /dev/sda2 分區作為 DRBD 的使用的分區. 這兩個分區大小都為 37G.
1.4 DRBD 的安裝配置
1、首先從 www.drbd.org 下載了源代碼包(我下載的 drbd-8.3.6 版本的包)
2、檢查主機上面有沒有 linux 的內核源代碼,如果沒有,需要找到相對應版本的源代碼包安裝上去。
3、開始安裝 drbd:
1) 解壓:tar -zxvf drbd-8.3.6.tar.gz
2) 進入 drbd 源碼目錄,根據 kernel 源碼位置來編譯 drbd:
cd drbd-8.3.6
./configure –with-km
make KDIR=/usr/src/kernels/2.6.18-92.el5-i686/
make install
4、現在可以加載安裝 drbd 模塊了
insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko
通過 lsmod 檢查是否已經成功
#lsmod |grep drbd
如果有,則表示成功了
5、更改 drbd 配置文件:
cp ./scripts/drbd.conf /etc/drdb.conf
vi /etc/drbd.conf
修改 resource r0 下的配置
on test9 {
device /dev/drbd0;
disk /dev/sda2;
address 192.168.100.9:7788;
flexible-meta-disk internal;
}
on test8 {
device /dev/drbd0;
disk /dev/sda2;
address 192.168.100.8:7788;
meta-disk internal;
}
…
6、primary node 設置:
1) 創建 matadata:
#drbdadm create-md all
遇到錯誤
Found ext3 filesystem
38515836 kB data area apparently used
38514624 kB left usable by current configuration
Device size would be truncated, which would corrupt data and result in access beyond end of device errors.
You need to either
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy the filesystem)
Operation refused.
Command drbdmeta 0 v08 /dev/sda2 internal create-md terminated with exit code 40
drbdadm create-md r0: exited with code 40
As suggested by the error, Zero out the first part of device by running following command:
執行下面這句
# dd if=/dev/zero of=/dev/sda2 bs=1M count=128
再重新執行
# drbdadm create-md all
2) 啟動 drbd:
#/etc/init.d/drbd start
3) 設置為主節點:
#drbdadm primary all
4) 在新設備上面創建文件系統
#mkfs.ext3 /dev/drbd0
5) 將文件系統 mount 上
#mkdir /drbddata
#mount /dev/drbd0 /drbddata
7、secondary node 設置:
1) 創建 matadata:
#drbdadm create-md all
2) 啟動 drbd:
#/etc/init.d/drbd start
注意:在我的系統上 drbd start 的時候用 modprobe 不能自動加載 drdb 模塊,
所以需要將 /etc/init.d/drbd 中 $MODPROBE -s drdb 改成
insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko
注:這里不要創建文件系統(因為這些信息都會從主節點同步過來的)。
8、primary 和 secondary 節點都配置完并且都啟動后,開始檢查配置是否成功
1) 檢查進程:
a) primary :
[root@test9 /]# ps auxf |grep drbd
root 4735 0.0 0.0 3912 656 pts/0 S+ 10:31 0:00 _ grep drbd
root 3479 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_worker]
root 3491 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_receiver]
root 3503 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_asender]
b) secondary:
root@test8:/ ps auxf |grep drbd
root 4543 0.0 0.0 3912 660 pts/0 S+ 10:31 0:00 _ grep drbd
root 3393 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_worker]
root 3405 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_receiver]
root 3415 0.0 0.0 0 0 ? S 08:48 0:00 [drbd0_asender]
可以看到兩個節點的進程都起來了,每個 drbd 設備會有三個進程:drbd0_worker 是 drbd0 的主要進城,drbd0_asender 是 primary 上 drbd0 的數據發送進程,drbd0_receiver 是 secondary 上 drbd0 的數據接收進程。
2) 查看 /dev/drbd 文件的輸出:
[root@test9 /]# cat /proc/drbd
version: 8.3.6 (api:88/proto:86-91)
GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@test9, 2009-12-11 18:47:35
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—-
ns:8 nr:0 dw:4 dr:473 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
root@test8:/ cat /proc/drbd
version: 8.3.6 (api:88/proto:86-91)
GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@test8, 2009-12-11 18:14:27
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r—-
ns:0 nr:8 dw:8 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
輸出文件上面最開始是 drbd 的版本信息,然后就是數據同步的一些狀態信息,從 mysql 的文檔上介紹了每一個狀態的意思如下:
cs — connection state
st — node state (local/remote)
ld — local data consistency
ds — data consistency
ns — network send
nr — network receive
dw — disk write
dr — disk read
pe — pending (waiting for ack)
ua — unack’d (still need to send ack)
al — access log write count
3) 更進一步驗證數據是否同步正確了:
a) 在 test9 上將該文件系統 umount,然后執行 drbdadm secondary all,改成 secondary 模式
[root@test9 /]# umount /drbddata
[root@test9 /]# drbdadm secondary all
b) 在原 test8 執行 drbdadm primary all 改成 primary 模式,再 mount 文件系統
root@test8:/ drbdadm primary all
root@test8:/ mount /dev/drbd0 /drbddata
檢查之前在 test9 下寫入的文件是否已經完全同步到 test8 下面,經驗證,數據已經同步好了
4) 最后連同 mysql 一起手工測試一次切換:
a) 主節點 test9 下關閉 mysql,釋放資源,將資源切換成 secondary 模式:
[root@test9 ha.d]# mysqladmin -u root shutdown
[root@test9 ha.d]# umount /drbddata
[root@test9 ha.d]# drbdadm secondary all
b) 次節點 test8 下獲取資源,mount 上,切換成 primary 模式,并啟動 mysql:
root@test8:/root/mysql-5.0.51a drbdadm primary all
root@test8:/root/mysql-5.0.51a mount /dev/drbd0 /drbddata
root@test8:/usr/local/mysql/bin ./mysqld_safe –user=mysql
[1] 27900
root@test8:/usr/local/mysql/bin Starting mysqld daemon with databases from /drbddata/mysqldata
root@test8:/usr/local/mysql/bin
root@test8:/usr/local/mysql/bin
root@test8:/usr/local/mysql/bin tail -f /drbddata/mysqldata/test8.err
080303 13:53:25 mysqld started
080303 13:53:26 InnoDB: Started; log sequence number 0 43656
080303 13:53:26 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
Version:‘5.0.51a-log’socket:‘/usr/local/mysql/sock/mysql.sock’port: 3306 Source distribution
c) 登入數據庫中檢查數據,這里我同時在新的主節點上面測試了寫,以便在后面切換回主節點后檢查數據是否也正常:
root@test8:/usr/local/mysql/bin mysql -u root
mysql show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| test |
+——————–+
3 rows in set (0.03 sec)
mysql use test;
Database changed
mysql show tables;
+—————-+
| Tables_in_test |
+—————-+
| t1 |
| t2 |
| t3 |
+—————-+
3 rows in set (0.00 sec)
mysql create table t4(id int);
Query OK, 0 rows affected (0.07 sec)
d) 再通過之前相同的切換步驟切換回各自原來的模式,啟動主節點的 mysql,并檢查數據:
…
[root@test9 ha.d]# drbdadm primary all
[root@test9 ha.d]# mount /dev/drbd0 /drbddata
[root@test9 ha.d]# mysqld_safe –user=mysql
[root@test9 ha.d]# mysql -uroot
mysql use test;
Database changed
mysql show tables;
+—————-+
| Tables_in_test |
+—————-+
| t1 |
| t2 |
| t3 |
| t4 |
+—————-+
4 rows in set (0.00 sec)
mysql insert into t4 values(111);
Query OK, 1 row affected (0.01 sec)
mysql commit;
Query OK, 0 rows affected (0.00 sec)
mysql select * from t4;
+——+
| id |
+——+
| 111 |
+——+
1 row in set (0.00 sec)
幾個注意點:
1、除了 primary 節點的文件系統是手工創建的之外,其他的所有 secondary 節點的文件系統都是通過同步完成的。
2、在 mount drbd 的設備之前,該節點必須已經設置為 primary 模式,而且如果一邊沒有 umount,另一邊是無法 mount 上的,直接 mount 會報如下錯誤:
root@test8:/ mount /dev/drbd0 /drbddata
mount: block device /dev/drbd0 is write-protected, mounting read-only
3、DRBD 也支持 Dual-primary mode,不過需要 GFS 等集群文件系統來支持。
1.5 性能測試
測試選項:sysbench –num-threads=10 –max-requests=10000 –test=oltp
–mysql-table-engine=innodb –oltp-table-size=1000000
? 直接使用本地磁盤
OLTP test statistics:
queries performed:
read: 140000
write: 50000
other: 20000
total: 210000
transactions: 10000 (206.65 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190000 (3926.39 per sec.)
other operations: 20000 (413.30 per sec.)
Test execution summary:
total time: 48.3905s
total number of events: 10000
total time taken by event execution: 483.6677
per-request statistics:
min: 9.59ms
avg: 48.37ms
max: 255.62ms
approx. 95 percentile: 96.74ms
Threads fairness:
events (avg/stddev): 1000.0000/10.23
execution time (avg/stddev): 48.3668/0.01
? 使用 DRBD
OLTP test statistics:
queries performed:
read: 140000
write: 50000
other: 20000
total: 210000
transactions: 10000 (174.69 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190000 (3319.17 per sec.)
other operations: 20000 (349.39 per sec.)
Test execution summary:
total time: 57.2433s
total number of events: 10000
total time taken by event execution: 572.2720
per-request statistics:
min: 11.87ms
avg: 57.23ms
max: 342.05ms
approx. 95 percentile: 141.95ms
Threads fairness:
events (avg/stddev): 1000.0000/16.01
execution time (avg/stddev): 57.2272/0.01
由此可以看出,DRBD 使 MySQL 性能下降 15% 左右。DRBD 主要是對寫性能有影響,對讀的影響很小,所以對更新頻率不高但對可用性要求很高的應用,DRBD 是個很好的選擇。
1.6 使用 Heartbeat 實現自動故障轉移
1、假設服務器 A,B 的公網 IP 分別是:
A 192.168.100.9
B 192.168.100.8
集群虛 IP: 192.168.100.201
2、設置服務器 A,B 的 hostname 為 test9 及 test8,
如不是請修改 /etc/sysconfig/network 的 HOSTNAME 部分,并執行
#hostname test9 以立即生效。
在 /etc/hosts 加入兩行:
192.168.100.10 test9
192.168.100.9 test8
4、修改服務器 A,B 的 /etc/sysctl.conf 文件, 加入如下 5 行, 并執行
#sysctl -p 以立即生效。
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2
5、以 root 進入服務器 A、B,執行以下配置:
在 /etc/init.d/heartbeat 中的 #!/bin/sh 后插入一行:
ifconfig lo:100 192.168.100.201 netmask 255.255.255.255 up
#chkconfig heartbeat –level 35 on
#cd /etc/ha.d 進入集群配置文件目錄
#vi authkeys 創建集群認證文件
auth 3
3 md5 HA_2009
#chmod 600 authkeys 必要的操作
#vi ha.cf 創建集群節點文件
logfile /var/log/ha.log
#logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 80
mcast eth0 231.231.231.232 694 1 0
## 有雙網卡最好做個兩臺機器最好做交叉線連接,eth0 改 eth2
#ucast eth0 192.168.100.8 #(test9 直接指向對端 ip,test8 的 ucast eth0 192.168.100.9)
ping 192.168.100.2
auto_failback on
node test9
node test8
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
集群中有兩個節點 test9 及 test8, 通過多播 IP 通信(主要用于超過 2 個節點)
ping 192.168.100.2 網關 ping 檢測
#vi /etc/ha.d/resource.d/vip.sh 創建我們自己的集群 IP 切換 shell 腳本
#!/bin/sh
case $4 in
start)
ifconfig lo:100 down
ifconfig $1:100 $2 netmask $3 up
;;
stop)
ifconfig $1:100 down
ifconfig lo:100 $2 netmask 255.255.255.255 up
;;
esac
/etc/ha.d/resource.d/SendArp 192.168.100.201/eth0 start
提供了 LVS 集群備用節點在回路地址監聽集群虛 IP 以用于應用服務器。
最后一行用于更新客戶機的 arp 中緩存的 MAC 地址。
#chmod +x resource.d/vip.sh
#vi /etc/ha.d/resource.d/mysql.sh 創建 mysql 啟動停止的 shell 腳本
#!/bin/sh
case $1 in
start)
/drbddata/mysql-xtradb/bin/mysqld_safe –defaults-file=/drbddata/mysql-xtradb/my.cnf –user=mysql /dev/null 2 1
;;
stop)
/drbddata/mysql-xtradb/bin/mysqladmin -S/drbddata/mysql-xtradb/mysql.sock shutdown
;;
esac
#vi haresources 創建集群資源文件
test9 drbddisk::r0
Filesystem::/dev/drbd0::/drbddata::ext3
vip.sh::eth0::192.168.100.201::255.255.255.0
Delay::5::0
mysql.sh
在 AB 上分別執行 service heartbeat start 測試
注意查看日志 /var/log/ha.log
啟動完成后,test9 上的 mysql 正常可用
mysql -h292.168.100.201 -P3308 –uroot –p
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 5.1.39-xtradb-log MySQL Community Server (GPL)
Type help; or h for help. Type c to clear the current input statement.
mysql
關于“Heartbeat+DRBD 如何實現 MySQL 高可用性”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。