mysql高可用之DRBD + HEARTBEAT + MYSQL

1. 架構

Mysql:

master<=slavephp

10.24.6.4:3306<=10.24.6.6:3306html

VIP:

10.24.6.20node

必須使得VIP和mysql處於同一網段,不然沒法ping經過mysql

 

2. 參考文檔

http://wenku.baidu.com/link?url=QF1pG6DGMtl2uV1yt998xCduKsiEO7Bwn4CW79g0nx6EUw4iNgcBUz_jAA1W0FigPhjpiIs8FPLc9TxvFq_Yx7G-VvWeikFLzZchifM_tSSlinux


3. DRBD 共享內存設置

共享硬盤/dev/sdb1程序員

3.1. 建立一個新硬盤/dev/sdb1可是不要掛載任何目錄

 

 

3.2. 修改hosts文件和主機名

在10.24.6.4上sql

echo "10.24.6.4 drbd01" >> /etc/hosts數據庫

echo "drbd01" > /etc/hostnamevim

在10.24.6.6上api

echo "10.24.6.6 drbd02" >> /etc/hosts

echo "drbd02" > /etc/hostname

3.3.安裝drbd

在10.24.6.4/10.24.6.6上

sudo apt-get install drbd8-utils

 

3.4.配置drbd.conf(/etc/drbd.conf)的配置文件(主從都要作)

vim /etc/drbd.conf默認信息爲:

       include "/etc/drbd.d/global_common.conf";

   include "/etc/drbd.d/*.res";  

這樣你須要去配置global_common.conf以及新建一個以res結尾的資源文件,這裏爲r0.res

3.5. 配置global_common.conf(主從都要作)

vim /etc/drbd.d/global_common.conf 

 

