- 論壇徽章:
- 0
|
DRBD(Distributed Replicated Block Device),分布式復制塊設備,是一種通過TCP/IP網(wǎng)絡實現(xiàn)塊設備數(shù)據(jù)實時鏡像的方案。利用這種方案,單一主節(jié)點模式(single primary mode)雙機系統(tǒng)能夠?qū)崟r地將業(yè)務數(shù)據(jù)保存在主備節(jié)點的磁盤中,正常情況下兩個節(jié)點的數(shù)據(jù)是一模一樣的。
HeartBeat在此是用來做熱備切換的,兩節(jié)點間通過心跳線連接,如果主節(jié)點死機的話,可以通過HA將DRBD快速切換到另外一個節(jié)點,同時搶占虛擬IP,并啟動MySQL,對MySQL客戶端來說,只有很短時間的中斷。此模式能有效提高MySQL的可用性。
此文檔參考了DRBD(http://www.drbd.org), HA(http://linux-ha.org), MySQL的相關官方文檔。安裝筆記由魚漂(ipaddr)原創(chuàng),最新版本可以在http://www.eit.name/找到,轉載請注明。
--------------------------------
一.環(huán)境
--------------------------------
OS: CentOS 5.5 32位
MySQL: 系統(tǒng)自帶
DRBD: 8.3.8.1編譯安裝 (http://www.drbd.org/)
HeartBeat: 3.0.3編譯安裝 (http://linux-ha.org/)
====Node1====
Hostname: db_node1.systemadmin.cn
Ip: 192.168.0.201
====Node2====
Hostname: db_node2.systemadmin.cn
Ip: 192.168.0.202
HB的虛IP: 192.168.0.200
用來做DRBD的分區(qū):/dev/sdb1
掛載點:/data/dbdata
--------------------------------
二. 編譯安裝DRBD
--------------------------------
從www.drbd.org下載drbd-8.3.8.1.tar.gz,分別在兩個節(jié)點上編譯安裝:
注意,DRBD需要內(nèi)核模塊支持,2.6.33后的Linux內(nèi)核已內(nèi)置DRBD的支持,在此版本前,安裝時需要kernel-devel包,同時編譯drbd時要帶上--with-km。
#./configure --prefix=/ --with-km
#make
#make install
#chkconfig --add drbd
#chkconfig drbd on
檢查安裝是否成功:
#drbdadm
看是否以執(zhí)行成功?
#cat /proc/drbd
是否可以看到版本信息
重啟后再次檢查cat /proc/drbd
--------------------------------
三. 配置DRBD
--------------------------------
注意,新版本的DRBD的配置文件已拆分成多個,全部放在/etc/drbd.d/目錄,具體可參考/etc/drbd.conf中的配置.
如果開了iptables防火墻,需要打開對應的7789端口。
在主節(jié)點配置/etc/drbd.d/dbdata.res:
=========dbdata.res begin===========
resource dbdata {
on db_node1.systemadmin.cn {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.0.201:7789;
meta-disk internal;
}
on db_node2.systemadmin.cn {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.0.202:7789;
meta-disk internal;
}
}
=========dbdata.res end===========
創(chuàng)建drbd設備
#drbdadm create-md all
#/etc/init.d/drbd restart
查看是否有相應的塊設備:
#ls -l /dev/drbd1
#cat /proc/drbd
設置當前節(jié)點為主節(jié)點并進行格式化:
#drbdadm -- --overwrite-data-of-peer primary all
#mkfs.ext3 /dev/drbd1
#mount /dev/drbd1 /data/dbdata
#mkdir /data/dbdata/etc
#mkdir /data/dbdata/data
在從節(jié)點做如下配置:
復制dbdata.res到從節(jié)點的/etc/drbd.d/
#drbdadm create-md all
#/etc/init.d/drbd restart
通過cat /prod/drbd查看是否開始復制,以及兩節(jié)點的狀態(tài)。
此時開始同步兩個節(jié)點的磁盤,需要一定時間,在同步完成前,請不要重啟,否則會重新同步。
同步完成后,如果兩個節(jié)點都是Secondary/Secondary,并且已經(jīng)UpToDate了,可以挑一個節(jié)點設置為主節(jié)點:
#drbdadm primary all
DRDB的一些常規(guī)操作:
切換主從節(jié)點前,要注意umount
主從切換: drbdadm primary all, drbdadm secondary all
節(jié)點間連接:drbdadm connect|disconnect all
DRBD腦裂后的處理:
腦裂后,兩個節(jié)點間數(shù)據(jù)不同步,主從關系失效,需要按下面的步驟修復:
a.在從節(jié)點如下操作:
#drbdadm secondary dbdata
#drbdadm -- --discard-my-data connect dbdata
b.在主節(jié)點上,通過cat /proc/drbd查看狀態(tài),如果不是WFConnection狀態(tài),需要再手動連接:
#drbdadm connect dbdadta
--------------------------------
四. 遷移MySQL到DRBD磁盤
--------------------------------
確保drbd當前工作正常,將/data/dbdata加載,再在主節(jié)點按如下步驟操作。
a. 關閉MySQL: /etc/init.d/mysqld stop
b. #mv /etc/my.cnf /data/dbdata/etc/
c. #ln -s /data/dbdata/etc/my.cnf /etc/my.cnf
d. 修改my.cnf,將數(shù)文件文件指向 /data/dbdata/data
e. 將原來的數(shù)據(jù)文件移動到 /data/dbdata/data
f. 再啟動MySQL
從節(jié)點只需要刪除/etc/my.cnf,同時,建立鏈接到/data/dbdata/etc/my.cnf即可。
現(xiàn)在已完成MySQL+DRBD的配置,但切換時仍然是手動進行,假設主節(jié)點從node1轉到node2,手動操作如下:
a. 在node1上停止MySQL
b. 在node1上unmout /data/dbdata
c. 在node1上執(zhí)地drbdadm secondary all,兩個節(jié)點都是secondary狀態(tài)后,才可以將node2設置為primary
d. 在node2上執(zhí)行drbdadm primary all,將node2變成主節(jié)點
e. 觀察兩個節(jié)點的/proc/drbd是否正常
f. 在node2上mount /dev/drbd1 /data/dbdata
g. 在node2上面啟動MySQL
建議:據(jù)說MyISAM在DRBD上容易造成數(shù)據(jù)丟失,或表文件損壞,所以此模式下最好用InnoDB,打開Binlog,同時,innodb_flush_log_at_trx_commit=1可以保證數(shù)據(jù)完整,但會嚴重影響性能。設置為2的話性能約有10倍提升,不過故障時可能會丟失1秒的數(shù)據(jù)。
--------------------------------
五. 安裝配置HA
--------------------------------
需分別下載和安裝:
* Cluster Glue 1.0.6: glue-1.0.6.tar.bz2
* Resource Agents 1.0.3: agents-1.0.3.tar.bz2
* Heartbeat 3.0.3: Heartbeat-3-0-STABLE-3.0.3.tar.bz2
魚漂特別提醒,編譯安裝過程中,還會連接網(wǎng)絡下載文件和校驗xml,請在安裝前確保網(wǎng)絡連接和DNS解析正常。
A. 先安裝glue
1. 從linux-ha.org下載 glue-1.0.6.tar.bz2
2. 解壓
3. 編譯安裝:
./autogen.sh
./configure
打開lib/stonith/main.c,將version相關的注釋掉,否則編譯不過,有點詭異。
1、找到其64行,將其注釋掉。
2、找到其76到81行全部注釋掉。
3、找到其390行,將其注釋
groupadd haclient
useradd -g haclient hacluster
make
make install
B. 安裝Cluster agent
#./autogen.sh
#./configure
#make
#make install
C. 安裝HA3.0.3
下載HA3.0.3解壓并進入到源代碼目錄:
#./bootstrap
#./ConfigureMe configure
#make
#make install
D. 配置/etc/ha.d/ha.cf
=========ha.cf begin==============
logfacility local0
keepalive 500ms
deadtime 10
warntime 5
initdead 60
mcast eth0 225.0.0.1 694 1 0
auto_failback off
node db_node1.systemadmin.cn
node db_node2.systemadmin.cn
=========ha.cf end==============
注意,防火墻需要打開端口為694,目標Ip為225.0.0.1的udp通信
E. 配置/etc/ha.d/haresources
========haresource begin===========
db_node1.systemadmin.cn drbddisk Filesystem::/dev/drbd1::/data/dbdata::ext3 IPaddr::192.168.0.200/24/eth0 mysql
========haresource end===========
F.生成/etc/ha.d/authkeys
#( echo -ne "auth 1\n1 sha1 "; \
dd if=/dev/urandom bs=512 count=1 | openssl md5 ) \
> /etc/ha.d/authkeys
#chmod 0600 /etc/ha.d/authkeys
G. 編寫MySQL啟動腳本/etc/ha.d/resource.d/mysql
=========mysql begin============
#!/bin/bash
#
# Author: ipaddr ( admin.net [#] 163.com )
#
. /etc/ha.d/shellfuncs
case "$1" in
start)
res=`/etc/init.d/mysqld start`
ret=$?
ha_log $res
exit $ret
;;
stop)
res=`/etc/init.d/mysqld stop`
ret=$?
ha_log $res
exit $ret
;;
status)
if [[ `ps -ef | grep '[m]ysqld'` > 1 ]] ; then
echo "running"
else
echo "stopped"
fi
;;
*)
echo "Usage: mysql {start|stop|status}"
exit 1
;;
esac
exit 0
=========mysql end============
F. 拷貝一些常用腳本
1. 從Heartbeat-3-0源碼目錄的heartbeat/lib/復制hb_standby, hb_takeover到/usr/lib/heartbeat 并設置為可執(zhí)行.
2. 將Cluster agent的一些文件拷到/etc/ha.d/:
cp /usr/etc/ha.d/shellfuncs /etc/ha.d/
cp -rf /etc/ha.d/* /usr/etc/ha.d/
(這個操作很奇怪,Cluster Agent與HA使用不同的目錄,但又要共用文件,不知在編譯agent時是否可以使用--prefix=/來解決,由于編譯時間實在太長,所有沒有測試)
G. 使用:
1. 設置為自啟動:
chkconfig mysqld off
chkconfig --add heartbeat
chkconfig heartbeat on
2. 手動切換兩個節(jié)點:
/usr/lib/heartbeat/hb_takeover 將當前節(jié)點設為主節(jié)點
/usr/lib/heartbeat/hb_standby 將當前節(jié)點設為從節(jié)點 |
|