MySQL主從服務器配置

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有問題.

一旦iono了先看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

到主服務器上查看主機狀態:

記下FilePosition對應的值

 

登陸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保持一致。

相關文章
相關標籤/搜索