global {  

usage-count no;   //幫LINBIT公司統計drbd使用量 } 

common {  

protocol C;//C爲最安全同時也是性能最好的一種確認寫操做完成的方法 

syncer {   

rate 100M;     //同步的速率 

}

 }        

3.6.配置ro.res(主從都要作)

sudo vim /etc/drbd.d/r0.res

resource r0 {//r0資源名稱,之後不少地方會用到

         on drbd01 {

                   device       /dev/drbd0;               //邏輯設備的路徑

                   disk  /dev/sdb1;                 //物理設備

                   address    10.24.6.4:7788;       //主節點

                   meta-disk internal;

         }

         on drbd02 {

                   device       /dev/drbd0;

                   disk  /dev/sdb1;

                   address    10.24.6.6:7788;       //從節點

                   meta-disk internal;

         }

}

不能夠有註釋

3.7. 初始化drbd的metadata(在主節點上操做)

10.24.6.4:

Sudo drbdadm create-md r0

 

3.8. 錯誤處理

   

執行以下命令: dd if=/dev/zero bs=1M count=1 of=/dev/sdb1;sync 

再次執行drbdadm create-md r0看到success則表示成功。

   

3.9. 啓動drbd服務(主從都執行)

/etc/init.d/drbd start

 

cat /proc/drbd 

ro:Secondary/ Secondary表示尚未創建主盤

ds:Inconsistent/Inconsistent表示兩節點(master/slave)的邏輯設備(即/dev/drbd0)中的數據未同步

本地和對等節點的硬盤有可能爲下列狀態之一:
Diskless 無盤:本地沒有塊設備分配給DRBD使用,這表示沒有可用的設備,或者使用drbdadm命令手工分離或是底層的I/O錯誤致使自動分離
Attaching:讀取無數據時候的瞬間狀態
Failed 失敗:本地塊設備報告I/O錯誤的下一個狀態,其下一個狀態爲Diskless無盤
Negotiating:在已經鏈接的DRBD設置進行Attach讀取無數據前的瞬間狀態
Inconsistent:數據是不一致的,在兩個節點上(初始的徹底同步前)這種狀態出現後當即建立一個新的資源。此外,在同步期間(同步目標)在一個節點上出現這種狀態
Outdated:數據資源是一致的,可是已通過時
DUnknown:當對等節點網絡鏈接不可用時出現這種狀態
Consistent:一個沒有鏈接的節點數據一致,當創建鏈接時,它決定數據是UpToDate或是Outdated
UpToDate:一致的最新的數據狀態,這個狀態爲正常狀態

3.10. 端口檢測

10.24.6.4:

10.24.6.6:

 

3.11. 初始化網絡硬盤(主節點執行)

drbdadm -- --overwrite-data-of-peer primary r0

 

查看同步進度

cat /proc/drbd 

ds:UpToDate/Inconsistent表示兩節點正在同步數據

3.12. 啓用和禁用資源(沒必要須)

######手動啓用資源 
drbdadm up <resource> 
######手動禁用資源 
drbdadm down <resource> 
註釋: 
resource:爲資源名稱;固然也可使用all表示[停用|啓用]全部資源

3.13. 升級和降級資源(沒必要須)

######升級資源 
drbdadm primary <resource> 
######降級資源 
drbdadm secondary <resource> 
註釋:在單主模式下的DRBD,兩個節點同時處於鏈接狀態,任何一個節點均可以在特定的時間內變成主;但兩個節點中只能一爲主,若是已經有一個主,需先降級纔可能升級;在雙主模式下沒有這個限制

3.14. 如何查看資源鏈接狀態

[root@nod1 ~]# drbdadm cstate r0  #r0爲資源名稱 
Connected

   

狀態意義:

資源的鏈接狀態;一個資源可能有如下鏈接狀態中的一種
StandAlone 獨立的:網絡配置不可用;資源尚未被鏈接或是被管理斷開(使用 drbdadm disconnect 命令),或是因爲出現認證失敗或是腦裂的狀況
Disconnecting 斷開:斷開只是臨時狀態,下一個狀態是StandAlone獨立的
Unconnected 懸空:是嘗試鏈接前的臨時狀態,可能下一個狀態爲WFconnection和WFReportParams
Timeout 超時:與對等節點鏈接超時,也是臨時狀態,下一個狀態爲Unconected懸空
BrokerPipe:與對等節點鏈接丟失,也是臨時狀態,下一個狀態爲Unconected懸空
NetworkFailure:與對等節點推進鏈接後的臨時狀態,下一個狀態爲Unconected懸空
ProtocolError:與對等節點推進鏈接後的臨時狀態,下一個狀態爲Unconected懸空
TearDown 拆解:臨時狀態,對等節點關閉,下一個狀態爲Unconected懸空
WFConnection:等待和對等節點創建網絡鏈接
WFReportParams:已經創建TCP鏈接,本節點等待從對等節點傳來的第一個網絡包
Connected 鏈接:DRBD已經創建鏈接,數據鏡像如今可用,節點處於正常狀態
StartingSyncS:徹底同步,有管理員發起的剛剛開始同步,將來可能的狀態爲SyncSource或PausedSyncS
StartingSyncT:徹底同步,有管理員發起的剛剛開始同步,下一狀態爲WFSyncUUID
WFBitMapS:部分同步剛剛開始,下一步可能的狀態爲SyncSource或PausedSyncS
WFBitMapT:部分同步剛剛開始,下一步可能的狀態爲WFSyncUUID
WFSyncUUID:同步即將開始,下一步可能的狀態爲SyncTarget或PausedSyncT
SyncSource:以本節點爲同步源的同步正在進行
SyncTarget:以本節點爲同步目標的同步正在進行
PausedSyncS:以本地節點是一個持續同步的源,可是目前同步已經暫停,多是由於另一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步
PausedSyncT:以本地節點爲持續同步的目標,可是目前同步已經暫停,這能夠是由於另一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步
VerifyS:以本地節點爲驗證源的線上設備驗證正在執行
VerifyT:以本地節點爲驗證目標的線上設備驗證正在執行

3.15. 資源同步完成

10.24.6.4:

10.24.6.6:

3.16. 數據同步測試

如今將磁盤格式化後並能夠向其中寫數據,這些數據會同步到從節點中

 

mkfs.ext4 /dev/drbd0 

mount /dev/drbd0 /mnt/data 

(注意:只有主盤節點才能掛載磁盤) 

cd /mnt/data 

mkdir testfile                 //新建名爲testfile的測試文件 

umount /dev/drbd0           //卸載磁盤 

drbdadm secondary r0         //主降爲次,即剛開始主節點的磁盤是主盤,如今降爲從盤,往主盤裏寫數據,從從盤裏讀數據。 在drbd02上(從節點) 

drbdadm primary r0            //次升爲主,即將從節點的磁盤升爲主盤資格這樣才能從從節點的機器讀取磁盤的數據。 

mount /dev/drbd0 /mnt/data    //升主後纔有掛在權限 cd /mnt/data ls –l 

將會看到咱們在主節點中創建的名爲testfile的文件夾。 (囉嗦一下: 

要想完成主從Mysql數據的備份,到這裏你們應該有點啓發了,我麼只須要將Mysql的數據保存到/mnt/data(咱們將/dev/drbd0掛在的路徑)中便可這樣主Mysql往這個區域寫數據,drbd會幫咱們自動將這些數據同步到從節點中,這樣裝在從節點機

器上的Mysql也從這裏讀取數據。這樣便實現了兩份數據的自動備份。 )

 

 

3.17. 問題

主降爲次失敗:

 

由於降級的自己的目錄正在使用

4. MYSQL 設置

4.1. 更改Mysql數據庫的存儲位置爲共享目錄(主從都執行)

默認狀況下數據庫的存儲位置是/var/lib/mysql(能夠在/etc/mysql/my.cnf中的datadir位置找到),如今要將其改成存在/share_mysql下。

 

將/var/lib/mysql下的數據複製到/share_mysql下

 cp -r /var/lib/mysql   /share_mysql 

vim /etc/mysql/my.cnf 

找到datadir這一行將其值改成/share_mysql/mysq

4.2. 賦予數據庫用戶訪問權限

 

4.3. 系統級別修改權限

140602 22:36:39 mysqld_safe Starting mysqld daemon with databases from /home/mysql

140602 22:36:39 [Warning] Can't create test file /home/mysql/localhost.lower-test

140602 22:36:39 [Warning] Can't create test file /home/mysql/localhost.lower-test

/usr/libexec/mysqld: Can't change dir to '/home/mysql/' (Errcode: 13)

140602 22:36:39 [ERROR] Aborting

 

140602 22:36:39 [Note] /usr/libexec/mysqld: Shutdown complete

 

140602 22:36:39 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

 

你已經修改了my.cnf中的datadir的值
你已經chown和chmod了數次新數據目錄或者其父路徑的屬主和權限
你無數次地試圖service mysql start,或者 /etc/init.d/mysql start,以及mysql_install_db!

恭喜你看見這篇文章,我在被系統坑了幾個小時以後,找到了解決的方法。

這個緣由有二,其中任意的一個緣由都會形成你被系統告知這個warning。若是你不是一個專業的linux系統安全工程師,或者你只是個PHP程序員,並無對系統安全有深刻的研究,你就不會太容易找到它的答案。

第一,selinux,記得當年唸書時,字符界面安裝redhat(很古老的操做系統麼。。。)的時候,有這麼一個選項,一般你們都聽取前輩的建議,改變默認值以不安裝它。但若是你剛好要操做的這臺機器開着selinux,它確實可以使你的mysql沒法在新目標位置進行mysql_install_db的操做,並爆出標題所示的警告。一個簡單的解決辦法是使用命令暫時關閉selinux,以便讓你的操做能夠繼續下去
setenforce 0
但最好使用一個永久方法,以便在重啓後繼續不要這貨。
修改/etc/selinux/config文件中設置SELINUX=disabled ,而後重啓或等待下次重啓。

第二,apparmor,這個坑爹貨和selinux同樣的坑爹,它也對mysql所能使用的目錄權限作了限制
在 /etc/apparmor.d/usr.sbin.mysqld 這個文件中,有這兩行,規定了mysql使用的數據文件路徑權限

/var/lib/mysql/ r,
/var/lib/mysql/** rwk,

你必定看到了,/var/lib/mysql/就是以前mysql安裝的數據文件默認路徑,apparmor控制這裏mysqld可使用的目錄的權限
我想把數據文件移動到/data/mysql下,那麼爲了使mysqld可使用/data/mysql這個目錄,照上面那兩條,增長下面這兩條就能夠了

/data/mysql/ r,
/data/mysql/** rwk,

重啓apparmor,/etc/init.d/apparmor restart
以後,就能夠順利地幹你想幹的事兒了!

4.4. 數據庫同步測試

在10.24.6.4上啓動mysql 創建一個名爲share_mysql的數據庫。

第一步保證10.24.6.4爲primary,10.24.6.6爲secondary

 

主從切換掛載

service mysql stop        # 關閉mysql服務

drbdadm secondary r0            # 將10.24.6.4降爲備用

umount /dev/drbd0                  # 卸載虛擬硬盤

在drbd02上 

drbdadm primary r0     #將10.24.6.6升爲主用

mount /dev/drbd0      # 掛載虛擬硬盤

service mysql start       # 啓動數據庫

進去mysql中查看是否已有從drbd01同步過來的名爲test的數據庫。

OK至此測試就完成了。 

 

(囉嗦下:聰明的讀者可能會問,每次都這樣操做效率也過低了吧,對的,接下來heartbeat會自動幫咱們作好這些事,它會監聽服務,一旦服務中止,則從服務會接管服務)

 

5.HEARTBEAT設置

讓虛擬硬盤的主從切換更智能

5.1. 安裝heartbeat

apt-get install heartbeat

(ps: Heartbeat的主要配置文件有ha.cf、haresources和authkeys。在Heartbeat安裝後,默認並無這3個文件,能夠從官方網站下載獲得,也能夠直接從解壓的源碼目錄中找到)

5.2. 配置文件

5.3. 配置ha.cf.

sudo cp /usr/share/doc/heartbeat/ha.cf.gz  / etc/ha.d

sudo gzip -d ha.cf.gz

sudo vim ha.cf:

logfacility local0 #這個是設置heartbeat的日誌,這裏是用的系統日誌

keepalive 500ms #多長時間檢測一次 

deadtime 10 #連續多長時間聯繫不上後認爲對方掛掉了(單位是妙)

warntime 5 #連續多長時間聯繫不上後開始警告提示 

initdead 100 #這裏主要是給重啓後預留的一段忽略時間段(好比:重啓後啓動網絡等,  若是在網絡尚未通,

keepalive檢測確定通不過,但這時候並不能切換)

bcast eth0 

auto_failback off #恢復正常後是否須要再自動切換回來 

node drbd01 #節點名(必須是集羣中機器的主機名,經過uname -n取得)

node drbd02 #節點名(必須是集羣中機器的從機名,經過uname -n取得)  

ping 10.0.65.250(默認網關,能夠經過route命令獲得) 

respawn root /usr/lib/heartbeat/ipfail #這裏是配置ip綁定和切換的功能, ipfail就是控制ip切換的程序 

apiauth ipfail gid=root uid=root #控制ip切換的時候所使用的用戶  deadping 5

5.4. 配置資源文件/etc/ha.d/haresources

sudo cp /usr/share/doc/heartbeat/haresources.gz  /etc/ha.d/

cd /etc/ha.d

sudo gzip -d haresources.gz

   

Haresources文件用於指定雙機系統的主節點、集羣IP、子網掩碼、廣播地址以 及啓動的服務等集羣資源,文件每一行能夠包含一個或多個資源腳本名,資源之間使用空格隔開,參數之間使用兩個冒號隔開,在兩個HA節點上該文件必須徹底一致,此文件的通常格式爲:  

node-name network  <resource-group>    node-name表示主節點的主機名,必須和ha.cf文件中指定的節點名一致。network用於設定集羣的IP地址、子網掩碼和網絡設備標識等。須要注意的是,這裏指定的IP地址就是集羣對外服務的IP地址,resource-group用來指定須要Heartbeat託管的服務,也就是這些服務能夠由Heartbeat來啓動和關閉。若是要託管這些服務,就必須將服務寫成能夠經過start/stop來啓動和關閉的腳步,而後放到/etc /init.d/或者/etc/ha.d/resource.d/目錄下,Heartbeat會根據腳本的名稱自動去/etc/init.d或者/etc /ha.d/resource.d/目錄下找到相應腳步進行啓動或關閉操做。

下面對配置方法進行具體說明:  

drbd01 IPaddr::192.68.100.120/24/eth0:0 drbddisk::r0 

Filesystem::/dev/drbd0::/mnt/data::ext4 mysql 

(ps:在上面的例子中,提供了對mysql資源的啓動和關閉,因此須要在/etc/ha.d/resource.d這個目錄下去建立一個控制該資源啓動腳本,命令爲: ln -s /etc/init.d/mysql /etc/ha.d/resource.d/mysql) 

其中,drbd01是HA集羣的主節點,IPaddr爲heartbeat自帶的一個執行腳本,Heartbeat首先將執行/etc/ha.d/resource.d/IPaddr 192.68.100.120/24 start的操做,也就是虛擬出一個子網掩碼爲255.255.255.0,IP爲192.68.100.120的地址。此IP爲Heartbeat對外提供服務的網絡地址,同時指定此IP使用的網絡接口爲eth0。接着,Heartbeat將執行共享磁盤分區的掛載操做,"Filesystem::/dev/drbd0::/mnt/data::ext4"至關於在命令行下執行mount操做,即"mount -t ext4 /dev/drbd0 /mnt/data",最後mysql服務。 注意主節點和備份節點中資源文件haresources要徹底同樣。 所以對於咱們應該這樣寫 

drbd01 IPaddr::192.68.100.120/24/eth0:0 

drbddisk::r0 

Filesystem::/dev/drbd0::/mnt/data::ext4 mysql 不要寫成以下這樣: 

drbd01 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/data::ext4 mysql192.68.100.120 

會報heartbeat Cannot use default route w/o netmask的錯誤,具體緣由見: http://lists.linux-ha.org/pipermail/linux-ha/2002-November/005911.html

 

drbd01  IPaddr::10.24.6.20/24/eth0:0    drbddisk::r0    Filesystem::/dev/drbd0::/share_mysql::ext4      mysql

 

 

5.5. 配置資源文件/etc/ha.d/authkeys

sudo cp /usr/share/doc/heartbeat/authkeys  /etc/ha.d/

authkeys文件用於設定Heartbeat的認證方式,共有3種可用的認證方式,即 crc、 md5和sha1。3種認證方式的安全性依次提升,可是佔用的系統資源也依次增長。若是Heartbeat集羣運行在安全的網絡上,可使用 crc方式;若是HA每一個節點的硬件配置很高,建議使用sha1,這種認證方式安全級別最高;若是是處於網絡安全和系統資源之間,可使用md5認證方式。這裏咱們使用crc認證方式,設置以下:        auth 1       1 crc        #2 sha1 sha1_any_password       #3 md5 md5_any_password  

須要說明的一點是:不管auth後面指定的是什麼數字,在下一行必須做爲關 鍵字再次出現,例如指定了"auth 6",下面必定要有一行"6 認證類型"。   

最後確保這個文件的權限是600(即-rw——-)。

  

5.6. 啓動heartbeat

5.7. 啓動主heartbeat

啓動日誌:

5.8. 啓動從heartbeat

啓動日誌

 

主heartbeat日誌:

5.9. 驗證

5.9.1. 主heartbeat端口檢測

5.9.2.  從heartbeat端口檢測

5.9.3.  主heartbeat服務狀態

5.9.4. 從heartbeat服務狀態

 

5.9.5. 測試vip mysql服務

 

 

5.10. Mysql服務切換測試

5.10.1. 在主heaartbeat服務之上切換

5.10.2. Heartbea服務轉移

5.10.3. 轉移驗證

主drbd變成從drbd

從drbd變成主drbd

主heartbeat機器上沒有mysql服務

從heartbeat機器上開啓mysql服務

 

6. 總結

  • 主mysql和從mysql只能同時存在一個服務
  • 主mysql掛的時候,heartbeat將經過drbd共享mysql的數據,而後在從heartbeat啓動一個新服務
  • 主mysql和從mysql能夠轉移
  • 主節點在正常狀況下佔用資源並運行全部的服務,遇到故障時把資源交給從節點並由從節點運行服務
  • 適合作雙機熱備
  • share disk架構
相關文章
相關標籤/搜索