mysql多主單向–>環形同步

原理:
MySQL的Replication是一種多個MySQL的數據庫做主從同步的方案,特點是異步,廣泛用在各種對MySQL有更高性能,更高可靠性要求的場合。與之對應的另一個技術是同步的MySQL Cluster,但因為比較復雜,使用者較少。
 
下圖是MySQL官方給出瞭使用Replication的場景:

Replication原理
 
Mysql 的 Replication 是一個異步的復制過程,從一個MySQL節點(稱之為Master)復制到另一個MySQL節點(稱之Slave)。在 Master 與 Slave 之間的實現整個復制過程主要由三個線程來完成,其中兩個線程(SQL 線程和 I/O 線程)在 Slave 端,另外一個線程(I/O 線程)在 Master 端。
 
要實現 MySQL 的 Replication ,首先必須打開 Master 端的 Binary Log,因為整個復制過程實際上就是 Slave 從 Master 端獲取該日志然後再在自己身上完全順序的執行日志中所記錄的各種操作。
 
看上去MySQL的Replication原理非常簡單,總結一下:
     * 每個從僅可以設置一個主。
    * 主在執行sql之後,記錄二進制log文件(bin-log)。
    * 從連接主,並從主獲取binlog,存於本地relay-log,並從上次記住的位置起執行sql,一旦遇到錯誤則停止同步。
 
從這幾條Replication原理來看,可以有這些推論:
     * 主從間的數據庫不是實時同步,就算網絡連接正常,也存在瞬間,主從數據不一致。
    * 如果主從的網絡斷開,從會在網絡正常後,批量同步。
    * 如果對從進行修改數據,那麼很可能從在執行主的bin-log時出現錯誤而停止同步,這個是很危險的操作。所以一般情況下,非常小心的修改從上的數據。
    * 一個衍生的配置是雙主,互為主從配置,隻要雙方的修改不沖突,可以工作良好。
    * 如果需要多主的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。
 
主從設置
 
因為原理比較簡單,所以Replication從MySQL 3就支持,並在所有平臺下可以工作,多個MySQL節點甚至可以不同平臺,不同版本,不同局域網。做Replication配置包括用戶和my.ini(linux下為my.cnf)兩處設置。
 
首先在主MySQL節點上,為slave創建一個用戶:
 
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.1.10' IDENTIFIED BY 'slave';
 
實際上,為支持主從動態同步,或者手動切換,一般都是在所有主從節點上創建好這個用戶。然後就是MySQL本身的配置瞭,這需要修改my.cnf或者my.ini文件。在mysqld這一節下面增加:
 
server-id=1  
auto-increment-increment=2   
auto-increment-offset=1   
log-bin   
binlog-do-db=mstest   
binlog_format=mixed
 
master-host=192.168.1.62  
master-user=slave   
master-password=slave   
replicate-do-db=mstest
 
上面這兩段設置,前一段是為主而設置,後一段是為從設置的。也就是說在兩個MySQL節點上,各加一段就好。binlog-do-db和 replicate-do-db就是設置相應的需要做同步的數據庫瞭,auto-increment-increment和auto- increment-offset是為瞭支持雙主而設置的(參考下一節),在隻做主從的時候,也可以不設置。
 
雙主的設置
 
從原理論來看MySQL也支持雙主的設置,即兩個MySQL節點互為主備,不過雖然理論上,雙主隻要數據不沖突就可以工作的很好,但實際情況中還是很容發生數據沖突的,比如在同步完成之前,雙方都修改同一條記錄。因此在實際中,最好不要讓兩邊同時修改。即邏輯上仍按照主從的方式工作。但雙主的設置仍然是有意義的,因為這樣做之後,切換主備會變的很簡單。因為在出現故障後,如果之前配置瞭雙主,則直接切換主備會很容易。
  雙主在設置時,隻需將上面的一段設置復制一份,分別寫入兩個MySQL節點的配置文件,但要修改相應的server-id,auto- increment-offset和master-host。auto-increment-offset就是為瞭讓雙主同時在一張表中進行添加操作時不會出現id沖突,所以在兩個節點上auto-increment-offset設置為不同的值就好。  另:不要忘瞭,在兩個節點上都為對方創建用戶。  應用層的負載均衡  本文隻介紹瞭MySQL自身的Repilication配置,在上面的圖中也可以看出,有瞭Replication,還需要應用層(或者中間件)做一個負載均衡,這樣才能最大程度發揮MySQL Replication的優勢,這些將在以後探討。

====================================================================================================
環形

解決多臺寫服務器主自增長ID重復問題

二臺Mysql服務器,他們的IP地址分別為:
A:192.168.0.97
B:192.168.0.98
數據庫都是 test_3306
首先我給兩臺服務器的my.ini 貼出來
A:my.ini

server-id=2
master-host=192.168.0.98
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all

B:my.ini

server-id=1
master-host=192.168.0.97
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all

在這裡,配置文件和主從配置方法基本上一樣
log-slave-updates 這個參數一定要加上,否則不會給更新的記錄些到二進制文件裡
slave-skip-errors 是跳過錯誤,繼續執行復制操作
其他參數請參照 http://www.tbqu.com/post/15.html

