MySQL高可用之DRBD + Heartbeat + MySQL

來源:互聯網
上載者:User

MySQL高可用之DRBD + Heartbeat + MySQL
1. 架構Mysql:

master<=slave

10.24.6.4:3306<=10.24.6.6:3306

VIP:

10.24.6.20

必須使得VIP和mysql處於同一網段,否則無法ping通過

2. 參考文檔

3. DRBD 共用記憶體設定

共用硬碟/dev/sdb1

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

 

3.2. 修改hosts檔案和主機名稱

在10.24.6.4上

echo "10.24.6.4 drbd01" >> /etc/hosts

echo "drbd01" > /etc/hostname

在10.24.6.6上

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會自動幫我們做好這些事,它會監聽服務,一旦服務停止,則從服務會接管服務)

更多詳情見請繼續閱讀下一頁的精彩內容:

  • 1
  • 2
  • 下一頁

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.