1. 程式人生 > >高性能MySQL集群詳解(二)

高性能MySQL集群詳解(二)

主服務器 過濾 一主多從 orm failover 線程 alived 除了 設計思路

一.通過Keepalived搭建MySQL雙主模式的高可用集群系統

1.MySQL Replication介紹:

MySQL Replication是MySQL自身提供的一個主從復制功能,其實也就是一臺MySQL服務器(稱為Slave)從另一臺MySQL服務器(稱為Master)上復制日誌,然後解析日誌並應用到自身的過程。MySQL Replication是單向、異步復制,基本復制過程為:Master服務器首先將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌的循環,這些日誌文件可以發送到Slave服務器進行更新。當一臺Slave服務器連接Master服務器時,它從Master服務器日誌中讀取上一次成功更新的位置。然後Slave服務器開始接收從上一次完成更新後發生的所有更新,所有更新完成,將等待主服務器通知新的更新。


MySQL Replication支持鏈式復制,也就是說Slave服務器下還可以再鏈接Slave服務器,同時Slave服務器也可以充當Master服務器角色。這裏需要註意的是,在MySQL主從復制中,所有表的更新必須在Master服務器上進行,Slave服務器僅能提供查詢操作。

基於單向復制的MySQL Replication技術有如下優點:

□增加了MySQL應用的健壯性,如果Master服務器出現問題,可以隨時切換到Slave服務器,繼續提供服務。

■可以將MySQL讀、寫操作分離,寫操作只在Master服務器完成,讀操作可在多個Slave服務器上完成,由於Master服務器和Slave服務器是保持數據同步的,因此不會對前端業務系統產生影響。同時,通過讀、寫的分離,可以大大降低MySQL的運行負荷。

□在網絡環境較好,業務量不是很大的環境中,Slave服務器同步數據非常快,基本可以達到實時同步,並且,Slave服務器在同步過程中不會幹擾Master服務器。

MySQL Replication支持多種類型的復制方式,常見的有基於語句的復制、基於行的復制和混合類型的復制。下面分別進行介紹。

(1)基於語句的復制

MySQL默認采用基於語句的復制,效率很高。基本方式是:在Master服務器上執行的SQL語句,在Slave服務器上再次執行同樣的語句。而一旦發現沒法精確復制時,會自動選擇基於行的復制。

(2)基於行的復制

基本方式為:把Master服務器上改變的內容復制過去,而不是把SQL語句在從服務器上執行一遍,從MySQL5.0開始支持基於行的復制。

(3)混合類型的復制

其實就是上面兩種類型的組合,默認采用基於語句的復制,如果發現基於語句的復制無法精確完成,就會采用基於行的復制。

2.MySQL Replication實現原理:

MySQL Replication是一個從Master復制到一臺或多臺Slave的異步過程,在Master與Slave之間實現整個復制過程主要由三個線程來完成,其中一個IO線程在Master端,另兩個線程(SQL線程和IO線程)在Slave端。

要實現MySQL Replication,首先在Master服務器上打開MySQL的Binary Log(產生二進制日誌文件)功能,因為整個復制過程實際上就是Slave從Master端獲取該日誌,然後在自身上將二進制文件解析為SQL語句並完全順序地執行SQL語句所記錄的各種操作。更詳細的過程如下。

1)首先Slave上的IO線程連接上Master,然後請求從指定日誌文件的指定位置或者從最開始的日誌位置之後的日誌內容。

2)Master在接收到來自Slave的IO線程請求後,通過自身的IO線程,根據請求信息讀取指定日誌位置之後的日誌信息,並返回給Slave端的IO線程。返回信息中除了日誌所包含的信息之外,還包括此次返回的信息在Master端對應的Binary Log文件的名稱以及在Binary Log中的位置。

3)Slave的IO線程接收到信息後,將獲取到的日誌內容依次寫入Slave端的Relay Log文件(類似於mysql-relay-bin.xxxxxx)的最後,並且將讀取到的Master端的Binary Log的文件名和位置記錄到一個名為master-info的文件中,以便在下一次讀取的時候能迅速定位開始往後讀取日誌信息的位置。

4)Slave的SQL線程在檢測到Relay Log文件中新增加了內容後,會馬上解析該Relay Log文件中的內容,將日誌內容解析為SQL語句,然後在自身執行這些SQL,由於是在Master端和Slave端執行了同樣的SQL操作,所以兩端的數據是完全一樣的。至此整個復制過程結束。

