【Otter】關(guān)于otter雙A模式的一點疑問
何為雙A模式:可以簡單理解為MySQL的雙主模式,互為主從
具體可參考:https://github.com/alibaba/otter/wiki/Manager配置介紹
官方博客的配置方法:
雙A同步相比于雙向同步,整個配置主要是一些參數(shù)上有變化,具體步驟:
成都創(chuàng)新互聯(lián)自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、網(wǎng)站制作、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團隊及專業(yè)的網(wǎng)站設(shè)計師團隊。
-
配置一個channel
-
配置兩個pipeline
* 注意:除了需要定義一個主站點外,需要在高級設(shè)置中將一個pipeline的“支持DDL”設(shè)置為false,另一個設(shè)置為true,否則將提示“一個channel中只允許開啟單向ddl同步!”錯誤
-
每個pipeline各自配置canal,定義映射關(guān)系
背景:
111<->112 雙A模式
111->112_canal:111 同步數(shù)據(jù)至112
-
主站點:true
-
支持ddl同步: 關(guān)閉
-
跳過ddl異常: 開啟
112->111_canal:112同步數(shù)據(jù)至111
-
主站點:flase
-
支持ddl同步: 開啟
-
跳過ddl異常: 開啟
在以上的背景下
疑問一:數(shù)據(jù)的增刪查改都沒問題,但是當(dāng)在111上 執(zhí)行create table/Truncate 這類DDL語句后,不會同步到112上,反之在112上執(zhí)行可以同步至111,因為支持ddl同步這個參數(shù)的原因
解決辦法:
待續(xù)
疑問二:當(dāng)表沒有主鍵約束時,在非主站點上執(zhí)行insert會重復(fù)插入一條如:
-
非主站點上執(zhí)行:
-
mysql> insert into test3 values(5);
-
Query OK, 1 row affected (0.01 sec)
-
-
mysql> select * from test3;
-
+------+
-
| id |
-
+------+
-
| 4 |
-
| 5 |
-
| 5 |
-
+------+
-
3 rows in set (0.00 sec)
-
-
主站點上:
-
mysql> select * from test3;
-
+------+
-
| id |
-
+------+
-
| 4 |
-
| 5 |
-
+------+
-
2 rows in set (0.00 sec)
同步至主站點了,但是非主站點會再插入一遍
原因:otter設(shè)計的單向回環(huán)
思路:最終一致性
適用場景: A地和B地數(shù)據(jù)不對等,比如A地為主,寫入量比較高,B地有少量的數(shù)據(jù)寫入
單向回環(huán)流程:(比如圖中以HZ為trusted source站點)
-
us->hz同步的數(shù)據(jù),會再次進(jìn)入hz->us隊列,形成一次單向回環(huán)
-
hz->us同步的數(shù)據(jù),不會進(jìn)入us->hz隊列(回環(huán)終止,保證不進(jìn)入死循環(huán))
解決辦法:設(shè)計表都帶上自增主鍵
疑問三:如果兩邊同時插入一條數(shù)據(jù),自增id怎么辦?
-
mysql> select * from admin;
-
+----+---------+
-
| id | role_id |
-
+----+---------+
-
| 8 | 77 |
-
| 9 | 777 |
-
| 11 | 99 |
-
| 12 | 999 |
-
| 16 | 888 | ---可以看到,主站點丟失,未插入!
-
+----+---------+
-
5 rows in set (0.00 sec)
在github上《otter數(shù)據(jù)庫入庫算法》部分看到這樣一段話:合并算法執(zhí)行后,單pk主鍵只有一條記錄,減少并行l(wèi)oad算法的復(fù)雜性(比如batch合并,并行/串行等處理)
因為并發(fā)插入之間的時間間隔非常短,短于同步之間的延遲,在主副站點分別插入后是同一條pk建,并且副站點后插入,那么副站點是最新副本集也就是trust 點,副站點數(shù)據(jù)覆蓋主站點數(shù)據(jù),《otter數(shù)據(jù)一致性》詳解!
解決辦法:參考官方雙a的做法,設(shè)置步長和起始值
-
修改兩臺的步長
-
mysql> show global variables like '%auto_increment_increment%';
-
+--------------------------+-------+
-
| Variable_name | Value |
-
+--------------------------+-------+
-
| auto_increment_increment | 2 |
-
+--------------------------+-------+
-
-
mysql> show global variables like '%auto_increment_increment%';
-
+--------------------------+-------+
-
| Variable_name | Value |
-
+--------------------------+-------+
-
| auto_increment_increment | 1 |
-
+--------------------------+-------+
-
-
再次測試
-
[root@DB-22 dbaadmin]# python test.py
()
()
all over Mon Jul 31 17:54:10 2017
[root@DB-22 dbaadmin]# python test.py
()
()
all over Mon Jul 31 17:54:21 2017
-
mysql> select * from admin;
+----+---------+
| id | role_id |
+----+---------+
| 28 | 111 |
+----+---------+
1 row in set (0.00 sec)
mysql> select * from admin;
+----+---------+
| id | role_id |
+----+---------+
| 28 | 111 |
| 29 | 888 |
| 30 | 88 |
+----+---------+
3 rows in set (0.00 sec)
mysql> select * from admin;
+----+---------+
| id | role_id |
+----+---------+
| 28 | 111 |
| 29 | 888 |
| 30 | 88 |
| 31 | 888 |
| 32 | 88 |
+----+---------+
5 rows in set (0.00 sec)
文章名稱:【Otter】關(guān)于otter雙A模式的一點疑問
文章位置:
http://weahome.cn/article/pcgghh.html