多主互備和主從復制有一些區別,因為多主中 都可以對服務器有寫權限,所以設計到自增長重復問題

出現的問題(多主自增長ID重復)
1:首先我們通過A,B的test表結構
2:掉A,在B上對數據表test(存在自增長ID)執行插入操作,返回插入ID為1
3:後停掉B,在A上對數據表test(存在自增長ID)執行插入操作,返回的插入ID也是1
4:然後 我們同時啟動A,B,就會出現主鍵ID重復

解決方法:
我們隻要保證兩臺服務器上插入的自增長數據不同就可以瞭
如:A查奇數ID,B插偶數ID,當然如果服務器多的話,你可以定義算法,隻要不同就可以瞭

在這裡我們在A,B上加入參數,以實現奇偶插入

A:my.ini上加入參數

auto_increment_offset = 1
auto_increment_increment = 2
這樣A的auto_increment字段產生的數值是:1, 3, 5, 7, …等奇數ID瞭

B:my.ini上加入參數

auto_increment_offset = 2
auto_increment_increment = 2
這樣B的auto_increment字段產生的數值是:2, 4, 6, 8, …等偶數ID瞭

可以看出,你的auto_increment字段在不同的服務器之間絕對不會重復,所以Master-Master結構就沒有任何問題瞭。當然,你還可以使用3臺,4臺,或者N臺服務器,隻要保證auto_increment_increment = N 再設置一下auto_increment_offset為適當的初始值就可以瞭,那樣,我們的MySQL可以同時有幾十臺主服務器,而不會出現自增長ID 重復。

在這裡我們說的是2臺MYSQL服務器,你也可以擴展到多臺,實現方法類似
A -> B -> C-> D ->A
這樣一個環形的備份結構就形成瞭,最後可要記住 自增長ID(主鍵)要設計好哦,否則會出錯的。

————————————————————————————————————————–

假定有三臺Mysql服務器,他們的IP地址分別為:
192.168.1.8
192.168.1.88
192.168.1.188
在192.168.1.8的安裝目錄下找到my.ini文件,在該文件的最後加上:
server-id=1
log-bin
#asyntest1是我用來試驗的數據庫名稱,到時候要換成你的數據庫名字
binlog-do-db=asyntest1
#下面這句話很重要,隻有加上它,從前一臺機器上同步過來的數據才能同步到下一臺機器
log-slave-updates
master-host=192.168.1.188
master-user=root
#在此處填入192.168.1.188的root密碼
master-password=XXXXX
#asyntest1是我用來試驗的數據庫名稱,到時候要換成你的數據庫名字
replicate-do-db=asyntest1
master-connect-retry=10
#出現錯誤後忽略,如果不加這個,出現任何錯誤,同步進程會終止
slave-skip-errors=all

在192.168.1.88的安裝目錄下找到my.ini文件,在該文件的最後加上:
server-id=2
log-bin
#asyntest1是我用來試驗的數據庫名稱,到時候要換成你的數據庫名字
binlog-do-db=asyntest1
#下面這句話很重要,隻有加上它,從前一臺機器上同步過來的數據才能同步到下一臺機器
log-slave-updates
master-host=192.168.1.8
master-user=root
#在此處填入192.168.1.8的root密碼
master-password=XXXXX
#asyntest1是我用來試驗的數據庫名稱,到時候要換成你的數據庫名字
replicate-do-db=asyntest1
master-connect-retry=10
#出現錯誤後忽略,如果不加這個,出現任何錯誤,同步進程會終止
slave-skip-errors=all
在192.168.1.188的安裝目錄下找到my.ini文件,在該文件的最後加上:
server-id=3
log-bin
#asyntest1是我用來試驗的數據庫名稱,到時候要換成你的數據庫名字
binlog-do-db=asyntest1
#下面這句話很重要,隻有加上它,從前一臺機器上同步過來的數據才能同步到下一臺機器
log-slave-updates
master-host=192.168.1.88
master-user=root
#在此處填入192.168.1.88的root密碼
master-password=XXXXX
#asyntest1是我用來試驗的數據庫名稱,到時候要換成你的數據庫名字
replicate-do-db=asyntest1
master-connect-retry=10
#出現錯誤後忽略,如果不加這個,出現任何錯誤,同步進程會終止
slave-skip-errors=all

在192.168.1.8, 192.168.1.88, 192.168.1.188上建立完全一樣的數據庫asyntest1,重啟這三臺數據庫,然後在任何一臺機器上進行的更新操作,都會同步到另外的兩臺機 器上,這是一種環形同步,在192.168.1.8有任何修改,會首先同步到192.168.1.88的機器上,88的機器再將同步的數據同步到 192.168.1.188的機器上。同樣,如果在192.168.1.88上有任何更新,首先會同步到192.168.1.188的機器上,然後再同步 到192.168.1.8的機器上;而在192.168.1.188的機器上有任何更新,首先會同步到192.168.1.8的機器上,然後在同步到 192.168.1.88的機器上。利用這種原理,可以解決任意多臺機器的互相同步問題。

如果出現問題,首先請在每一臺服務器上用命令行通過telnet命令檢查其他機器3306端口的連通情況。另外,請檢查各機器的防火墻設置和殺毒軟件的配置。可將這些軟件暫停後進行試驗。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *