heartbeat只是起到了ip漂移的功能,可是實際應用當中必需要作到文件和數據的實時同步,這裏咱們來動手搭建一下mysql的雙機互備,及搭建過程當中碰到的常見問題和解決方法。 php
mysql的雙機熱備實際上是基於二進制日誌文件的,從服務器讀取主服務器的日誌文件而後更新,從而達到同步,具體過程是這樣的:mysql支持單向、異步複製,複製過程當中要有一個主服務器,一個或者多個充當從服務器,主服務器將更新寫入二進制日誌文件,並維護日誌文件的索引以跟蹤日誌的循環,服務器在日誌中讀取最後一次更新的位置,從服務器接收從那時起發起的任何更新,而後封鎖並等待主服務器通知的下一次更新。 mysql
實際項目中兩臺服務器互爲主備,當其中一臺服務器出現故障時,另一臺服務器接管主服務器上的應用(結合上一篇 結合上一篇:http://www.iamlintao.com/動手搭建centos下用heartbeat搭建雙機熱備/ 實現),此時便須要mysql的實時雙機互備。個人搭建過程以下: linux
服務器環境:
主服務器: web
操做系統:centos6.4 (Linux 2.6.18-348.12.1.el5)
ip:10.0.0.211
web環境:wdcp搭建
mysql:5.1.69 sql
備服務器: 數據庫
操做系統:centos6.4 (Linux 2.6.18-348.12.1.el5)
ip:10.0.0.212
web環境:wdcp搭建
mysql:5.1.69 vim
建立同步帳號:
數據庫能相互訪問受限要建立能夠遠程登錄的帳號,經過這個遠程帳號才能實現數據同步。首先登錄mysql(登錄方法自行google),登錄mysql以後用如下命令建立遠程登錄帳號: centos
1 |
<span style="font-family: 'Times New Roman';">MySQL>GRANT all privileges ON *.* TO zuiw@'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
·而後中止同步、鎖定表、查看讀取的二進制文件和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. 同步用戶建立不成功
現象:執行「SHOW SLAVE STATUS;」 命令是返回帶有「error connecting to master ‘zuiw@10.0.0.211: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.00000一、 mysql-bin.index、 relay-log.info 這幾個文件,重啓mysql後會本身生成。
3.在沒有解鎖的狀況下中止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 |
5 |
-> master_password='PASSWD', |
6 |
-> master_log_file='mysql-bin.000002', |
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; |
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). |
5 |
mysql> show variables like 'server_id'; |
7 |
mysql> set global server_id=2; #此處的數值和my.cnf裏設置的同樣就行 |
最後:調試期間能夠藉助phpmyadmin、SSH Secure Shell 等工具,便於解決問題。
轉載請註明來自:http://www.iamlintao.com/親測centos下實現mysql雙機互備/