解決多臺寫服務器主自增長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