一、綜述
數(shù)據(jù)庫(kù)位于現(xiàn)代企業(yè)應(yīng)用的核心,它儲(chǔ)存了組織機(jī)構(gòu)中最有價(jià)值的資產(chǎn),包括客戶信息、產(chǎn)品信息、訂單信息和歷史數(shù)據(jù)。另外,組織機(jī)構(gòu)依賴于數(shù)據(jù)庫(kù)來(lái)運(yùn)行他們 關(guān)鍵業(yè)務(wù)應(yīng)用。幾小時(shí)甚至是幾分鐘的宕機(jī),往往會(huì)造成收入的大量流失和客戶的不滿。因此,保證數(shù)據(jù)庫(kù)高可用是所有組織機(jī)構(gòu)優(yōu)先考慮的事情。對(duì)于希望在當(dāng)今 瞬息萬(wàn)變的經(jīng)濟(jì)環(huán)境立于不敗之地并取得成功的企業(yè)來(lái)說(shuō),構(gòu)建一個(gè)具有高可用性的IT 基礎(chǔ)架構(gòu)至關(guān)重要。
二、完成目標(biāo) 通過(guò)技術(shù)手段實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)的高可用性,從而減少停工時(shí)間保證服務(wù)的正常穩(wěn)定運(yùn)行。
三、方案建設(shè)概要
1、現(xiàn)有高可用方案分析
Mysql作為一款開(kāi)源軟件經(jīng)過(guò)多年的發(fā)展,已經(jīng)形成很多套實(shí)現(xiàn)高可用方案,并且均都投入生產(chǎn)使用,主要為這幾種:mysql + replication 、mysql + heartbeat + 存儲(chǔ)、mysql + drbd + heartbeat 、mysql cluster。以下將依次對(duì)各個(gè)方案進(jìn)行分析。
Mysql的復(fù)制(Replication)是一個(gè)異步的復(fù)制,從一個(gè)Mysql instace(稱之為Master)復(fù)制到另一個(gè)Mysql instance(稱之Slave)。實(shí)現(xiàn)整個(gè)復(fù)制操作主要由三個(gè)進(jìn)程完成的,其中兩個(gè)進(jìn)程在Slave(Sql進(jìn)程和IO進(jìn)程),另外一個(gè)進(jìn)程在Master(IO進(jìn)程)上。
2.2 Mysqlreplication方案拓?fù)鋱D
Mysql+replication主從復(fù)制拓?fù)鋱D
方案具體解釋:
要實(shí)施復(fù)制,首先必須打開(kāi)Master端的binary log(bin-log)功能,否則無(wú)法實(shí)現(xiàn)。因為整個(gè)復(fù)制過(guò)程實(shí)際上就是Slave從Master端獲取該日志然后再在自己身上完全順序的執(zhí)行日志中所記錄的各種操作。
2.3 Mysql+replication優(yōu)缺點(diǎn)優(yōu)點(diǎn):易實(shí)施、成本低、經(jīng)濟(jì)實(shí)惠、后期維護(hù)方便,且由于整套系統(tǒng)架構(gòu)簡(jiǎn)單,不涉及到存儲(chǔ)及雙機(jī)軟件,因此系統(tǒng)出現(xiàn)故障率很低。方便做到讀寫(xiě)分離。
缺點(diǎn):在主機(jī)出現(xiàn)問(wèn)題后不能自動(dòng)切換到備份機(jī),需要人工干涉更改IP地址。
3.1 概述
HA雙機(jī)熱備軟件將操作環(huán)境推廣到一種群集操作系統(tǒng)。群集是一種松散耦合的計(jì)算節(jié)點(diǎn)集合,提供網(wǎng)絡(luò)服務(wù)或應(yīng)用程序(包括數(shù)據(jù)庫(kù)、web 服務(wù)和文件服務(wù))的單一客戶視圖。
HA雙機(jī)熱備軟件的目標(biāo)是:
1:減少或消滅由軟件或硬件故障引起的系統(tǒng)停機(jī)時(shí)間
2:提供增強(qiáng)的系統(tǒng)可用性,能夠不必關(guān)掉整個(gè)群集就可執(zhí)行維護(hù)
3.2 Mysql+heartbeat方案拓?fù)鋱D
方案具體解釋:
本方案采用高可靠性的HA雙機(jī)熱備軟件來(lái)保證郵件服務(wù)的高穩(wěn)定性及連續(xù)性。默認(rèn)情況下兩臺(tái)mysql機(jī)器只有一臺(tái)機(jī)器在工作,當(dāng)工作機(jī)mysql主機(jī)出現(xiàn)問(wèn)題后,系統(tǒng)將自動(dòng)切換到mysql備機(jī)上繼續(xù)提供服務(wù),而整個(gè)過(guò)程只需要30秒的時(shí)間,當(dāng)mysql主機(jī)故障維修完畢后,服務(wù)將自動(dòng)切換回mysql主機(jī)上繼續(xù)提供服務(wù)。
3.3 Mysql+heartbeat優(yōu)缺點(diǎn)優(yōu)點(diǎn):安全性、穩(wěn)定性高,出現(xiàn)故障系統(tǒng)將自動(dòng)切換,從而保證服務(wù)的連續(xù)性。
缺點(diǎn):相對(duì)mysql replication成本提高,需要有存儲(chǔ)設(shè)備,同時(shí)由于多了存儲(chǔ)設(shè)備及雙機(jī)軟件。
4、Mysql+drbd+heartbeat
4.1 概述
此方案除了剛剛介紹完的heartbeat外,主要用了DRBD這個(gè)工具,DRBD是一種塊設(shè)備,可以被用于高可用(HA)之中.它類似于一個(gè)網(wǎng)絡(luò)RAID-1功能.當(dāng)你將數(shù)據(jù)寫(xiě)入本地文件系統(tǒng)時(shí),數(shù)據(jù)還將會(huì)被發(fā)送到網(wǎng)絡(luò)中另一臺(tái)主機(jī)上.以相同的形式記錄在一個(gè)文件系統(tǒng)中.
本地(主節(jié)點(diǎn))與遠(yuǎn)程主機(jī)(備節(jié)點(diǎn))的數(shù)據(jù)可以保證實(shí)時(shí)同步.當(dāng)本地系統(tǒng)出現(xiàn)故障時(shí),遠(yuǎn)程主機(jī)上還會(huì)保留有一份相同的數(shù)據(jù),可以繼續(xù)使用.
4.2 Mysql+drbd+heartbeat方案拓?fù)鋱D
4.3 Mysql+drbd+heartbeat優(yōu)缺點(diǎn)優(yōu)點(diǎn):安全性、穩(wěn)定性高,出現(xiàn)故障系統(tǒng)將自動(dòng)切換,從而保證服務(wù)的連續(xù)性,相對(duì)mysql+heartbeat+存儲(chǔ)來(lái)說(shuō)對(duì)大優(yōu)點(diǎn)是節(jié)約了存儲(chǔ)這個(gè)硬件設(shè)備。
缺點(diǎn):mysql主機(jī)宕機(jī),切換到備機(jī),備機(jī)接管服務(wù),待主機(jī)修復(fù)完配置failback機(jī)制的話會(huì)發(fā)生腦裂情況,需要手工執(zhí)行命令進(jìn)行主機(jī)接管。
5、Mysqlcluster
5.1 概述
MySQL集群是一種分布式設(shè)計(jì),目標(biāo)是要達(dá)到?jīng)]有任何單點(diǎn)故障點(diǎn)。因此,任何組成部分都應(yīng)該擁有自己的內(nèi)存和磁盤(pán)。任何共享存儲(chǔ)方案如網(wǎng)絡(luò)共享,網(wǎng)絡(luò)文件系統(tǒng)和SAN設(shè)備是不推薦或不支持的。通過(guò)這種冗余設(shè)計(jì),MySQL聲稱數(shù)據(jù)的可用度可以達(dá)到99。999%。
5.3 Mysqlcluster優(yōu)缺點(diǎn)優(yōu)點(diǎn):安全性、穩(wěn)定性高,可以在線增加節(jié)點(diǎn),官方聲稱可用度可達(dá)到99.999%。
缺點(diǎn):至少三個(gè)節(jié)點(diǎn),對(duì)主機(jī)的數(shù)量又要求,無(wú)形增加方案成本、對(duì)于數(shù)據(jù)節(jié)點(diǎn)要求內(nèi)存一直、對(duì)于引擎只能使用ndb、不支持外鍵功能、管理復(fù)雜
四、Mysql+heartbeat+存儲(chǔ)方案具體實(shí)施步驟環(huán)境:
nfs:192.168.184.103 as4u7
主機(jī)-cm5.3:192.168.184.124 10.0.0.1
備機(jī)-as5u3:192.168.184.102 10.0.0.2
注意:關(guān)閉防火墻,selinux
第一塊:nfs的搭建(在192.168.184.103上面)
[root@oracle ~]# vi /etc/exports
/data 192.168.184.*(rw,sync,no_root_squash)
[root@oracle ~]# service nfs start
[root@oracle ~]# exportfs -rv
#####################################################################
第二塊:mysql的安裝(主備機(jī)一樣)
# tar -zxvf mysql-5.0.67.tar.gz
# cd mysql-5.0.67
# groupadd mysql
# useradd -g mysql -s /sbin/nologin -M mysql
# ./configure –prefix=/usr/local/mysql (至于編譯參數(shù)很多,這里不枚舉)
# make && make install
# cp support-files/my-large.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod 755 /etc/rc.d/init.d/mysqld
加入服務(wù)隊(duì)列:
# chkconfig –add mysqld
# chown -R mysql.mysql /usr/local/mysql/
# /usr/local/mysql/bin/mysql_install_db –user=mysql
# chown -R mysql.mysql /usr/local/mysql/var
# /usr/local/mysql/bin/mysqld_safe –user=mysql &
*************************************************************************
配置庫(kù)文件搜索路徑
# echo “/usr/local/mysql/lib/mysql” >> /etc/ld.so.conf
# ldconfig
添加/usr/local/mysql/bin到環(huán)境變量PATH中
#echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/profile
#source /etc/profile
**************************************************************************
在執(zhí)行第三步之前,為了確保mysql+nfs的能否成功執(zhí)行,可以先測(cè)試一下,我這里是這么做的,①停掉原
先的mysql。②先在主機(jī)上面把nfs掛上來(lái)掛到/data目錄,③然后mv /usr/local/mysql/var /data/里面去
,④然后起mysql服務(wù),看能不能起來(lái),然后往里面建庫(kù)建表,再用備機(jī)掛nfs看主機(jī)建的庫(kù)和表是否存在,
這么來(lái)回測(cè)試。測(cè)試完就可以確定mysql+nfs是ok的了。底下出錯(cuò)專心找heartbeat的問(wèn)題。
#######################################################################
第三塊:heartbeat的安裝(主備機(jī)一樣,唯獨(dú)ha.cf里面的ucast那條信息)
tar -zxvf libnet.tar.gz
cd libnet
./configure
make && make install
tar -zxvf heartbeat-2.1.3.tar.gz
cd heartbeat-2.1.3
groupadd haclient
useradd -g haclient hacluster
./ConfigureMe configure
make && make install
配置雙機(jī)文件,一共需要三個(gè)文件(手工配置就行)–ha.cf、haresources、authkeys
# cd /etc/ha.d
[root@cm5 ha.d]# vi ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
auto_failback on
node as5u3
node cm5.3
udpport 694
ucast eth0 10.0.0.2
ping_group group1 192.168.184.102 192.168.184.124
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
hopfudge
[root@cm5 ha.d]# vi haresources
cm5.3 IPaddr::192.168.184.200/24/eth0Filesystem::192.168.184.103:/data::/data::nfs mysqld
[root@cm5 ha.d]# vi authkeys
auth 1
1 crc
[root@cm5 ha.d]# chmod 600 authkeys
##########################################################
第四步:測(cè)試
1、先停掉主備機(jī)的上面的mysql,卸掉nfs的掛載。
2、/etc/init.d/heartbeat start (主備機(jī)雙執(zhí)行)
3、可以看到主機(jī)的虛ip已經(jīng)起來(lái)了、nfs也掛上來(lái)了、mysql服務(wù)也已經(jīng)起來(lái)了(其實(shí)他們的起來(lái)的順序也
是這樣的,釋放資源是反順序,可以看/var/log/ha-log日志)
4、主機(jī)上寫(xiě)表,斷掉主機(jī)的網(wǎng)卡,主機(jī)釋放資源,備機(jī)起來(lái),所有的都在
5、主機(jī)網(wǎng)卡起來(lái),資源從備機(jī)釋放。
********************************************************************************************************************************************************************
第五步:意外情況
上面能成功那是因?yàn)槲业谋砀袷绞莔yisam的。但是用innodb卻是不成功的,主機(jī)把網(wǎng)卡斷了,備機(jī)mysql起不來(lái)。剛開(kāi)始以為是inndb的原因,后來(lái)才知道是nfs的鎖?。。?! (下面的是報(bào)錯(cuò)日志)
/var/log/mysql.log
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have anothermysqld process
InnoDB: using the same InnoDB data or log files.
/var/log/ha-log
ResourceManager[25602]: 2010/07/16_18:13:10 info:Running /etc/init.d/mysqld start
ResourceManager[25602]: 2010/07/16_18:13:41 ERROR:Return code 1 from /etc/init.d/mysqld
ResourceManager[25602]: 2010/07/16_18:13:41 CRIT:Giving up resources due to failure of mysqld
解決思路:
1.修改了mysql.sock文件存放的路徑不能全部放在共享的分區(qū)里面。(修改my.cnf)
2.既然修改mysql.sock路徑就得修改啟動(dòng)腳本的里面的配置,詳情見(jiàn)最后。
3.修改/etc/ha.d/haresource-------test1 IPaddr::192.168.122.13/24/eth0 nfsmysqld
4.在/etc/ha.d/resource.d/里面添加了一文件nfs ,主要作用就是設(shè)置nfs的mount
[root@test2 resource.d]# more nfs
#!/bin/sh
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGE
case “$1″ in
‘start’)
/bin/mount -onolock 192.168.122.12:/data /var/lib/mysql
;;
‘pre-start’)
;;
‘post-start’)
;;
‘stop’)
/bin/umount /var/lib/mysql
;;
‘pre-stop’)
;;
‘post-stop’)
;;
*)
echo “Usage: $0 { start | pre-start | post-start| stop | pre-stop | post-stop }”
;;
esac
exit 0
5.測(cè)試
我寫(xiě)了一個(gè)測(cè)試腳本,腳本意思通過(guò)建立log表,不斷往里面的插數(shù)據(jù),數(shù)據(jù)的順序依次是0、1、2……10000。
[root@test1 ~]# more test.sh
#!/bin/bash
i=0
while [ $i -lt 10000 ]
do
mysql --socket=/tmp/mysql.sock -e “insert intocm.log values (“$i”)”;
let i=i+1
echo “add $i to table log”
done
此時(shí)在主機(jī)上面執(zhí)行這個(gè)腳本,如下所示開(kāi)始往數(shù)據(jù)庫(kù)的log表里面插入數(shù)據(jù)了
[root@test1 ~]# ./test.sh
add 1 to table log
add 2 to table log
add 3 to table log
add 4 to table log
add 5 to table log
add 6 to table log
……
add 2026 to table log
到了插入到第2026的時(shí)候,斷開(kāi)主機(jī)的網(wǎng)卡。
查看備機(jī)mysql的log日志,看到備機(jī)的mysql的會(huì)有一個(gè)inndb檢查修復(fù)的操作。很快備機(jī)的mysql服務(wù)就起來(lái)了。
[root@test2 ~]#tail –f /var/log/mysql.log
100716 22:12:23 mysqld started
100716 22:12:23 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibdfiles...
InnoDB: Restoring possible half-written data pagesfrom the doublewrite
InnoDB: buffer...
100716 22:12:24 InnoDB: Starting log scan based on checkpoint at
InnoDB: log sequence number 0 17445609.
InnoDB: Doing recovery: scanned up to log sequencenumber 0 17451961
100716 22:12:25 InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: 29 30 31 32 33 34 35 3637 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 6263 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 8889 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
100716 22:12:25 InnoDB: Started; log sequence number 017451961
100716 22:12:25 [Note] /usr/libexec/mysqld:ready for connections.
Version: ’5.0.45′ socket: ‘/tmp/mysql.sock’ port: 3306 Source distribution
在進(jìn)入到備機(jī)的mysql,查看log表里面的數(shù)據(jù)一共有2027條,正截止到我們?cè)跀嚅_(kāi)主機(jī)執(zhí)行到的數(shù)字2026。
[root@test2 resource.d]# mysql --socket=/tmp/mysql.sock -e “select count(*) from cm.log”;
+----------+
| count(*) |
+----------+
| 2027 |
+----------+
聯(lián)系客服