mysql數據庫高可用性方案

原資源地址: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

III.1 現有高可用方案分析................................................................................................. PAGEREF _Toc31216 2 網絡

III.2 Mysql+replication....................................................................................................... PAGEREF _Toc17227 2

III.2.1 概述............................................................................................................... PAGEREF _Toc12618 2

III.2.2 Mysql replication方案拓撲圖............................................................................. PAGEREF _Toc30092 3

III.2.3 Mysql+replication優缺點................................................................................... PAGEREF _Toc30904 4

III.3 mysql + heartbeat + 共享存儲..................................................................................... PAGEREF _Toc20299 4

III.3.1 概述............................................................................................................... PAGEREF _Toc31614 4

III.3.2 Mysql+heartbeat+共享存儲方案拓撲圖................................................................ PAGEREF _Toc13967 5

III.3.3 Mysql+heartbeat+共享存儲優缺點...................................................................... PAGEREF _Toc6162 6

III.4 Mysql+drbd+heartbeat................................................................................................. PAGEREF _Toc1622 6

III.4.1 概述............................................................................................................... PAGEREF _Toc25168 6

III.4.2 Mysql+drbd+heartbeat方案拓撲圖...................................................................... PAGEREF _Toc31872 7

III.4.3 Mysql+drbd+heartbeat優缺點............................................................................. PAGEREF _Toc31814 7

III.5 Mysql cluster............................................................................................................. PAGEREF _Toc18407 8

III.5.1 概述............................................................................................................... PAGEREF _Toc8798 8

III.5.2 Mysql cluster方案拓撲圖.................................................................................. PAGEREF _Toc16471 8

III.5.3 Mysql cluster優缺點......................................................................................... PAGEREF _Toc28155 9

IV 可行性方案選擇................................................................... PAGEREF _Toc24402 9

V Mysql+heartbeat+共享存儲方案具體實施步驟.......................................... PAGEREF _Toc10681 9


I 綜述

數據庫位於現代企業應用的核心,它儲存了組織機構中最有價值的資產,包括客戶信息、產品信息、訂單信息和歷史數據。另外,組織機構依賴於數據庫來運行他們關鍵業務應用。幾小時甚至是幾分鐘的宕機,每每會形成收入的大量流失和客戶的不滿。所以,保證數據庫高可用是全部組織機構優先考慮的事情。對於但願在當今瞬息萬變的經濟環境立於不敗之地並取得成功的企業來講,構建一個具備高可用性的 IT 基礎架構相當重要。

II 實現目標

經過技術手段實現mysql數據庫的高可用性,從而減小停工時間保證服務的正常穩定運行。

III 方案建設概要

III.1 現有高可用方案分析

Mysql做爲一款開源軟件通過多年的發展,已經造成不少套實現高可用方案,而且均都投入生產使用,主要爲這幾種:mysql + replication mysql + heartbeat + 共享存儲、mysql + drbd + heartbeat mysql cluster。如下將依次對各個方案進行分析。

III.2 Mysql+replication

III.2.1 概述

Mysql的複製(Replication)是一個異步的複製,從一個Mysql instace(稱之爲Master)複製到另外一個Mysql instance(稱之Slave)。實現整個複製操做主要由三個進程完成的,其中兩個進程在SlaveSql進程和IO進程),另一個進程在 MasterIO進程)上。

III.2.2 Mysql replication方案拓撲圖

Mysql+replication主從複製拓撲圖

 

方案具體解釋:

要實施複製,首先必須打開Master端的binary logbin-log)功能,不然沒法實現。由於整個複製過程實際上就是SlaveMaster端獲取該日誌而後再在本身身上徹底順序的執行日誌中所記錄的各類操做。。

III.2.3 Mysql+replication優缺點

優勢:易實施、成本低、經濟實惠、後期維護方便,且因爲整套系統架構簡單,不涉及到存儲及雙機軟件,所以系統出現故障率很低。方便作到讀寫分離。

缺點:在主機出現問題後不能自動切換到備份機,須要人工干涉更改IP地址。

 

III.3 mysql + heartbeat + 共享存儲

III.3.1 概述

HA雙機熱備軟件將操做環境推廣到一種羣集操做系統。羣集是一種鬆散耦合的計算節點集合,提供網絡服務或應用程序(包括數據庫、web 服務和文件服務)的單一客戶視圖。

