標籤:
解決多台寫伺服器主自增長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連接埠的連通情況。另外,請檢查各機器的防火牆設定和殺毒軟體的配置。可將這些軟體暫停後進行實驗。
mysql主從同步