這篇文章將為大家詳細(xì)講解有關(guān)Heartbeat+DRBD如何實現(xiàn)MySQL高可用性,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)周口,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
DRBD是一種塊設(shè)備,可以被用于高可用(HA)之中。它類似于一個網(wǎng)絡(luò)RAID-1功能。當(dāng)你將數(shù)據(jù)寫入本地文件系統(tǒng)時,數(shù)據(jù)還將會被發(fā)送到網(wǎng)絡(luò)中另一臺主機(jī)上。以相同的形式記錄在一個文件系統(tǒng)中。本地(主節(jié)點)與遠(yuǎn)程主機(jī)(備節(jié)點)的數(shù)據(jù)可以保證實時同步。當(dāng)本地系統(tǒng)出現(xiàn)故障時,遠(yuǎn)程主機(jī)上還會保留有一份相同的數(shù)據(jù),可以繼續(xù)使用。
1.3 環(huán)境準(zhǔn)備
兩臺主機(jī):192.168.100.8,192.168.100.9
需要為本地主機(jī)和遠(yuǎn)程主機(jī),指定一個DRBD使用的硬盤分區(qū)。這兩個分區(qū)的大小必須相同。我們指定兩臺主機(jī)的/dev/sda2分區(qū)作為DRBD的使用的分區(qū).這兩個分區(qū)大小都為37G.
1.4 DRBD的安裝配置
1、首先從www.drbd.org下載了源代碼包(我下載的drbd-8.3.6版本的包)
2、檢查主機(jī)上面有沒有l(wèi)inux的內(nèi)核源代碼,如果沒有,需要找到相對應(yīng)版本的源代碼包安裝上去。
3、開始安裝drbd:
1) 解壓:tar -zxvf drbd-8.3.6.tar.gz
2) 進(jìn)入drbd源碼目錄,根據(jù)kernel源碼位置來編譯drbd:
cd drbd-8.3.6
./configure --with-km
make KDIR=/usr/src/kernels/2.6.18-92.el5-i686/
make install
4、現(xiàn)在可以加載安裝drbd模塊了
insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko
通過lsmod檢查是否已經(jīng)成功
#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設(shè)置:
1) 創(chuàng)建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:
執(zhí)行下面這句
# dd if=/dev/zero of=/dev/sda2 bs=1M count=128
再重新執(zhí)行
# drbdadm create-md all
2) 啟動drbd:
#/etc/init.d/drbd start
3) 設(shè)置為主節(jié)點:
#drbdadm primary all
4) 在新設(shè)備上面創(chuàng)建文件系統(tǒng)
#mkfs.ext3 /dev/drbd0
5) 將文件系統(tǒng)mount上
#mkdir /drbddata
#mount /dev/drbd0 /drbddata
7、secondary node設(shè)置:
1) 創(chuàng)建matadata:
#drbdadm create-md all
2) 啟動drbd:
#/etc/init.d/drbd start
注意:在我的系統(tǒng)上drbd start的時候用modprobe不能自動加載drdb模塊,
所以需要將/etc/init.d/drbd中$MODPROBE -s drdb改成
insmod /lib/modules/2.6.18-92.el5/kernel/drivers/block/drbd.ko
注:這里不要創(chuàng)建文件系統(tǒng)(因為這些信息都會從主節(jié)點同步過來的)。
8、primary和secondary節(jié)點都配置完并且都啟動后,開始檢查配置是否成功
1) 檢查進(jìn)程:
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]
可以看到兩個節(jié)點的進(jìn)程都起來了,每個drbd設(shè)備會有三個進(jìn)程:drbd0_worker是drbd0的主要進(jìn)城,drbd0_asender是primary上drbd0的數(shù)據(jù)發(fā)送進(jìn)程,drbd0_receiver是secondary上drbd0的數(shù)據(jù)接收進(jìn)程。
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的版本信息,然后就是數(shù)據(jù)同步的一些狀態(tài)信息,從mysql的文檔上介紹了每一個狀態(tài)的意思如下:
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) 更進(jìn)一步驗證數(shù)據(jù)是否同步正確了:
a) 在test9上將該文件系統(tǒng)umount,然后執(zhí)行drbdadm secondary all,改成secondary模式
[root@test9 /]# umount /drbddata
[root@test9 /]# drbdadm secondary all
b) 在原test8 執(zhí)行drbdadm primary all 改成primary模式,再mount文件系統(tǒng)
root@test8:/>drbdadm primary all
root@test8:/>mount /dev/drbd0 /drbddata
檢查之前在test9下寫入的文件是否已經(jīng)完全同步到test8下面,經(jīng)驗證,數(shù)據(jù)已經(jīng)同步好了
4) 最后連同mysql一起手工測試一次切換:
a) 主節(jié)點test9下關(guān)閉mysql,釋放資源,將資源切換成secondary模式:
[root@test9 ha.d]# mysqladmin -u root shutdown
[root@test9 ha.d]# umount /drbddata
[root@test9 ha.d]# drbdadm secondary all
b) 次節(jié)點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) 登入數(shù)據(jù)庫中檢查數(shù)據(jù),這里我同時在新的主節(jié)點上面測試了寫,以便在后面切換回主節(jié)點后檢查數(shù)據(jù)是否也正常:
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) 再通過之前相同的切換步驟切換回各自原來的模式,啟動主節(jié)點的mysql,并檢查數(shù)據(jù):
…
[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節(jié)點的文件系統(tǒng)是手工創(chuàng)建的之外,其他的所有secondary節(jié)點的文件系統(tǒng)都是通過同步完成的。
2、在mount drbd的設(shè)備之前,該節(jié)點必須已經(jīng)設(shè)置為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等集群文件系統(tǒng)來支持。
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主要是對寫性能有影響,對讀的影響很小,所以對更新頻率不高但對可用性要求很高的應(yīng)用,DRBD是個很好的選擇。
1.6 使用Heartbeat實現(xiàn)自動故障轉(zhuǎn)移
1、假設(shè)服務(wù)器A,B的公網(wǎng)IP分別是:
A 192.168.100.9
B 192.168.100.8
集群虛IP: 192.168.100.201
2、設(shè)置服務(wù)器A,B的hostname為test9及test8,
如不是請修改/etc/sysconfig/network的HOSTNAME部分,并執(zhí)行
#hostname test9 以立即生效。
在/etc/hosts加入兩行:
192.168.100.10 test9
192.168.100.9 test8
4、修改服務(wù)器A,B的/etc/sysctl.conf文件,加入如下5行,并執(zhí)行
#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進(jìn)入服務(wù)器A、B,執(zhí)行以下配置:
在/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 進(jìn)入集群配置文件目錄
#vi authkeys 創(chuàng)建集群認(rèn)證文件
auth 3
3 md5 HA_2009
#chmod 600 authkeys 必要的操作
#vi ha.cf 創(chuàng)建集群節(jié)點文件
logfile /var/log/ha.log
#logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 80
mcast eth0 231.231.231.232 694 1 0
##有雙網(wǎng)卡最好做個兩臺機(jī)器最好做交叉線連接,eth0 改eth2
#ucast eth0 192.168.100.8 #(test9直接指向?qū)Χ薸p,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
集群中有兩個節(jié)點test9及test8,通過多播IP通信(主要用于超過2個節(jié)點)
ping 192.168.100.2 網(wǎng)關(guān)ping檢測
#vi /etc/ha.d/resource.d/vip.sh 創(chuàng)建我們自己的集群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集群備用節(jié)點在回路地址監(jiān)聽集群虛IP以用于應(yīng)用服務(wù)器。
最后一行用于更新客戶機(jī)的arp中緩存的MAC地址。
#chmod +x resource.d/vip.sh
#vi /etc/ha.d/resource.d/mysql.sh 創(chuàng)建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 創(chuàng)建集群資源文件
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上分別執(zhí)行service heartbeat start測試
注意查看日志/var/log/ha.log
啟動完成后,test9上的mysql正??捎?br/>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>
關(guān)于“Heartbeat+DRBD如何實現(xiàn)MySQL高可用性”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
標(biāo)題名稱:Heartbeat+DRBD如何實現(xiàn)MySQL高可用性
URL標(biāo)題:http://www.rwnh.cn/article26/gcgsjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、Google、外貿(mào)網(wǎng)站建設(shè)、微信小程序、軟件開發(fā)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)