
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的值:
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;”會得到如下:
注意這裡的同步所對應的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雙機互備/