3.MySQL Replication常用架構

MySQL Replication技術在實際應用中有多種實現架構,常見的有:

☆一主一次,即一臺Master服務器和一臺Slave服務器。這是最常見的架構。

★一主多從,即一臺Master服務器和兩臺或兩臺以上Slave服務器,經常用在寫操作不頻繁、查詢量比較大的業務環境中。

☆主主互備,又稱雙主互備,即兩臺MySQL Server互相將對方作為自己的Master,自己又同時作為對方的Slave來進行復制。主要用於對MySQL寫操作要求比較高的環境中,避免了MySQL單點故障。

★雙主多從,其實就是雙主互備,然後再加上多臺Slave服務器。主要用於對MySQL寫操作要求比較高,同時查詢量比較大的環境中。

其實可以根據具體的情況靈活地將Master/Slave結構進行變化組合,但萬變不離其宗,在進行MySQL Replication的各種部署之前,必須遵守的規則如下:

◇同一時刻只能有一臺Master服務器進行寫操作。

◆一臺Master服務器可以有多臺Slave服務器。

◇無論是Master服務器還是Slave服務器,都要確保各自的ServerID唯一,否則雙主互備就會出現問題。

◆一臺Slave服務器可以將其從Master服務器獲得的更新信息傳遞給其他的Slave服務器。

4.MySQL主主互備模式架構

企業級MySQL集群具備高可用、可擴展、易管理、低成本的特點。下面將介紹企業環境中經常應用的一個解決方案,即MySQL的雙主互備架構,主要設計思路是通過MySQL Replication技術將兩臺MySQL Server互相將對方作為自己的Master,自己又同時作為對方的Slave來進行復制。這樣就實現了高可用架構中的數據同步功能,同時,將采用Keepalived來實現MySQL的自動failover。在這種架構中,雖然兩臺MySQL Server互為主從,但同一時刻只能有一臺MySQL Server可讀寫,而另一臺MySQL Server只能進行讀操作,這樣可保證數據的一致性。整個架構如下圖:

技術分享圖片

5.MySQL主主互備模式配置

MySQL主從復制的配置還是比較簡單的,僅僅需要修改MySQL配置文件即可,這裏要配置的是主主互備模式,但配置過程和一主一從結構是完全一樣的,配置環境如下:

主機名 操作系統版本 MySQL版本 主機IP MySQL VIP

DB1(Master) CentOS release 6.7 mysql-5.1.73 10.0.0.35 10.0.0.40

DB2(Slave) CentOS release 6.7 mysql-5.1.73 10.0.0.36

1.修改MySQL配置文件

在默認情況下,MySQL的配置文件是/etc/my.cnf,首先修改DB1主機的配置文件,在/etc/my.cnf文件中的“[mysqld]”段添加如下內容:

server-id=1

log-bin=mysql-bin

relay-log=mysql-relay-bin

replicate-wild-ignore-table=mysql.%

replicate-wild-ignore-table=test.%

replicate-wild-ignore-table=information_schema.%

然後修改DB2主機的配置文件,在/etc/my.cnf文件中的“[mysqld]”段添加如下內容:

server-id=2

log-bin=mysql-bin

relay-log=mysql-relay-bin

replicate-wild-ignore-table=mysql.%

replicate-wild-ignore-table=test.%

replicate-wild-ignore-table=information_schema.%

其中,server-id是節點標識,主、從節點不能相同,必須全局唯一。log-bin表示開啟MySQL的binlog日誌功能。“mysql-bin”表示日誌文件的命名格式,會生成文件名為mysql-bin.000001、mysql-bin.000002等的日誌文件。relay-log用來定義relay-log日誌文件的命名格式。replicate-wild-ignore-table是個復制過濾選項,可以過濾不需要復制的數據庫或表,例如“mysql.%”表示不復制MySQL庫下的所有對象,其他以此類推。與此對應的是replicate-wild-do-table選項,用來指定需要復制的數據庫或表。

這裏需要註意的是,不要在主庫上使用binlog-do-db或binlog-ignore-db選項,也不要在從庫上使用replicate-do-db或replicate-ignore-db選項,因為這樣可能產生跨庫更新失敗的問題。推薦在從庫使用replicate-wild-do-table和replicate-wild-ignore-table兩個選項來解決復制過濾問題。

2.手動同步數據庫



高性能MySQL集群詳解(二)