原資源地址:http://wenku.baidu.com/link?url=oFEPOmW8BnQ0M0w0krS9D68yZYrvPXE_sStPnRq3MDn5UDHXEWOOxR0UfVFbFTjHw15ydP3xcE4tRFaN-nMOxTeprTHTH0nGHyzj_g-YFre node
方案 mysql |
技術方案 linux
mysql數據庫高可用性方案 web
撰寫人:陳明 2010-7-25 sql
目 錄 數據庫
TOC \o "1-3" \h \z I 綜述.............................................................................. PAGEREF _Toc18958 2 api
II 實現目標......................................................................... PAGEREF _Toc22134 2 安全
III 方案建設概要.................................................................... PAGEREF _Toc25440 2 bash
IV 可行性方案選擇................................................................... PAGEREF _Toc24402 9
V Mysql+heartbeat+共享存儲方案具體實施步驟.......................................... PAGEREF _Toc10681 9
數據庫位於現代企業應用的核心,它儲存了組織機構中最有價值的資產,包括客戶信息、產品信息、訂單信息和歷史數據。另外,組織機構依賴於數據庫來運行他們關鍵業務應用。幾小時甚至是幾分鐘的宕機,每每會形成收入的大量流失和客戶的不滿。所以,保證數據庫高可用是全部組織機構優先考慮的事情。對於但願在當今瞬息萬變的經濟環境立於不敗之地並取得成功的企業來講,構建一個具備高可用性的 IT 基礎架構相當重要。
經過技術手段實現mysql數據庫的高可用性,從而減小停工時間保證服務的正常穩定運行。
Mysql做爲一款開源軟件通過多年的發展,已經造成不少套實現高可用方案,而且均都投入生產使用,主要爲這幾種:mysql + replication 、mysql + heartbeat + 共享存儲、mysql + drbd + heartbeat 、 mysql cluster。如下將依次對各個方案進行分析。
Mysql的複製(Replication)是一個異步的複製,從一個Mysql instace(稱之爲Master)複製到另外一個Mysql instance(稱之Slave)。實現整個複製操做主要由三個進程完成的,其中兩個進程在Slave(Sql進程和IO進程),另一個進程在 Master(IO進程)上。
Mysql+replication主從複製拓撲圖
方案具體解釋:
要實施複製,首先必須打開Master端的binary log(bin-log)功能,不然沒法實現。由於整個複製過程實際上就是Slave從Master端獲取該日誌而後再在本身身上徹底順序的執行日誌中所記錄的各類操做。。
優勢:易實施、成本低、經濟實惠、後期維護方便,且因爲整套系統架構簡單,不涉及到存儲及雙機軟件,所以系統出現故障率很低。方便作到讀寫分離。
缺點:在主機出現問題後不能自動切換到備份機,須要人工干涉更改IP地址。
HA雙機熱備軟件將操做環境推廣到一種羣集操做系統。羣集是一種鬆散耦合的計算節點集合,提供網絡服務或應用程序(包括數據庫、web 服務和文件服務)的單一客戶視圖。
HA雙機熱備軟件的目標是:
1:減小或消滅由軟件或硬件故障引發的系統停機時間
2:提供加強的系統可用性,可以沒必要關掉整個羣集就可執行維護
方案具體解釋:
本方案採用高可靠性的HA雙機熱備軟件來保證服務的高穩定性及連續性。默認狀況下兩臺mysql機器只有一臺機器在工做,當工做機mysql主機出現問題後,系統將自動切換到mysql備機上繼續提供服務,而整個過程只須要30秒的時間,當mysql主機故障維修完畢後,服務將自動切換回mysql主機上繼續提供服務。
優勢:安全性、穩定性高,出現故障系統將自動切換,從而保證服務的連續性。
缺點:相對mysql replication成本提升,須要有共享存儲設備。
此方案除了剛剛介紹完的heartbeat外,主要用了DRBD這個工具,DRBD是一種塊設備,能夠被用於高可用(HA)之中.它相似於一個網絡RAID-1功能.當你將數據寫入本地
文件系統時,數據還將會被髮送到網絡中另外一臺主機上.以相同的形式記錄在一個文件系統中.
本地(主節點)與遠程主機(備節點)的數據能夠保證明時同步.當本地系統出現故障時,遠程主機上還會保留有一份相同的數據,能夠繼續使用.
優勢:安全性、穩定性高,出現故障系統將自動切換,從而保證服務的連續性,相對mysql+heartbeat+存儲來講對大優勢是節約了存儲這個硬件設備。
缺點:mysql主機宕機,切換到備機,備機接管服務,待主機修復完配置failback機制的話會發生腦裂狀況,須要手工執行命令進行主機接管。
MySQL集羣是一種分佈式設計,目標是要達到沒有任何單點故障點。所以,任何組成部分都應該擁有本身的內存和磁盤。任何共享存儲方案如網絡共享,網絡文件系統和SAN設備是不推薦或不支持的。經過這種冗餘設計,MySQL聲稱數據的可用度能夠達到99。999%。
優勢:安全性、穩定性高,能夠在線增長節點,官方聲稱可用度可達到99.999%。
缺點:至少三個節點,對主機的數量又要求,無形增長方案成本、對於數據節點要求內存一直、對於引擎只能使用ndb、不支持外鍵功能、管理複雜
在上面列出的四種方案,咱們都根據公司的對數據庫的生產要求,作了一些篩選。
mysql cluster 這個方案管理複雜ndb引擎的硬性要求凸顯出來的一些大的限制,咱們將此先作了排除。
Mysql replication 這個方案公司目前正在使用,可是對mysql的同步的主機的高可用沒有保障,固先保留。
Mysql + drbd + heartbeat這個方案雖然能方便的作到主機到備機的切換,也能節約硬件的成本,可是備機向主機回切的過程當中drbd的限制容易產生腦裂狀況,須手工執行命令,此方案也先保留。
最後就剩下了myslq + heartbeat + 共享存儲方案,此方案對硬件有要求須要一個共享存儲設備,在出現問題後的故障切換以及主機恢復資源的回切都表現的至關良好,固此方案將被優先考慮。
環境:
nfs:192.168.184.103 as4u7
主機-cm5.3:192.168.184.124 10.0.0.1
備機-as5u3:192.168.184.102 10.0.0.2
注意:關閉防火牆,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的安裝(主備機同樣)
# 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
# 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
加入服務隊列:
# 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 &
*************************************************************************
配置庫文件搜索路徑
# echo 「/usr/local/mysql/lib/mysql」 >> /etc/ld.so.conf
# ldconfig
添加/usr/local/mysql/bin到環境變量PATH中
#echo 「export PATH=$PATH:/usr/local/mysql/bin」 >> /etc/profile
#source /etc/profile
**************************************************************************
在執行第三步以前,爲了確保mysql+nfs的可否成功執行,能夠先測試一下,我這裏是這麼作的,①停掉原
先的mysql。②先在主機上面把nfs掛上來掛到/data目錄,③而後mv /usr/local/mysql/var /data/裏面去
,④而後起mysql服務,看能不能起來,而後往裏面建庫建表,再用備機掛nfs看主機建的庫和表是否存在,
這麼來回測試。測試完就能夠肯定mysql+nfs是ok的了。底下出錯專心找heartbeat的問題。
#######################################################################
第三塊:heartbeat的安裝
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
配置雙機文件,一共須要三個文件–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/eth0 Filesystem::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
##########################################################
第四步:測試
1、先停掉主備機的上面的mysql,卸掉nfs的掛載。
2、/etc/init.d/heartbeat start (主備機雙執行)
3、能夠看到主機的虛ip已經起來了、nfs也掛上來了、mysql服務也已經起來了
4、主機上寫表,斷掉主機的網卡,主機釋放資源,備機起來,全部的都在
5、主機網卡起來,資源從備機釋放。
********************************************************************************************************************************************************************
第五步:對於innodb表的操做
上面用myisam是能夠成功的。可是用innodb,主機把網卡斷了,備機mysql起不來。
/var/log/mysql.log
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld 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文件存放的路徑不能所有放在共享的分區裏面。(修改my.cnf)
2.既然修改mysql.sock路徑就得修改啓動腳本的裏面的配置,詳情見最後。
3.修改/etc/ha.d/haresource-------test1 IPaddr::192.168.122.13/24/eth0 nfs mysqld
4.在/etc/ha.d/resource.d/裏面添加了一文件 nfs ,主要做用就是設置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.測試
我寫了一個測試腳本,腳本意思經過創建log表,不斷往裏面的插數據,數據的順序依次是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 into cm.log values ("$i")";
let i=i+1
echo "add $i to table log"
done
此時在主機上面執行這個腳本,以下所示開始往數據庫的log表裏面插入數據了
[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的時候,斷開主機的網卡。
查看備機mysql的log日誌,看到備機的mysql的會有一個inndb檢查修復的操做。很快備機的mysql服務就起來了。
[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 .ibd files...
InnoDB: Restoring possible half-written data pages from 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 sequence number 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
InnoDB: Apply batch completed
100716 22:12:25 InnoDB: Started; log sequence number 0 17451961
100716 22:12:25 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.0.45' socket: '/tmp/mysql.sock' port: 3306 Source distribution
在進入到備機的mysql,查看log表裏面的數據一共有2027條,正截止到咱們在斷開主機執行到的數字2026。
[root@test2 resource.d]# mysql --socket=/tmp/mysql.sock -e "select count(*) from cm.log";
+----------+
| count(*) |
+----------+
| 2027 |
+----------+
總結:若是使用inndb引擎的話,須要去掉nfs的鎖限制,主機故障備機可以成功的取得資源,並起來相關的服務。