天天看點

CentOS下mysql的雙機熱備(轉 分享是一種美德)

CentOS下mysql的雙機熱備(轉 分享是一種美德)

heartbeat隻是起到了ip漂移的功能,但是實際應用當中必須要做到檔案和資料的實時同步,這裡我們來動手搭建一下mysql的雙機互備,及搭建過程中碰到的常見問題和解決方法。

mysql的雙機熱備其實是基于二進制日志檔案的,從伺服器讀取主伺服器的日志檔案然後更新,進而達到同步,具體過程是這樣的:mysql支援單向、異步複制,複制過程中要有一個主伺服器,一個或者多個充當從伺服器,主伺服器将更新寫入二進制日志檔案,并維護日志檔案的索引以跟蹤日志的循環,伺服器在日志中讀取最後一次更新的位置,從伺服器接收從那時起發起的任何更新,然後封鎖并等待主伺服器通知的下一次更新。

實際項目中兩台伺服器互為主備,當其中一台伺服器出現故障時,另外一台伺服器接管主伺服器上的應用(結合上一篇 結合上一篇:http://www.iamlintao.com/動手搭建centos下用heartbeat搭建雙機熱備/ 實作),此時便需要mysql的實時雙機互備。我的搭建過程如下:

伺服器環境:

主伺服器:

作業系統:centos6.4 (Linux 2.6.18-348.12.1.el5)

ip:10.0.0.211

web環境:wdcp搭建

mysql:5.1.69

備伺服器:

作業系統:centos6.4 (Linux 2.6.18-348.12.1.el5)

ip:10.0.0.212

web環境:wdcp搭建

mysql:5.1.69

建立同步賬号:

資料庫能互相通路受限要建立可以遠端登陸的賬号,通過這個遠端賬号才能實作資料同步。首先登陸mysql(登陸方法自行google),登陸mysql之後用以下指令建立遠端登陸賬号:

1 <span style="font-family: 'Times New Roman';">MySQL>GRANT all privileges ON *.* TO [email protected]'10.0.0.212' IDENTIFIED BY  '******'; </span>

這條指令是在主伺服器上自行的,備伺服器自己來寫就行。

文法解釋:

grant 權限1,權限2,…權限n on 資料庫名稱.表名稱 to 遠端登陸使用者名@遠端登陸位址 identified by ‘遠端登陸連接配接密碼’;

·權限1,權限2,…權限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14個權限。

·當權限1,權限2,…權限n被all privileges或者all代替,表示賦予使用者全部權限。

·當資料庫名稱.表名稱被*.*代替,表示賦予使用者操作伺服器上所有資料庫所有表的權限。

·使用者位址可以是localhost,也可以是ip位址、機器名字、域名。也可以用’%’表示從任何位址連接配接。

· ‘連接配接密碼’ 不能為空,否則建立失敗。

配置伺服器的資料庫參數:

對于wdcp來說,mysql的配置檔案在 /www/wdlinux/etc/my.cnf ;對于獨立安裝的mysql來說在 /etc/my.cnf下,用vi或者vim打開後按照如下配置:

1 log-bin=mysql-bin # 二進制檔案的開頭标示,必寫項
2 server-id= 1 # 主伺服器寫1,備伺服器寫2,必寫項,主備伺服器的一定不能相同
3 binlog-do-db=test # 主伺服器用,需要同步的資料庫,如果有多個自行複制多行
4 #binlog-ignore-db = mysql # 主伺服器用,不需要同步的資料庫,多個資料庫自行複制
5 master-host=10.0.0.212 # 允許同步伺服器的ip,雙機互備的情形下主伺服器寫備伺服器ip,備伺服器寫主伺服器ip
6 master-user=zuiw # 用于同步的賬号,在上一步中已經建立的那個遠端登陸賬号
7 master-password=****** # 用于同步賬号的密碼,在上一步建立遠端登陸賬号時候設定的密碼
8 master-port=3306 # 同步伺服器的mysql的端口
9 master-connect-retry=3 #同步的時間間隔,機關是秒
10 replicate-do-db=test # 備伺服器用,需要同步的資料庫,如果有多個自行複制多行
11 #replicate-ignore-db=test #備伺服器用,不需要同步的資料庫,如果有多個自行複制多行
12 slave-skip-errors=all # 忽略所有類型的錯誤
13 sync_binlog=1 # 每向二進制日志檔案寫入n條sql或n個食物後,這把二進制日志問及那的資料重新整理到新磁盤上,如果為0則不主動重新整理而有作業系統決定,為了保險起見,這裡建議寫成1
14 auto_increment_increment=1 # 控制列中的值的增量值
15 auto_increment_offset=1 # 控制AUTO_INCREMENT 列值的起點

以上配置為主伺服器的配置,了解了上面的這幾項,從伺服器就容易了,隻需要修改master-host和server-id即可,注意:這些項有的是存在的,有的是新增加的,有的是需要修改的,請自行核對。

執行同步:

·首先登陸伺服器重新開機mysql

1 service MySQLd restart

·然後停止同步、鎖定表、檢視讀取的二進制檔案和position的值,然後執行 CHANGE MASTER TO 指令,步驟如下:

1 MySQL>stop slave;   # 停止同步
2 MySQL>flush tables with read lock;  # 鎖定表為隻讀狀态
3 MySQL>SHOW MASTER STATUS; # 檢視主伺服器的日志名稱和position的值

注:如果出現“ Can’t execute the given command because you have active locked tables or an active transaction”字樣,則按照字面意思解決,執行先鎖定再停止,總之指令就這幾個,順序自己搞定。

從傳回結果擷取二進制的名和position的值:

CentOS下mysql的雙機熱備(轉 分享是一種美德)

CHANGE MASTER TO 這條指令把資料儲存到master.info檔案中去了,在資料庫存放的路徑下。

在主伺服器上的mysql指令下執行如下語句:

1 change master to master_host='10.0.0.212',master_user='zuiw',master_password='****',master_log_file='mysql-bin.000001', master_log_pos=1787;

可以這樣了解,以那個使用者/密碼讀取那個伺服器(ip)的那個檔案,從那個position開始讀取。格式說明:

change master to master_host=’主伺服器上寫備伺服器ip,備伺服器寫主伺服器ip’,master_user=’同步使用者名’,master_password=’同步密碼’,master_log_file=’上面擷取到的二進制檔案名’, master_log_pos=擷取到的position的值;

備伺服器自行編寫。

最後啟動同步:

1 MySQL>start slave;
2 MySQL>unlock tables;

如果正确,在主、備伺服器上分别寫入資料就能看到同步。

容易出現的幾個問題:

1. 同步使用者建立不成功

現象:執行“SHOW SLAVE STATUS;” 指令是傳回帶有“error connecting to master ‘[email protected]:3306′ – retry-time: 60  retries: 86400”字樣。

解決:提示說明連接配接到主/備伺服器失敗。在網上流傳有三種分析:網絡問題、配置問題、同步使用者寫錯了,除了這三個之外還可能有另外一種情況。用phpmyadmin可以打開mysql資料庫中的user表,如果成功建立同步賬戶則在user表中會 存在此使用者,如果建立失敗則不會存在;如果建立正确,執行“show processlist;”會得到如下:

CentOS下mysql的雙機熱備(轉 分享是一種美德)

注意這裡的同步所對應的host不是ip而是搭建伺服器時候設定的伺服器名(結合上一篇:http://www.iamlintao.com/動手搭建centos下用heartbeat搭建雙機熱備/),是以連接配接不上可以考慮是不是host檔案有問題,但是我發現我的host上是這樣寫的“127.0.0.1 localhost localhost.localdomain localhost”,于是改成“127.0.0.1 localhost.localdomain localhost”後再建立同步賬戶成功。

2.日志重置

現象:經過多次的測試或者試驗會出現多個日志,需要重新設定。

解決:在mysql下執行

1 mysql>reset master;   #清除日志
2 mysql><code>purge binary logs to </code><code>'mysql-bin.000018'</code><code>; # 删除mysql-bin.000018之前的日志</code>

或者直接用ssh工具登陸到伺服器直接删除 master.info、 mysql-bin.000001、 mysql-bin.index、 relay-log.info 這幾個檔案,重新開機mysql後會自己生成。

3.在沒有解鎖的情況下停止slave程序:

1 mysql> stop slave;
2 ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction

 4.change master文法錯誤,落下逗号

1 mysql> change master to
2
3 -> master_host='IP'
4  -> master_user='USER',
5  -> master_password='PASSWD',
6  -> master_log_file='mysql-bin.000002',
7  -> master_log_pos=106;
8  ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version     for the right syntax to use near 'master_user='USER',
9  master_password='PASSWD',
10  master_log_file='mysql-bin.000002' at line 3

  5.在沒有停止slave程序的情況下change master

檢視源代碼列印 幫助

1 mysql> change master to master_host=‘IP', master_user='USER', master_password='PASSWD', master_log_file='mysql-    bin.000001',master_log_pos=106;
2
3 ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first

6.A B的server-id相同:

1 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;
2 these ids must be different for replication to work (or the --replicate-same-server-id option must be used on
3 slave but this does not always make sense; please check the manual before using it).
4 檢視server-id
5 mysql> show variables like 'server_id';
6 手動修改server-id
7 mysql> set global server_id=2; #此處的數值和my.cnf裡設定的一樣就行
8 mysql> slave start;

最後:調試期間可以借助phpmyadmin、SSH Secure Shell 等工具,便于解決問題。

轉載請注明來自:http://www.iamlintao.com/親測centos下實作mysql雙機互備/

繼續閱讀