Mariadb

耦合數據庫如何與選擇性單向同步和可能關閉數天的連接保持同步?

  • November 29, 2018

我正在嘗試創建一個如下所示的數據庫拓撲:

                 .------------.        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     |
'---------------'     '---------------'

一些表是專門從Remotesup推送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 上生成的數據。它們只同步到其他表行CentralCentral從不下推。Remotes' Bar

Remote DB1最後,當與或Remote DB2或或任何組合的連接失去時Central ,每個數據庫應繼續在本地執行,當連接恢復時,應將其擁有的每個表或表的子部分的更新推向適當的方向。


因此,考慮到這種拓撲結構,以及有時一個或多個遠端數據庫完全失去網際網路的限制,以及每個數據庫應該愉快地繼續而不同步直到連接恢復,是否有我可以在 MariaDB 中使用的集群配置, MySQL 或 PostgreSQL 將啟用這樣的拓撲?我知道他們Remotes正在做類似於“水平分片”的事情,除了我不希望他們獲得其他 Remotes'數據。

僅由 變異的“主數據”表Central顯然看起來像與 的經典主從關係Remotes,除了Remotes 當主離開時應該保持線上Central

關於水平分片 RemotesBar,我可以想像分配那些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)

引用自:https://dba.stackexchange.com/questions/223454