當我們搭建MySQL
集羣時,自然需要完成數據庫的主從同步來保證數據一致性。而主從同步的方式也分很多種,一主多從、鏈式主從、多主多從,根據你的需要來進行設置。但只要你需要主從同步,就一定要注意server-id
的配置,否則會出現主從複製異常。
在控制數據庫數據複製和日誌管理中,有兩個重要的配置:server-id
和server-uuid
,他們會影響二進制日誌文件記錄和全局事務標識。
server-id
配置
當你使用主從拓撲時,一定要對所有MySQL
實例都分別指定一個獨特的互不相同的server-id
。默認值爲0
,當server-id=0
時,對於主機來說依然會記錄二進制日誌,但會拒絕所有的從機連接;對於從機來說則會拒絕連接其它實例。
MySQL
實例的server-id
是一個全局變量,可以直接查看:
mysql> show variables like '%server_id%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| server_id | 171562767 |
+---------------+-----------+
1 row in set (0.00 sec)
我們可以在線直接修改全局變量server-id
,但不會立即生效,所以修改後記得重啓服務。而重啓後又會重新讀取系統配置文件配置,導致剛纔的修改失效,因此建議修改配置文件後重啓服務而不是在線修改:
#my.cnf
[mysqld]
#replication
log-bin=mysql-bin
server-id=171562767
sync_binlog=1
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
server-id
用途
server-id
用於標識數據庫實例,防止在鏈式主從、多主多從拓撲中導致SQL
語句的無限循環:
- 標記
binlog event
的源實例 - 過濾主庫
binlog
,當發現server-id
相同時,跳過該event
執行,避免無限循環執行。 - 如果設置了
replicate-same-server-id=1
,則執行所有event
,但有可能導致無限循環執行SQL
語句。
我們用兩個例子來說明server-id
爲什麼不要重複:
當主庫和備庫server-id
重複時
由於默認情況replicate-same-server-id=0
,因此備庫會跳過所有主庫同步的數據,導致主從數據的不一致。
當兩個備庫server-id
重複時
會導致從庫跟主庫的連接時斷時連,產生大量異常。根據MySQL
的設計,主庫和從庫通過事件機制進行連接和同步,當新的連接到來時,如果發現server-id
相同,主庫會斷開之前的連接並重新註冊新連接。當A
庫連接上主庫時,此時B
庫連接到來,會斷開A
庫連接,A
庫再進行重連,周而復始導致大量異常信息。
生成server-id
的規則
既然server-id
不能相同,而當我們有10
個實例時,怎麼保證每個都不同呢?有幾種常用的方法:
- 隨機數
- 時間戳
-
IP
地址+端口 - 在管理中心集中分配,生成自增
ID
上面的這些方法都可以,但是注意不要超過了最大值2^32-1
,同時值最好>2
。我採用的方法是IP
地址後兩位+本機MySQL
實例序號,但如果是通過docker
來進行管理多實例時,這個怎麼生成大家可以想下有沒有什麼優美的解決方案。
server-uuid
配置
MySQL
服務會自動創建並生成server-uuid
配置:
- 讀取
${data_dir}/auto.cnf
文件中的UUID
- 如果不存在,自動創建文件和生成新的
UUID
並讀取
shell> cat ~/mysql/data/auto.cnf
[auto]
server-uuid=fd5d03bc-cfde-11e9-ae59-48d539355108
這個auto.cnf
配置風格類似於my.cnf
,但這個文件只包含一個auto
配置塊和一行server-uuid
配置。它是自動創建的,因此不要修改它的內容。
在主從拓撲中,主從可以知道互相的UUID
,在主機上使用show slave hosts
,在從機上使用show slave status
查看Master_UUID
字段。
server-uuid
參數並不能取代server-id
,他們有不同的作用。當主從同步時如果主從實例的server-uuid
相同會報錯退出,不過我們可以通過設置replicate-same-server-id=1
來避免報錯(不推薦)。
參考資料
- 17.1.6 Replication and Binary Logging Options and Variables:https://dev.mysql.com/doc/ref...
- 如何生成唯一的server Id:http://ju.outofmemory.cn/entr...