大綱
一、前言
二、Mysql 基礎知識
三、Mysql 復制(Replication)
四、Mysql 復制(Replication)類型
五、Mysql 主從復制基本步驟
六、Mysql 主從復制(異步)
七、Mysql 主從復制(半同步)
八、Mysql 復制工具
九、Mysql 復制注意事項
十、Mysql 復制過濾
一、前言
從這一篇博客開始我們就來學習mysql的高級課程,在前面的幾篇博客我們講解了mysql基礎知識、mysql日志類型、mysql配置文件、mysql備份策略,這一篇博客中我們來講解mysql的復制。
二、mysql基礎知識
1.mysql日志類型
二進制日志
事務日志
錯誤日志
一般查詢日志
中繼日志
慢查詢日志
2.mysql二進制日志詳解
說明:默認開啟,精確的記錄了用戶對數據庫中的數據進行操作的命令和操作的數據對象。
二進制日志文件的作用:
提供了增量備份的功能
提供了數據基于時間點的恢復,這個恢復的時間點可以由用戶控制
為mysql的復制架構提供基礎,將這主服務器的二進制日志復制到從服務器上并執行同樣的操作,就可將數據進行同步
實現數據的高可用
分擔負載
二進制日志默認存放位置:
數據目錄下,以mysql-bin.XXXXXX命名的日志
二進制日志格式:
基于語句 statement
基于行 row
混合方式 mixed
二進制日志滾動方式:
重啟服務
日志達到最大上限
執行flush logs
二進制日志事件:
position 基于位置,也就是offset(偏移量)
datetime 基于時間
timestamp
二進制日志的查看與刪除方式:
文件系統中查看二進制日志的命令:
配置mysql的主配置文件:
注:一般建議將binlog日志與數據文件分開存放,不但可以提高mysql性能,還可以增加安全性!
三、Mysql 復制(Replication)
1.Mysql 復制作用
負載平衡(load balancing)
備份
高可用性(high availability)和容錯
2.Mysql 復制如何工作
主要有三步(如下圖):
master將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);
slave將master的binary log events拷貝到它的中繼日志(relay log);
slave重做中繼日志中的事件,將改變反映它自己的數據。
具體說明:
該過程的第一部分就是master記錄二進制日志。在每個事務更新數據完成之前,master在二日志記錄這些改變。MySQL將事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成后,master通知存儲引擎提交事務。
下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠并等待master產生新的事件。I/O線程將這些事件寫入中繼日志。
SQL slave thread處理該過程的最后一步。SQL線程從中繼日志讀取事件,更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小。
此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。復制過程有一個很重要的限制——復制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作。所以slave上數據一般要慢于master上數據。即master與slave之間的數據在一定時間內會不同步。
四、Mysql 復制(Replication)類型
1.mysql復制類型有以下一些基本原則
每個slave只能有一個master;
每個slave只能有一個唯一的服務器ID;
每個master可以有很多slave;
如果你設置log_slave_updates,slave可以是其它slave的master,從而擴散master的更新。
注,MySQL不支持多主服務器復制(Multimaster Replication)——即一個slave可以有多個master。但是,通過一些簡單的組合,我們卻可以建立靈活而強大的復制體系結構。
2.mysql復制類型
(1).一主多從模式
注,由一個master和一個slave組成復制系統是最簡單的情況。Slave之間并不相互通信,只能與master進行通信。
具體說明:
如果寫操作較少,而讀操作很時,可以采取這種結構。你可以將讀操作分布到其它的slave,從而減小master的壓力。但是,當slave增加到一定數量時,slave對master的負載以及網絡帶寬都會成為一個嚴重的問題。這種結構雖然簡單,但是,它卻非常靈活,足夠滿足大多數應用需求。一些建議:
不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存儲引擎)
用一個slave作為備用master,只進行復制
用一個遠程的slave,用于災難恢復
發送復制事件到其它slave,當設置log_slave_updates時,你可以讓slave扮演其它slave的master。此時,slave把SQL線程執行的事件寫進行自己的二進制日志(binary log),然后,它的slave可以獲取這些事件并執行它
。
(2).雙主模式
注,Master-Master復制的兩臺服務器,既是master,又是另一臺服務器的slave。
具體說明:
主動的Master-Master復制有一些特殊的用處。例如,地理上分布的兩個部分都需要自己的可寫的數據副本。這種結構最大的問題就是更新沖突。假設一個表只有一行(一列)的數據,其值為1,如果兩個服務器分別同時執行如下語句:
在第一個服務器上執行:
那么結果是多少呢?一臺服務器是4,另一個服務器是3,但是,這并不會產生錯誤。
實際上,MySQL并不支持其它一些DBMS支持的多主服務器復制(Multimaster Replication),這是MySQL的復制功能很大的一個限制(多主服務器的難點在于解決更新沖突),但是,如果你實在有這種需求,你可以采用MySQL Cluster,以及將Cluster和Replication結合起來,可以建立強大的高性能的數據庫平臺。但是,可以通過其它一些方式來模擬這種多主服務器的復制。
(3).主從模式
注,這是master-master結構變化而來的,它避免了M-M的缺點,實際上,這是一種具有容錯和高可用性的系統。它的不同點在于其中一個服務只能進行只讀操作。
(4).帶從服務器的Master-Master結構(Master-Master with Slaves)
注,這種結構的優點就是提供了冗余。在地理上分布的復制結構,它不存在單一節點故障問題,而且還可以將讀密集型的請求放到slave上。
總結:一般常用的兩種復制類型一種是主從模式,另一種是一主多從模式。在這一篇博客中我們主要講解主從模式復制。
五、Mysql 主從復制基本步驟
1.master 配置
啟用二進制日志
配置一個唯一的server-id
創建具有復制權限的用戶
2.slave 配置
啟用中繼日志
配置一個唯一的server-id
連接主服務器,并開始復制數據
啟動數據復制
注,基本步驟我們就說到這里,下面我們來具體演示一下主從復制。
六、Mysql 主從復制(異步)
1.mysql異步復制
異步復制:MySQL本身支持單向的、異步的復制。異步復制意味著在把數據從一臺機器拷貝到另一臺機器時有一個延時,最重要的是這意味著當應用系統的事務在主服務器上提交并確認時數據并不能在同一時刻拷貝或應用到從服務器上。通常這個延時是由網絡帶寬、資源可用性和系統負載決定的。然而,使用正確的組件并且調優,復制能做到接近瞬時完成。
當主庫有更新的時候,主庫會把更新操作的SQL寫入二進制日志(Bin log),并維護一個二進制日志文件的索引,以便于日志文件輪回(Rotate)。在從庫啟動異步復制的時候,從庫會開啟兩個I/O線程,其中一個線程連接主庫,要求主庫把二進制日志的變化部分傳給從庫,并把傳回的日志寫入本地磁盤。另一個線程則負責讀取本地寫入的二進制日志,并在本地執行,以反映出這種變化。較老的版本在復制的時候只啟用一個I/O線程,實現這兩部分的功能。下面我們來具體演示一下mysql的異步復制。
2.實驗拓撲
注,Active (master,node1) 192.168.1.201 , Passive (slave,node2)192.168.1.202
3.環境配置
時間同步
4.操作系統
CentOS 6.4 X86_64
5.軟件版本
Mysql 5.5.33 (注,這里用的是mysql 5.5.33二進制通用安裝包,解壓就能用)
6.安裝并配置mysql
master:
(1).解壓并鏈接
(2).新建mysql用戶
(3).修改mysql安裝目錄所有者與所屬組
(4).為mysql提供配置文件并修改
(5).為mysql提供啟動腳本
(6).初始化mysql數據庫
(7).啟動并測試
好了,到這里master的mysql配置完成,下面我們進行slave的mysql配置。
slave:
(1).解壓并鏈接
(2).新建mysql用戶
(3).修改mysql安裝目錄所有者與所屬組
(4).為mysql提供配置文件并修改
(5).為mysql提供啟動腳本
(6).初始化mysql數據庫
(7).啟動并測試
好了,slave的mysql也配置完成了,下面我們來配置主從復制。
7.配置master
(1).修改配置文件
(2).授權復制用戶
(3).重啟一下mysql服務
8.配置slave
(1).修改配置文件
(2).重啟mysql服務
(3).連接主服務器并復制
9.主從復制測試
master:
slave:
好了,到這里異步的主從復制到這里配置完成。下面我們來說一下什么是半同步復制(或說是同步也行)。
七、Mysql 主從復制(半同步)
1.半同步復制
在說明半同步復制之前我們先來了解一下,什么是同步復制?同步復制:同步復制可以定義為數據在同一時刻被提交到一臺或多臺機器,通常這是通過眾所周知的“兩階段提交”做到的。雖然這確實給你在多系統中保持一致性,但也由于增加了額外的消息交換而造成性能下降。使用MyISAM或者InnoDB存儲引擎的MySQL本身并不支持同步復制,然而有些技術,例如分布式復制塊設備(簡稱DRBD),可以在下層的文件系統提供同步復制,允許第二個MySQL服務器在主服務器丟失的情況下接管(使用第二服務器的復本)。了解了同步復制我們正下面來說一下,什么是半同步復制?
MYSQL 5.5開始,支持半自動復制。之前版本的MySQL Replication都是異步(asynchronous)的,主庫在執行完一些事務后,是不會管備庫的進度的。如果備庫不幸落后,而更不幸的是主庫此時又出現Crash(例如宕機),這時備庫中的數據就是不完整的。簡而言之,在主庫發生故障的時候,我們無法使用備庫來繼續提供數據一致的服務了。Semisynchronous Replication(半同步復制)則一定程度上保證提交的事務已經傳給了至少一個備庫。Semi synchronous中,僅僅保證事務的已經傳遞到備庫上,但是并不確保已經在備庫上執行完成了。
此外,還有一種情況會導致主備數據不一致。在某個session中,主庫上提交一個事務后,會等待事務傳遞給至少一個備庫,如果在這個等待過程中主庫Crash,那么也可能備庫和主庫不一致,這是很致命的。如果主備網絡故障或者備庫掛了,主庫在事務提交后等待10秒(rpl_semi_sync_master_timeout的默認值)后,就會繼續。這時,主庫就會變回原來的異步狀態。
MySQL在加載并開啟Semi-sync插件后,每一個事務需等待備庫接收日志后才返回給客戶端。如果做的是小事務,兩臺主機的延遲又較小,則Semi-sync可以實現在性能很小損失的情況下的零數據丟失。
2.異步與半同步異同
默認情況下MySQL的復制是異步的,Master上所有的更新操作寫入Binlog之后并不確保所有的更新都被復制到Slave之上。異步操作雖然效率高,但是在Master/Slave出現問題的時候,存在很高數據不同步的風險,甚至可能丟失數據。
MySQL5.5引入半同步復制功能的目的是為了保證在master出問題的時候,至少有一臺Slave的數據是完整的。在超時的情況下也可以臨時轉入異步復制,保障業務的正常使用,直到一臺salve追趕上之后,繼續切換到半同步模式。
3.具體配置
注,mysql5.5半同步插件是由谷歌提供,具體位置/usr/local/mysql/lib/plugin/下,一個是master用的semisync_master.so,一個是slave用的semisync_slave.so,下面我們就來具體配置一下。
master:
(1).安裝插件
(2).修改配置文件
(3).重新啟動服務
slave:
(1).安裝插件
(2).修改配置文件
(3).重新啟動服務
4.查看一下狀態
master:
slave:
5.測試一下
master:
注,大家可以看到創建一個表的插入一個數據的時間都很長,說明半同步配置完成。
6.模擬一下故障
slave:
注,大家可以看到主服務器會卡1s,我們超時時間設置的為1s。
7.查看一下狀態
好了,到這里我們就配置完成了半同步復制。希望大家有所收獲。下面我們來簡單說一下mysql復制的工具。
八、Mysql 復制工具
1.percona-toolkit簡介
percona-toolkit是一組高級命令行工具的集合,用來執行各種通過手工執行非常復雜和麻煩的mysql和系統任務,這些任務包括:
檢查master和slave數據的一致性
有效地對記錄進行歸檔
查找重復的索引
對服務器信息進行匯總
分析來自日志和tcpdump的查詢
當系統出問題的時候收集重要的系統信息
percona-toolkit源自Maatkit 和Aspersa工具,這兩個工具是管理mysql的最有名的工具,現在Maatkit工具已經不維護了,請大家還是使用percona-toolkit吧!這些工具主要包括開發、性能、配置、監控、復制、系統、實用六大類,作為一個優秀的DBA,里面有的工具非常有用,如果能掌握并加以靈活應用,將能極大的提高工作效率。
2.安裝percona-toolkit
3.簡單使用
常用工具:
(1).服務器摘要
(2).服務器磁盤監測
(3).mysql服務狀態摘要
(4).慢查詢日志分析統計
(5).主從狀態監測,提供給它一臺mysql服務器的IP用戶名密碼,就可以分析出整個主從架構中每臺服務器的信息,包括但不限于mysql版本,IP地址,server ID,mysql服務的啟動時間,角色(主/從),Slave Status(落后于主服務器多少秒,有沒有錯誤,slave有沒有在運行)。
(6).mysql死鎖監測
(7).監測從庫的復制延遲
注,簡單說明就到這里,想學習更詳細的內容,命令的使用可以通過--help獲知
九、Mysql 復制注意事項
注,在主-從架構上建議使用的配置
master:
十、Mysql 復制過濾
master:
測試一下:
在從服務器上只復制testdb一個數據庫
slave:
master:
slave:
注,大家可以看到沒有同步mydb1,再測試一下。
master:
注,大家可以看到同步了testdb,好了到這里所有演示全部完成,希望大家有所收獲。^_^……