MySQL的主從同步架構是當前比較流行的一種數據庫架構,利用MySQL的主從配置,能夠實現讀寫分離,減輕主數據庫的訪問壓力,提高網站性能。MySQL的主從服務器的基本原理以下: html
大體描述一下過程:從服務器的IO線程從主服務器獲取二進制日誌,並在本地保存爲中繼日誌,而後經過SQL線程來在從上執行中繼日誌中的內容,從而使從庫和主庫保持一致。主從同步的詳細過程以下: mysql
1. 主服務器驗證鏈接。 sql
2. 主服務器爲從服務器開啓一個線程。 數據庫
3. 從服務器將主服務器日誌的偏移位告訴主服務器。 服務器
4. 主服務器檢查該值是否小於當前二進制日誌偏移位。 網絡
5. 若是小於,則通知從服務器來取數據。 架構
6. 從服務器持續從主服務器取數據,直至取完,這時,從服務器線程進入睡眠,主服務器線程同時進入睡眠。 性能
7. 當主服務器有更新時,主服務器線程被激活,並將二進制日誌推送給從服務器,並通知從服務器線程進入工做狀態。 網站
8. 從服務器SQL線程執行二進制日誌,隨後進入睡眠狀態。 ui
更多資料參考:http://blog.chinaunix.net/uid-20639775-id-3254611.html
例如如今咱們有兩臺服務器,172.17.22.187和172.17.22.188, 如今把188服務器的MySQL數據庫配爲主服務器,187數據庫配爲從服務器(Slave),固然,Slave能夠有多個。MySQL主從服務器通常使用方法爲主服務器(Master)負責網站的NonQuery操做,從服務器(Slave)負責Query操做,咱們能夠根據網站功能模塊的特性來指定訪問的服務器,好比前臺項目列表,投融資記錄查詢等模塊能夠指定訪問Slave,投標,項目審覈等等交易性的操做訪問Mater,也能夠寫個池或隊列,自由爲請求分配從服務器鏈接。
上面主從同步的原理大體能夠理解爲主從服務器經過IO線程上的Binary Log複製,和SQL語句的重放實現數據的同步,固然複製時主服務器返回信息中除了日誌所包含的信息以外,還包括本次返回的信息在 Master 端的 Binary Log 文件的名稱以及在 Binary Log 中的位置,這個過程的更多資料能夠搜「MySQL Replication 線程」,如:
http://blog.csdn.net/bengda/article/details/7852889
在上面權限管理的小結中也提到了,有一個叫」REPLICATION SLAVE」的權限,它是服務器管理中的複製權限,有這個權限slave才能從master服務器上覆制binlog日誌。因此咱們須要建立一個數據庫用戶,並給他賦予replication權限,建立並賦權的sql以下:
GRANT REPLICATION SLAVE,FILE ON *.* TO 'repl'@'172.17.%.%' IDENTIFIED BY '123456';
角色建立好了之後,要在主服務器的配置文件上加上log-bin配置,開啓Binary Log功能,不然沒法實現replication複製,配置文件的路徑爲/usr/my.cnf,不一樣機子或系統可能路徑不同,能夠用find / -name my.cnf查找一下,找到後修改加入以下內容:
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
Server-id主服務器配爲1,從服務器配置時要注意不能與主服務器衝突了,否則到時候會出現莫民其妙的問題,由於同步的時候會會根據server-id作判斷,若是server-id同樣就不進行同步了,my.cnf的其它各項配置的介紹能夠參考:http://database.51cto.com/art/201108/285365.htm
須要注意的是:每次修改配置文件須要重啓mysql服務才能生效:
service mysql restart;//重啓mysql服務
同步以前咱們能夠先將原主庫裏面的數據備份到從庫上,可使用mysqldump,語法以下:
mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases authority_test rep_test_db replication > db.sql
--databases後面跟的authority_test等爲數據庫,將它們的快照保存到db.sql文件中。
將db.sql文件移到從服務器上後,能夠用:mysql -uroot -p < db.sql 將主庫的數據內容備份到從庫。
1) 找到從服務器的配置文件my.cnf,加入以下配置:
server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
2) 重啓從服務器mysql服務:service mysql restart。
3) 登陸從服務器數據庫,要鏈接上Master,使用以下sql:
change master to master_host='172.17.22.188', master_port=3306, master_user='repl',master_password='123456', master_log_file='master-bin.000001', master_log_pos=0;
4) 在mysq裏使用sql語法:start slave。啓動slave
可使用show slave status\G,查看slave的運行狀態:
在 slave status 的狀態中,有兩項:Slave_IO_Running 和 Slave_SQL_Running, 必須都爲 Yes 才說明正常運行了。
若是是slave_io_running no了,那麼就我我的看有三種狀況,一個是網絡有問題,鏈接不上,第二個是有可能my.cnf有問題.
一旦io爲no了先看err日誌,看看有什麼錯,極可能是網絡,也有多是包太大收不了,這個時候從機上改max_allowed_packet這個參數。
Slave_SQL_Running 爲 No 時:
解決辦法一
1.程序可能在slave上進行了寫操做
2.也多是slave機器重起後,事務回滾形成的.
通常是事務回滾形成的:
解決辦法:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
推薦使用該辦法.
set GLOBAL SQL_SLAVE_SKIP_COUNTER=N,用來跳過備機的一條或N條出錯的複製語句。
在show slave status 中會有出錯的語句。
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1 一次後會發現跳過了一條語句。
若是設置完後發現還有錯誤語句。要多執行幾回。
解決辦法二
首先停掉Slave服務:stop slave。
到主服務器上查看主機狀態:
記下File和Position對應的值
登陸master
使用sql語法:show master status查看master運行狀態:
而後到slave服務器上執行手動同步:
change master to master_host = '172.17.22.188',master_port = 3306,master_user = 'repl',master_password='123456',master_log_file='master-bin.000007',master_log_pos=120;
從新定位日誌文件和日誌位置。
而後: start slave,啓動slave。
問題都處理完了之後能夠嘗試在master上進行各類增刪改操做,能夠發現,slave數據庫上會同步更新,與master保持一致。