在centos下實現mysql雙機熱備

mysql雙機熱備

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

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的值:

SHOW MASTER STATUS;

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 ‘zuiw@10.0.0.211:3306′ – retry-time: 60  retries: 86400」字樣。

解決:提示說明鏈接到主/備服務器失敗。在網上流傳有三種分析:網絡問題、配置問題、同步用戶寫錯了,除了這三個以外還可能有另一種狀況。用phpmyadmin能夠打開mysql數據庫中的user表,若是成功建立同步帳戶則在user表中會 存在此用戶,若是建立失敗則不會存在;若是建立正確,執行「show processlist;」會獲得以下:

mysqlzuiw

注意這裏的同步所對應的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進程:

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雙機互備/

相關文章
相關標籤/搜索