標籤:
原文請參照MySQL官方文檔Reference Manual,版本5.6.10。
複製功能使得資料可以從一個MySQL資料庫(master主庫)複製到另一個或多個MySQL資料庫(slave從庫)。預設情況下,複製是非同步,slave無需保持持久的串連來從master獲得更新。這意味著更新能工作在遠端連線,甚至是臨時間斷性的串連上,比如撥號連線服務。根據不同的配置,你能複製master上所有的資料庫,或指定的資料庫,甚至某一資料庫中指定的資料表。
下面是關於複製功能,新手經常問到的問題。
1. slave必須要持久串連到master嗎?
不需要。slave可以關機或失去串連幾小時甚至幾天,然後重新串連擷取更新。舉例來說,你能在撥號連線網路上建立複製,而該撥號網路只有不定時或短時間的串連。這也意味著,在任何給定時間點,slave不能保證和master保持完全一致,除非你採取某些特別的措施。
為了保證能擷取在slave失去串連時的更新,你不能從master上移除包含未完成複製內容的binary二進位記錄檔。非同步複製能維持工作的條件:slave能從最後一次讀取事件的點繼續讀取binary二進位日誌。
2. 複製必須要在master和slave上開啟網路功能嗎?
是的,必須要在master和slave上開啟網路功能。如果網路沒有串連,slave就無法串連到master傳輸binary二進位日誌。在每個伺服器上檢查設定檔,skip-networking選項沒有被開啟。
3. 如何知道slave比master落後更新了多久?或者說,如何知道slave最後一次更新的日期?
檢查 SHOW SLAVE STATUS 輸出中的 Seconds_Behind_Master 列。 當slave的SQL線程執行一個從master的讀事件,它修改自己的時間為該事件的時間點Timestamp。(這就是為什麼TIMESTAMP可以被很好的複製。)在 SHOW PROCESSLIST 輸出中的 Time 列,顯示的是slave的SQL線程最後一次複製事件中的時間點timestamp和slave伺服器的真即時間之間的秒數差。(這一句翻譯得好辛苦。) 你能利用這個數值來確定上次複製事件的日期。如果你的slave已經和master中斷連線1小時,然後重新串連,你可以在 SHOW PROCESSLIST 輸出中的 Time 列立刻看到大的時間數值,如3600。這是因為slave正在執行超過1小時前的語句。
4. 如何強制master阻止更新,直到slave能跟上來?
在master上執行:
mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS;
記錄下SHOW語句輸出中的複製座標的值。(當前的binary二進位記錄檔的檔案名稱和位置)
在slave執行:(參數使用上一步獲得的值)
mysql> SELECT MASTER_POS_WAIT(‘log_name‘, log_pos);
這個SELECT語句會保持運行,直到slave根據指定的記錄檔和位置完成和master的同步,然後該SELECT語句返回。
在master執行:(解除更新限制)
mysql> UNLOCK TABLES;
5. 設定雙向複製,我需要瞭解什麼問題?
MySQL複製當前不支援master和slave之間的任何鎖定協議來保證跨伺服器分發更新的原子性。(原子性:作為事務一部分的所有步驟或者都發生,或者都不發生。) 舉例來說,用戶端A在master1上作了一個更新,與此同時,在這個更新傳播到master2前,用戶端B在master2上也作了一個與用戶端A不同的更新,因此,當用戶端A的更新到達master2,它要處理的表資料將不同於在master1上的,master2上的更新傳播到master1上,也會面臨同樣的問題。這意味著,除非你確定你的更新與次序無關,或者在用戶端代碼中採取某些方法處理無序的更新,否則你不能把兩個伺服器連在一起做成雙向複製。
你還應該知道雙向複製實際上不能改善更多的效能,每一個伺服器都需要作同樣數量的更新,就像你只有一個伺服器時一樣。唯一的區別是可以減少一點鎖競爭,原因是來自另一個伺服器的更新在slave是順序進行的。即使如此,這點好處還可能會被網路延遲所抵消。
6. 如何利用複製改善系統的效能?
設定一個伺服器作為master,所有的寫操作都在它上面完成。然後在預算和機架容量範圍內設定儘可能多的slave伺服器,把讀操作分攤在master和slave伺服器上。你還可以以下述參數啟動slave,在slave端獲得速度上的提升。slave使用非事務性的MyISAM表取代InnoDB表,消除事務的開銷來獲得更高的速度。
--skip-innodb--low-priority-updates--delay-key-write=ALL
7. 如何在我的應用程式內編寫用戶端代碼使用效能增強複製?
參考“應用複製於橫向擴充”,下面這張圖不錯。
8. MySQL複製在什麼時候,多大程度上能改善我的系統的效能?
MySQL複製能在這樣的系統中發揮最大的效能:頻繁的讀操作,不頻繁的寫操作。從原理上說,使用單master和多slave方案,你能通過增加slave來擴充系統直到超出網路的頻寬,或者你的master不能承受更新的負載增長。
為了確定你在獲得的好處能穩定下來前要使用多少slave,確定你的網站能獲得多少效能改善,你必須清楚你的查詢模式,然後憑經驗測定典型master和slave上讀和寫的總量。(後面一大段舉例的內容就不翻譯了,偷懶 ... ^_^)
9. 如何利用複製提供冗餘或高可用?
如何?冗餘完全取決於你的應用和應用環境設定。高可用方案(容錯移轉)要求主動的監控,使用自訂的指令碼或第三方的工具為MySQL提供故障時轉移到slave的支援。
手動處理這一過程,你應該能從一個故障的master切換到一個預先配製好的slave,修改DNS設定,使你的應用串連新的伺服器。
10. 如何設定master使用基於語句 statement-based 還是使用基於資料行 row-based 的二進位binary日誌格式?
檢查 binlog_format 系統變數:
mysql> SHOW VARIABLES LIKE ‘binlog_format‘;
顯示的值可能是 STATEMENT, ROW, MIXED 中之一。MIXED模式使用基於行row-based的複製,但是會在特定條件下自動切換到基於語句statement-based的日誌。
11. 如何設定slave使用基於行row-based的複製?
slave會自動獲知應該使用哪種格式。
12. 如何避免 GRANT 和 REVOKE 語句被複製到slave伺服器?
啟動伺服器使用 --replicate-wild-ignore-table=mysql.% 選項 忽略複製mysql資料庫中的資料表。
13. 複製可以工作在跨平台嗎?(如master運行在Linux,而slaves運行在Mac OS X或Windows)
是的!(這一點我喜歡)
14. 複製可以工作在不同的硬體架構上嗎?(如master運行在64位平台,而slaves運行在32位平台)
是的!(這一點我就更喜歡了)
MySQL 5.6 Replication 複製 FAQ