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