您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Heartbeat+DRBD如何實現MySQL高可用性,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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高可用性”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。