耦合數據庫如何與選擇性單向同步和可能關閉數天的連接保持同步?
我正在嘗試創建一個如下所示的數據庫拓撲:
.------------. Bad Connection. Bad Connection. | Central DB | May go offline May go offline '------------' for days. for days. | | . \ | | / ' .-------- ------------' | | | | .-------------. .-------------. | Remote DB1 | | Remote DB2 | '-------------' '-------------'
一些表專門從
Central
下推到Remotes
.------------. | Central DB | |-------------| | Master Data | | Table Foo | '------------' | | V V .-------- ------------. | | V V .---------------. .---------------. | Remote DB1 | | Remote DB2 | |---------------| |---------------| | Unmodified | | Unmodified | | Slave Copy of | | Slave Copy of | | Table Foo | | Table Foo | '---------------' '---------------'
一些表是專門從
Remotes
up推送Central
的,每個單獨Remote
變異的行由單獨的Remote
節點專門變異。.---------------. | Central DB | |---------------| | Slave | | Table Bar | |---------------| | Row a from DB2| | Row b from DB2| | Row c from DB1| | Row d from DB1| | Row e from DB1| | Row f from DB2| '---------------' | | ^ ^ .-------- ------------. | | ^ ^ .------------. .------------. | Remote DB1 | | Remote DB2 | |------------| |------------| | Table Bar | | Table Bar | |------------| |------------| | Row c | | Row a | | Row d | | Row b | | Row e | | Row f | '------------' '------------'
遠端 DB1 不應獲取遠端 DB2 上生成的數據。它們只同步到其他表行
Central
,Central
從不下推。Remotes'
Bar
Remote DB1
最後,當與或Remote DB2
或或任何組合的連接失去時Central
,每個數據庫應繼續在本地執行,當連接恢復時,應將其擁有的每個表或表的子部分的更新推向適當的方向。因此,考慮到這種拓撲結構,以及有時一個或多個遠端數據庫完全失去網際網路的限制,以及每個數據庫應該愉快地繼續而不同步直到連接恢復,是否有我可以在 MariaDB 中使用的集群配置, MySQL 或 PostgreSQL 將啟用這樣的拓撲?我知道他們
Remotes
正在做類似於“水平分片”的事情,除了我不希望他們獲得其他Remotes'
數據。僅由 變異的“主數據”表
Central
顯然看起來像與 的經典主從關係Remotes
,除了Remotes
當主離開時應該保持線上Central
。關於水平分片
Remotes
表Bar
,我可以想像分配那些Remotes
專門變異的 PK ID 範圍。有沒有辦法用集群技術做這個拓撲,或者我需要手動滾動一些增量數據庫轉儲,比如MySQL 中的這種技術?
設置必須應對幾天中斷的網路連接的要求有效地排除了“虛擬”同步多主解決方案,如 Galera 和 MySQL 組複製。你也可以忘記 MySQL NDB Cluster。
但是,我認為非同步 MariaDB 或 MySQL 解決方案可以滿足您的需求,假設二進制日誌足夠大,可以容納網路連接中斷時累積的數據。
似乎非同步 MariaDB / MySQL 主-主複製可能能夠滿足您的需求。主-主複製基本上是主從複製的兩個實例,其中每個伺服器在一個複制連接中是主伺服器,在另一個複制連接中是從伺服器。此外,
auto_increment_increment = 2
在兩台伺服器auto_increment_offset = 1
上,第一台伺服器和auto_increment_offset = 2
另一台伺服器上都有。這樣,當使用語句auto_increment
中的主鍵特性時,兩個數據庫伺服器都不會導致衝突。INSERT
這也將消除您的案例中對分片的任何需求。因此,您需要在 Central DB 和 Remote DB1 之間設置主-主複製,並在 Central DB 和 Remote DB2 之間設置單獨的主-主複製。
您還需要進行設置,以便僅將該表從 Central DB 複製到 Remote DB1 和 Remote DB2。同樣,只有該表從 Remote DB1 複製到 Central DB,從 Remote DB2 複製到 Central DB。
replicate-do-table
=foo``replicate-do-table=bar
還有更多細節,例如GTID(這是一個最初不可用的功能,但現在是個好主意),但在這裡我建議您查看其他地方的可用文件,例如:
MariaDB 上的簡單主-主複製(tunnelix.com)
如何設置 MySQL 主-主複製(howtoforge.com)