From:http://docs.linuxtone.org/ebooks/MySQL/Heartbeat+MySQL+DRBD構(gòu)建高可用MySQL方案.pdf
From:http://bbs.linuxtone.org/forum.php?mod=forumdisplay&fid=24&filter=typeid&typeid=12
服務(wù)器搭建環(huán)境:
主(mysqlm):192.168.1.110 CentOS 5.5 + Heartbeat + DRBD + Mysql
備(mysqls):192.168.1.111 CentOS 5.5 + Heartbeat + DRBD + Mysql
VIP(虛擬IP):192.168.1.120
DRBD資源目錄:/data
一、安裝前準(zhǔn)備工作。
1、主機(jī)和備機(jī)定義主機(jī)名
# vi /etc/hosts
192.168.1.110 mysqlm
192.168.1.111 mysqls
注:確認(rèn)主機(jī)/etc/sysconfig/network和hostname為mysqlm,備機(jī)為mysqls。
2、主機(jī)和備機(jī)創(chuàng)建相同大小的分區(qū)
# fdisk /dev/sdb (過(guò)程略...)
# mkfs.ext3 /dev/sdb5
# mkdir /data
3、主機(jī)和備機(jī)防火墻設(shè)置
# iptables -A INPUT -p tcp --dport 7898 -j ACCEPT #在防火墻中添加一個(gè)drbd的通信
# iptables -I INPUT 2 -p udp --dport 694 -j ACCEPT #在防火墻中插入一個(gè)heartbeat的通信
# iptables-save>/etc/sysconfig/iptables
4、安裝前的說(shuō)明
DRBD資源目錄:因?yàn)镈RBD是以塊為單位同步數(shù)據(jù),所以需要分別在兩臺(tái)主機(jī)上建立一個(gè)分區(qū),供DRBD記錄信息的數(shù)據(jù)塊。
DRBD腦裂問(wèn)題:即彼此都認(rèn)為對(duì)方已經(jīng)死了,然后自己都將角色作為Primary,并積極獲取資源。
DRBD資源角色:primary(主節(jié)點(diǎn)):可讀可寫可掛載,secondary(次節(jié)點(diǎn)):不可讀不可寫不可掛載。
DRBD兩種模型:Dual-primary,Primary/Secondary。
DRBD復(fù)制模型:Protocol A,Protocol B,Protocol C。
Protocol A:異步復(fù)制(主節(jié)點(diǎn)一旦寫入完成,數(shù)據(jù)發(fā)往本地TCP/IP緩存就宣告完成)。
Protocol B:內(nèi)存同步復(fù)制,半同步復(fù)制(主節(jié)點(diǎn)一旦寫入完成,數(shù)據(jù)發(fā)往接收方的內(nèi)存空間中,就宣告完成)。
Protocol C:同步復(fù)制(主節(jié)點(diǎn)一旦寫入完成,數(shù)據(jù)發(fā)往接收方的磁盤中,就宣告完成)。
DRBD設(shè)備進(jìn)程:drbd0_worker,drbd0_asender,drbd0_receiver。
drbd0_worker是drbd0的主進(jìn)程,
drbd0_asender是primary上drbd0的數(shù)據(jù)發(fā)送進(jìn)程,
drbd0_receiver是secondary上drbd0的數(shù)據(jù)接收進(jìn)程。
二、安裝配置DRBD和Heartbeat
1、主機(jī)和備機(jī)安裝DRBD和Heartbeat
# yum -y install drbd83 kmod-drbd83
# yum -y install heartbeat heartbeat-ldirectord heartbeat-pils heartbeat-stonith
注:如果使用源碼安裝的話,則使用yum -y install kernel-devel-$(uname -r)語(yǔ)句更新內(nèi)核。
2、配置DRBD
a)、主機(jī)和備機(jī)配置
# vi /etc/drbd.conf
# please have a a look at theexample configuration file in
#/usr/share/doc/drbd83/drbd.conf
global { usage-count yes; } #參加DRBD使用者統(tǒng)計(jì),默認(rèn)為yes。
common {
syncer { rate100M;} #設(shè)置主備節(jié)點(diǎn)同步時(shí)的網(wǎng)絡(luò)速率最大值,如果是100M網(wǎng)絡(luò),就寫100M。
}
resource r0 {
protocol C; #使用協(xié)議c,表示收到遠(yuǎn)程主機(jī)的寫入確認(rèn)后,則認(rèn)為寫入完成。
startup { degr-wfc-timeout 120;}
disk {
on-io-error detach;
#size 1G; #兩臺(tái)服務(wù)器硬盤大小不同,才需要設(shè)置drbd的大小
}
net {
cram-hmac-alg sha1; #設(shè)置主備機(jī)之間通信使用的信息算法。
shared-secret "FooFunFactory";
}
on mysqlm {
device /dev/drbd0; #將使用的分區(qū),該分區(qū)映射到 /dev/sdb5
disk /dev/sdb5; #新建的分區(qū)
address 192.168.1.110:7898; #指定IP地址和端口號(hào)
meta-disk internal; #網(wǎng)絡(luò)通信屬性
}
on mysqls {
device /dev/drbd0;
disk /dev/sdb5;
address 192.168.1.111:7898;
meta-disk internal;
}
}
b)、主機(jī)和備機(jī)執(zhí)行
# mkfs.ext3 /dev/sdb5 #使用ext3格式分區(qū)格式化/dev/sdb5
# dd if=/dev/zero of=/dev/sdb5 bs=1M count=1;sync
# drbdadm create-md r0 #初始化drbd的metadata,r0是前面定義的resource。
# /etc/init.d/drbd start #啟動(dòng)Master上的drbd時(shí),就去啟動(dòng)backup的drbd,否則Master無(wú)法啟動(dòng)。
# ps -aux|grep drbd
注:drbd設(shè)備有三個(gè)進(jìn)程:drbd0_worker是drbd0的主進(jìn)程,drbd0_asender是primary上drbd0的數(shù)據(jù)發(fā)送進(jìn)程,drbd0_receiver是secondary上drbd0的數(shù)據(jù)接收進(jìn)程。
# cat /proc/drbd #查看drbd狀態(tài),此時(shí)結(jié)果應(yīng)為st:Secondary/Secondary,ds:Inconsistent/Inconsistent。
======================僅主機(jī)執(zhí)行================
# drbdsetup /dev/drbd0 primary -o #設(shè)置主節(jié)點(diǎn),僅第一次使用drbdsetup,以后則用drbdadm。
# cat /proc/drbd #查看drbd狀態(tài),此時(shí)結(jié)果應(yīng)為st:Primary/Secondary ds:UpToDate/Inconsistent。
# mkfs.ext3 /dev/drbd0
# mount /dev/drbd0 /data
# watch -n 1 cat /proc/drbd
==============================================
注:/proc/drbd中顯示了drbd當(dāng)前的狀態(tài),第一行的st表示兩臺(tái)主機(jī)的狀態(tài),主機(jī)表示為Primary,備機(jī)表示為Secondary。
ds是磁盤狀態(tài),實(shí)時(shí)表示為UpToDate,不一致表示為Inconsistent狀態(tài)。
c)、測(cè)試主從節(jié)點(diǎn)切換是否正常
先在主機(jī)上執(zhí)行:
# umount /data
# drbdadm secondary r0 #或者寫drbdadm secondary all也可以。
然后在備機(jī)上執(zhí)行:
# drbdadm primary r0
# mount /dev/drbd0 /data
3、主機(jī)和備機(jī)將Mysql的data文件移至/data目錄
# chkconfig mysqld off
# service mysqld stop
#vi /etc/init.d/mysqld
#datadir=
datadir=/data/mysql
======================僅主機(jī)執(zhí)行================
# mkdir /data/mysql
# chown -R mysql:mysql /data/mysql
# cp -rp /usr/local/mysql/data/* /data/mysql
# service mysqld start
==============================================
4、配置Heartbeat
a)、主機(jī)和備機(jī)配置心跳線連接加密文件authkeys
# vi /etc/ha.d/authkeys
auth 3
#1 crc
#2 sha1 HI!
3 md5 wameidemysql
# chmod 600 /etc/ha.d/authkeys
注:authkeys有三種認(rèn)證方式:crc,md5,和sha1。如果您的Heartbeat運(yùn)行于安全網(wǎng)絡(luò)之上,可以使用crc,從資源的角度來(lái)看,這是代價(jià)最低的方法。如果網(wǎng)絡(luò)并不安全,但您也希望降低CPU使用,則使用md5。最后,如果您想得到最好的認(rèn)證,而不考慮CPU使用情況,則使用sha1,它在三者之中最難破解。
b)、主機(jī)和備機(jī)配置監(jiān)控配置文件ha.cf
# vi /etc/ha.d/ha.cf
debugfile /var/log/ha-debug #打開錯(cuò)誤日志報(bào)告。
logfile /var/log/ha-log
logfacility local0 #這個(gè)是設(shè)置heartbeat的日志,這里是用的系統(tǒng)日志。
keepalive 2 #2秒檢測(cè)一次心跳線連接。
warntime 8 #警告時(shí)間(最好在2~10秒之間),可在日志中搜索late heartbeat查看。
deadtime 10 #10秒測(cè)試不到主服務(wù)器心跳線則宣布節(jié)點(diǎn)死亡。
initdead 120 #初始化啟動(dòng)時(shí)120秒無(wú)連接視為正常,或者指定heartbeat。
udpport 694 #設(shè)置使用udp的694端口連接。
ucast eth0 192.168.1.111 #單播方式連接(主從都寫對(duì)方的 ip 進(jìn)行連接)。
auto_failback off #自動(dòng)切換(主服務(wù)器恢復(fù)后可自動(dòng)切換回來(lái),建議為off)。
node mysqlm #集群中主機(jī)器的主機(jī)名,與"uname -n"的輸出相同。
node mysqls #集群中備機(jī)器的主機(jī)名,與"uname -n"的輸出相同。
ping 192.168.1.253 #通過(guò)ping網(wǎng)關(guān)來(lái)檢測(cè)心跳是否正常。
#respawn hacluster/usr/lib/heartbeat/ipfail #監(jiān)控ipfail(控制ip切換程序)進(jìn)程是否掛掉,如果掛掉就重啟它。
#apiauth ipfail gid=haclient uid=hacluster #控制ip切換的時(shí)候所使用的用戶。
hopfudge 1
c)、主機(jī)和備機(jī)配置資源管理文件haresources
# ln -s /etc/init.d/mysqld /etc/ha.d/resource.d/mysqld
# vi /etc/ha.d/haresources
mysqlm IPaddr::192.168.1.120/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 mysqld
注:mysqlm #預(yù)定的主機(jī)節(jié)點(diǎn)名稱,與相應(yīng)主機(jī)$uname -n的結(jié)果一致。需保證drbd.conf和ha.cf中節(jié)點(diǎn)的名字一致。備機(jī)此處寫mysqls。
IPaddr::192.168.1.120/24/eth0:0 #設(shè)置虛擬IP。
drbddisk::r0 #告訴heartbeat要管理DRBD的資源r0。
Filesystem::/dev/drbd0::/data::ext3 #設(shè)定需要掛載的drbd設(shè)備采用的文件系統(tǒng),即執(zhí)行mount與unmout操作。
mysqld #設(shè)定要隨heartbeat啟動(dòng)的服務(wù)。
d)、設(shè)置自動(dòng)啟動(dòng)服務(wù)
# chkconfig --add heartbeat
# chkconfig heartbeat on
# service heartbeat start
三、常見問(wèn)題處理
1、設(shè)置一個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn)
通過(guò)cat /prod/drbd查看是否開始復(fù)制,以及兩節(jié)點(diǎn)的狀態(tài)。此時(shí)開始同步兩個(gè)節(jié)點(diǎn)的磁盤,需要一定時(shí)間,在同步完成前,請(qǐng)不要重啟,否則會(huì)重新同步。
同步完成后,如果兩個(gè)節(jié)點(diǎn)都是Secondary/Secondary,并且已經(jīng)UpToDate/UpToDate狀態(tài)了,可以挑一個(gè)節(jié)點(diǎn)設(shè)置為主節(jié)點(diǎn),語(yǔ)句為:
# drbdadm primary all
# mount /dev/drbd0 /data
2、DRDB的主從切換:
先在主機(jī)上執(zhí)行:
# umount /data
# drbdadm secondary r0 #或者寫drbdadm secondary all也可以。
然后在備機(jī)上執(zhí)行:
# drbdadm primary r0
# mount /dev/drbd0 /data
3、DRDB的節(jié)點(diǎn)間連接
# drbdadm connect all
# drbdadm disconnect all
4、DRBD腦裂后的處理:
腦裂后,即兩邊都顯示cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown,則可以按下面的步驟修復(fù):
在從節(jié)點(diǎn)如下操作:
# service heartbeat stop
# drbdadm -- --discard-my-data connect r0
在主節(jié)點(diǎn)上,通過(guò)watch -n 1 cat /proc/drbd查看狀態(tài),如果不是cs:Connected狀態(tài),需要再手動(dòng)連接
# drbdadm disconnect r0
# drbdadm connect r0
# drbdadm primary r0
在從節(jié)點(diǎn)如下操作:
# service heartbeat start
或者:
在從節(jié)點(diǎn)如下操作:
# service heartbeat stop
# service drbd stop
# drbdadm create-md r0
# service drbd start
# service heartbeat start
在主節(jié)點(diǎn)如下操作:
# service drbd reload
5、需要注意的幾點(diǎn):
a)、mount drbd設(shè)備以前必須把設(shè)備切換到primary狀態(tài)。
b)、兩個(gè)節(jié)點(diǎn)中,同一時(shí)刻只能有一臺(tái)處于primary狀態(tài),另一臺(tái)處于secondary狀態(tài)。
c)、處于secondary狀態(tài)的服務(wù)器上不能加載drbd設(shè)備。
d)、主備服務(wù)器同步的兩個(gè)分區(qū)大小最好相同,這樣不至于浪費(fèi)磁盤空間,因?yàn)閐rbd磁盤鏡像相當(dāng)于網(wǎng)絡(luò)raid 1
e)、使用DRBD方案的時(shí)候建議用使用INNODB存儲(chǔ)引擎,據(jù)說(shuō)MyISAM在DRBD上容易造成數(shù)據(jù)丟失,或表文件損壞,所以此模式下最好用InnoDB,打開Binlog,同時(shí),innodb_flush_log_at_trx_commit=1可以保證數(shù)據(jù)完整,但會(huì)嚴(yán)重影響性能。設(shè)置為2的話性能約有10倍提升,不過(guò)故障時(shí)可能會(huì)丟失1秒的數(shù)據(jù)。
6、centos老是提示:EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
a)、進(jìn)入單用戶模式
b)、mount -o remount,rw /
c)、tune2fs -l /dev/sdb5 | grep ^M
d)、tune2fs -c0 -i0 /dev/sdb5
e)、unmount /dev/sdb5;e2fsck -p /dev/sdb5
7、Heartbeat常見故障解決
a)、heartbeat啟動(dòng)失敗 檢查配置文件 ha.cf, authkeys 和 haresources; ifconfig 檢查網(wǎng)絡(luò)設(shè)備的 ip 是否已配好用。
b)、heartbeat正常啟動(dòng),但查看啟動(dòng)日志發(fā)現(xiàn)檢驗(yàn)結(jié)果為對(duì)方節(jié)點(diǎn)dead,首先確保對(duì)方節(jié)點(diǎn)正常啟動(dòng)heartbeat;其次用ping檢查網(wǎng)絡(luò)是否連接好;然后ping用檢測(cè)haresources中設(shè)定的ip是否存在;最后檢查防火墻是否開通heartbeat服務(wù)。
c)、heartbeat正常啟動(dòng),但查看日志發(fā)現(xiàn)cannot locate resource script XXX,進(jìn)入heartbeat配置文件目錄etc/ha.d/resource.d/,查看是否存在xxx腳本文件;若不存在,需要建立該腳本文件。一般在相關(guān)服務(wù)安裝后,在系統(tǒng)中會(huì)生成相關(guān)的腳本文件,可以find命令找到XXX的腳本文件,cp或者ln到etc/ha.d/resource.d/下即可。
d)、heartbeat正常啟動(dòng),但查看日志發(fā)現(xiàn)啟動(dòng)結(jié)果both nodes獲得權(quán)限,即全是主節(jié)點(diǎn),沒有備份節(jié)點(diǎn)。該問(wèn)題同2。
e)、heartbeat正常啟動(dòng),但是沒有獲得DRBD資源,無(wú)法mount首先檢查配置文件haresources,drbddisk后面的參數(shù)是否為drbd啟動(dòng)的資源;其次,cat /proc/drbd查看DRBD狀態(tài),是否已啟動(dòng),是否有primary節(jié)點(diǎn);第三,檢查drbd設(shè)備,在Centos中,/dev/drbd有時(shí)會(huì)消失掉,需要重新mknod。
f)、heartbbeat無(wú)法正常啟動(dòng),錯(cuò)誤顯示broadcast interface failed需要配置bcast采用的網(wǎng)絡(luò)接口的IP,可用ifconfig命令配置。
g)、heartbeat 和 DRBD 啟動(dòng)順序
g1、drbd先啟動(dòng),heartbeat后啟動(dòng),這是正常的啟動(dòng)方式;heartbeat主機(jī)節(jié)點(diǎn)與當(dāng)前DRBD primary節(jié)點(diǎn)不是同一個(gè)節(jié)點(diǎn),也就是說(shuō),drbd primary節(jié)點(diǎn)在heartbeat的備用節(jié)點(diǎn)上啟動(dòng),則當(dāng)heartbeat主節(jié)點(diǎn)啟用heartbeat時(shí),首先會(huì)將備用節(jié)點(diǎn)上的drbd資源降級(jí),將其轉(zhuǎn)變?yōu)閟econdary,然后將主節(jié)點(diǎn)的 drbb角色設(shè)定為primary,掛載硬盤,切換服務(wù)。
g2、drbd在heartbeat主節(jié)點(diǎn)上啟動(dòng),且已建立連接,mount 設(shè)備,但heartbeat在主節(jié)點(diǎn)上沒有啟動(dòng),在備用節(jié)點(diǎn)上啟動(dòng),則此時(shí)heartbeat備用節(jié)點(diǎn)將接管drbd資源,首先在主節(jié)點(diǎn)上umount設(shè)備,使資源降級(jí)為 secondary;然后提升備用節(jié)點(diǎn)上的drbd資源為primary,mount設(shè)備,切換服務(wù)。
g3、heartbeat在drbd啟動(dòng)前啟動(dòng),且已建立連接;然后DRBD啟動(dòng),建立連接,此時(shí)heartbeat無(wú)法監(jiān)測(cè)drbd資源,可采取的方案為heartbeat的一個(gè)節(jié)點(diǎn)上 heartbeat stop或者restart,則heartbeat另一節(jié)點(diǎn)會(huì)接管資源,實(shí)行對(duì)DRBD的監(jiān)測(cè)。