www.521voip.com 專注雲計算
本方案採用Heartbeat雙機熱備軟件來保證數據庫的高穩定性和連續性,數據的一致性由DRBD這個工具來保證。默認情況下只有一臺mysql在工作,當主mysql服務器出現問題後,系統將自動切換到備機上繼續提供服務,當主數據庫修復完畢,又將服務切回繼續由主mysql提供服務。
優點:安全性高、穩定性高、可用性高,出現故障自動切換,
缺點:只有一臺服務器提供服務,成本相對較高。不方便擴展。可能會發生腦裂。
本方案適用於數據庫訪問量不太大,短期內訪問量增長不會太快,對數據庫可用性要求非常高的場景。
主機名 | Ip | 系統 | DRBD磁盤 | Heartbeat版本 |
dbserver1 | 10.1.1.113 | Centos 5.5 64bit | /dev/sdb1 | 2.1.3 |
dbserver2 | 10.1.1.108 | Centos 5.5 64bit | /dev/sdb1 | 2.1.3 |
官網的說法,如果系統內核(linux)版本低於2.6.33,在安裝軟件之前需要加載DRBD模塊,我的內核版本是2.6.18的,安裝後會自動加載drbd模塊。安裝命令如下:
yum install -y drbd83 kmod-drbd83
安裝後使用lsmod | grep drbd命令查看是否加載drbd模塊,如果沒有加載需要手動運行命令加載,命令如下:
insmod drbd/drbd.ko 或者 modprobe drbd
配置之前需要先使用fdisk對/dev/sdb進行分區。
對於DRBD的配置,只需要配置/etc/drbd.conf和hosts文件即可,dbserver1和dbserver2的hosts添加的內容如下:
10.1.1.113 dbserver1
10.1.1.108 dbserver2
我的/etc/drbd.conf文件的內容如下(dbserver1和dbserver2的配置一樣):
global { usage-count yes; }
common { syncer { rate 10M; } }
resource r0 {
protocol C;
startup {
}
disk {
on-io-error detach;
#size 1G;
}
net {
}
on dbserver1 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.1.1.113:7888;
meta-disk internal;
}
on dbserver2 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.1.1.108:7888;
meta-disk internal;
}
}
配置好drbd以後,就需要使用命令在dbserver1和dbserver2上創建配置的drbd資源,使用如下命令:
drbdadm create-md r0# r0爲配置文件中定義的資源名
DRBD的啓動和停止
/etc/rc.d/init.d/drbd start#啓動drbd
/etc/rc.d/init.d/drbd stop#停止drbd
/etc/rc.d/init.d/drbd restart#重啓drbd
查看DRBD狀態
watch -n 1 cat /proc/drbd
/etc/init.d/drbd status
以上兩種方式都可以查看drbd的狀態
設置當前節點爲主節點,並進行格式化和掛載
drbdadm -- --overwrite-data-of-peer primary all
mkfs.ext3 /dev/drbd0
mkdir /drbd
mount /dev/drbd0 /drbd
掛在後可以往/drbd目錄寫入一些測試數據,看看是否能同步到從節點上。
遷移mysql的數據到drdb(假設你的mysql已經在該服務器上安裝好了)
DRBD已經安裝並且能正常同步了,那麼我們接下來要做的就是將本機的已安裝的mysql的數據遷移到drbd上,這裏爲了簡單就不考慮新安裝數據庫的情形了,因爲新安裝的時候只需要將數據目錄指定到drbd中並將my.cnf配置文件放到drbd中即可。具體的數據遷移步驟如下:
a)關閉dbserver1和dbserver2的mysql,/etc/rc.d/init.d/mysqld stop
b)在dbserver1上創建存放數據庫數據的目錄:mkdir /drbd/dbdata
c)在dbserver1將配置文件放到drbd目錄中:
mv /etc/my.cnf /drbd/dbdata/
刪除dbserver2上的/etc/my.cnf,rm -f /etc/my.cnf
在dbserver1和dbserver2上執行如下命令創建軟鏈接。
ln -s /drbd/dbdata/my.cnf /etc/my.cnf
d)修改/etc/my.cnf的數據目錄指向/drbd/dbdata
e)將原來的mysql數據文件移動到/drbd/dbdata
f)執行chown -R mysql.mysql /drbd/dbdata
g)啓動mysql
手工切換DRBD
在沒有安裝配置drbd之前,drbd是不能自動切換的,我們可以寫出過程來加深對drbd的理解,也更能明白heartbeat的工作流程,下面是手工切換的步驟:
a)在dbserver1上停止mysql,/etc/rc.d/init.d/mysqld stop。
b)在dbserver1上執行umount /dev/drbd0。
c)在dbserver1上執行drbdadm secondary all切換到從模式。當兩個節點都是secondary模式的時候纔可以將dbserver2設置成primary。
d)在dbserver2上執行drbdadmprimary all,將dbserver2提升爲主模式,並觀察/proc/drbd是否正常。
e)在dbserver2上執行mount /dev/drbd0 /drbd掛在文件系統。
f)啓動dbserver2的mysql,/etc/rc.d/init.d/mysqld start。
注意:dbserver1和dbserver2上的mysql用戶的uid和gid要一樣。不然切換後會導致mysql數據目錄的屬主不正確而啓動失敗。
主從切換
主切換成從,需要先卸載文件系統,再執行降級爲從的命令:
umount /dev/drbd0
drbdadm secondary all
從切換成主,要先執行升級成主的命令然後掛在文件系統:
drbdadmprimary all 如果不成功drbdsetup /dev/drbd0 primary -o
mount /dev/drbd0 /drbd/
DRBD腦裂後的處理
當DRBD出現腦裂後,會導致drbd兩邊的磁盤不一致,處理方法如下:
在確定要作爲從的節點上切換成secondary,並放棄該資源的數據:
drbdadm secondary r0
drbdadm -- --discard-my-data connect r0
在要作爲primary的節點重新連接secondary(如果這個節點當前的連接狀態爲WFConnection的話,可以省略),使用如下命令連接:
drbdadm connect r0
在DRBD調試沒有問題之後,就可以開始安裝和配置heartbeat了,Master和backup服務器都需要安裝heardheat軟件。下面兩種安裝方式任選其一。
Rpm包的安裝方式
yum -y install heartbeat-*
源代碼編譯安裝方式
wget http://www.ultramonkey.org/download/heartbeat/2.1.3/heartbeat-2.1.3.tar.gz
tar xzvf heartbeat-2.1.3.tar.gz
cd heartbeat-2.1.3
./configure
Make
make install
Hearbeat的配置主要包括三個配置文件,authkeys,ha.cf和haresources的配置,下面就分別來看!
Hosts文件的配置
需要在hosts文件中添加master和backup主機,加快節點間的通信
Master和backup的hosts節點添加的內容一樣,我的配置添加如下內容:
vim /etc/hosts
# dbserver1和dbserver2是我的master和backup的主機名
10.1.1.113 dbserver1
10.1.1.108 dbserver2
Authkerys的配置
這個文件用來配置密碼認證方式,支持3種認證方式,crc,md5和sha1,從左到右安全性越來越高,消耗的資源也越多。因此如果heartbeat運行在安全的網路之上,比如私網,那麼可以將驗證方式設置成crc,master和backup的authkeys配置一樣。我的authkeys文件配置如下:
vim /etc/ha.d/authkeys
auth 1
1 crc
ha.cf的配置
master(dbserver1)的ha.cf的配置
vim /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacilitylocal0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth0 10.1.1.108
auto_failback on
nodedbserver1
nodedbserver2
ping 10.1.1.1
respawn hacluster /usr/lib64/heartbeat/ipfail
backup(dbserver2)的ha.cf的配置
vim /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacilitylocal0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth0 10.1.1.113
auto_failback on
nodedbserver1
nodedbserver2
ping 10.1.1.1
respawn hacluster /usr/lib64/heartbeat/ipfail
haresources的配置
haresources用來設置master的主機名、虛擬IP、服務以及磁盤掛載等,master和backup的配置是一樣的,下面的mysqld需要做成服務,放在/etc/rc.d/init.d/目錄下,配置配置如下:
vim /etc/ha.d/haresources
dbserver1 IPaddr::10.1.1.176/24/eth0:1 drbddisk::r0 Filesystem::/dev/drbd0::/drbd::ext3 mysqld
配置好heartbeat之後,需要將mysql從自啓動服務器中去掉,因爲主heartbeat啓動的時候會掛載drdb文件系統以及啓動mysql,切換的時候會將主上的mysql停止並卸載文件系統,從上會掛載文件系統,並啓動mysql。因此需要做如下操作:
chkconfig mysqld off
chkconfig --add heartbeat
chkconfig heartbeat on
或者將heartbeat的啓動命令你寫到/etc/rc.local啓動文件中去。
環境搭建好以後,就需要進行周密的測試,看是否實現了預期的功能:
停掉master上的mysqld,看看是否切換(因爲heartheat不檢查服務的可用性,因此需要你通過而外的腳本來實現,方法前面已經描述)。
停掉master的heartheat看看是否能正常切換。
停掉master的網絡或者直接將master系統shutdown,看看能否正常切換。
啓動master的heartbeat看看是否能正常切換回來。
重新啓動master看看能否切換過程是否OK。
注意:這裏說的切換是不是已經將mysql停掉、是否卸載了文件系統等等。
由於heartbeat不能監控mysql的可用性,因此需要通過其他的方式來實現,對於mysql可用性的監控是必須的,如果發生切換,需要第一時間