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

 

解決多臺寫服務器主自增長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 是跳過錯誤,繼續執行復制操作

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

 

出現的問題(多主自增長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端口的連通情況。另外,請檢查各機器的防火牆設置和殺毒軟件的配置。可將這些軟件暫停後進行試驗。

 

原文:http://www.gaojinbo.com/mysql%E5%A4%9A%E4%B8%BB%E5%90%8C%E6%AD%A5-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章