HA雙機熱備軟件的目標是:

1:減小或消滅由軟件或硬件故障引發的系統停機時間

2:提供加強的系統可用性,可以沒必要關掉整個羣集就可執行維護

 

 

III.3.2 Mysql+heartbeat+共享存儲方案拓撲圖

方案具體解釋:

本方案採用高可靠性的HA雙機熱備軟件來保證服務的高穩定性及連續性。默認狀況下兩臺mysql機器只有一臺機器在工做,當工做機mysql主機出現問題後,系統將自動切換到mysql備機上繼續提供服務,而整個過程只須要30秒的時間,當mysql主機故障維修完畢後,服務將自動切換回mysql主機上繼續提供服務。

III.3.3 Mysql+heartbeat+共享存儲優缺點

優勢:安全性、穩定性高,出現故障系統將自動切換,從而保證服務的連續性。

缺點:相對mysql replication成本提升,須要有共享存儲設備。

 

 

III.4 Mysql+drbd+heartbeat

III.4.1 概述

此方案除了剛剛介紹完的heartbeat外,主要用了DRBD這個工具,DRBD是一種塊設備,能夠被用於高可用(HA)之中.它相似於一個網絡RAID-1功能.當你將數據寫入本地

文件系統時,數據還將會被髮送到網絡中另外一臺主機上.以相同的形式記錄在一個文件系統中.

本地(主節點)與遠程主機(備節點)的數據能夠保證明時同步.當本地系統出現故障時,遠程主機上還會保留有一份相同的數據,能夠繼續使用.

III.4.2 Mysql+drbd+heartbeat方案拓撲圖

 

III.4.3 Mysql+drbd+heartbeat優缺點

優勢:安全性、穩定性高,出現故障系統將自動切換,從而保證服務的連續性,相對mysql+heartbeat+存儲來講對大優勢是節約了存儲這個硬件設備。

缺點mysql主機宕機,切換到備機,備機接管服務,待主機修復完配置failback機制的話會發生腦裂狀況,須要手工執行命令進行主機接管。

 

 

III.5 Mysql cluster

III.5.1 概述

MySQL集羣是一種分佈式設計,目標是要達到沒有任何單點故障點。所以,任何組成部分都應該擁有本身的內存和磁盤。任何共享存儲方案如網絡共享,網絡文件系統和SAN設備是不推薦或不支持的。經過這種冗餘設計,MySQL聲稱數據的可用度能夠達到99999%

III.5.2 Mysql cluster方案拓撲圖

 

III.5.3 Mysql cluster優缺點

優勢:安全性、穩定性高,能夠在線增長節點,官方聲稱可用度可達到99.999%

缺點:至少三個節點,對主機的數量又要求,無形增長方案成本、對於數據節點要求內存一直、對於引擎只能使用ndb、不支持外鍵功能、管理複雜

 

 

IV 可行性方案選擇

在上面列出的四種方案,咱們都根據公司的對數據庫的生產要求,作了一些篩選。

mysql cluster 這個方案管理複雜ndb引擎的硬性要求凸顯出來的一些大的限制,咱們將此先作了排除。

Mysql replication 這個方案公司目前正在使用,可是對mysql的同步的主機的高可用沒有保障,固先保留。

Mysql + drbd + heartbeat這個方案雖然能方便的作到主機到備機的切換,也能節約硬件的成本,可是備機向主機回切的過程當中drbd的限制容易產生腦裂狀況,須手工執行命令,此方案也先保留。

最後就剩下了myslq + heartbeat + 共享存儲方案,此方案對硬件有要求須要一個共享存儲設備,在出現問題後的故障切換以及主機恢復資源的回切都表現的至關良好,固此方案將被優先考慮。

 

V Mysql+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+nfsok的了。底下出錯專心找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.cfharesourcesauthkeys

# 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 ,主要做用就是設置nfsmount

[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表,不斷往裏面的插數據,數據的順序依次是012……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的時候,斷開主機的網卡。

 

 

查看備機mysqllog日誌,看到備機的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的鎖限制,主機故障備機可以成功的取得資源,並起來相關的服務。

相關文章
相關標籤/搜索