純乾貨:分佈式數據庫實踐篇 1

DB 發展

MySQL 的高可用

MySQL 的主從庫之間是通過 binlog 來做。主庫掛了,選擇哪個從庫變成主庫?同步關係需要改變。

接下來,我們看一個落地的 MySQL 高可用方案,這個方案是從從 MHA 演進來的,做了一些精簡。

我們先看倒數第三層:檢查與故障切換。MySQL 主備庫的健康可以通過一個測試庫中的測試表實現,即定期向 test table 中插入一些內容,來確認主從庫是不是好的。這是由 healthcheck server 組件完成的。

那麼當 Master 掛了以後,是 slave1 還是 slave2 被提升爲主庫?

看哪個從庫上同步的數據多,就變成主庫。這是由 failover server 完成的。

接下來,我們還需要考慮一下 DB 切換所帶來的 IP 變化問題。我們希望 DB 的主從切換對業務是透明的。DAS 需要連接 VIP。這個 VIP 是飄的。哪個庫是主庫,這個 VIP 就飄到那個庫上。這是 TGW VIP 負責的。

日誌會記錄 DB 相關發生的日誌。當健康檢查模塊發現 DB 有問題的時候,會觸發報警接口,這樣 DBA 就可以收到報警進行處理了。

管理組信息:裏面有那些 DB 集羣需要做監控和主從切換。DB 的 IP、Port、用戶名、密碼。

頂層 web 是一個 dashboard,它可以調用 API 層(POST、GET 請求)來管理整個 DB 架構。

上述架構整體的調用邏輯可以參照下圖,具體內容不展開說明。

NoSQL 介紹

接下來我們看 NoSQL。

NoSQL 的全稱是:Not Only Sql。它的優勢是:

NoSQL 有以下幾類產品:

鍵值存(KV)儲型:

Memcached、Redis

列存儲:

Cassadra、HBase

圖形數據庫(Graph)

Neo4J、InfoGrid、Infinite Graph

文檔型:

MongoDB、CouchDB

MongoDB 是面向文檔的 NoSQL 數據庫,它是通過 C++ 書寫的,具有高擴展性、高性能。

MongoDB 天然支持嵌套。如下圖所示,第一個 People 表中關於住址就是一個 ID,嵌套到第二個表。

MongoDB 高可用架構

此前坊間流傳 MongoDB 容易丟數據。主要是爲了保證性能,把 mongodb 的 redolog 和強同步給關掉了。2.4 之前,默認這兩個配置是關的。

目前這些問題已經被解決了。

爲了保證數據落庫,必須要保證寫日誌落到本地磁盤,joutnal。這樣即使內存中的數據丟了,我們也可以從日誌上進行恢復。

MongoDB 有個寫關注的概念。

MongoDB 定義瞭如下四種寫關注級別,依次從弱到強。我們用後兩種:

下圖中,。因爲是 w:2。所以寫操作會強一致寫兩份。

MongoDB 的高可用是通過副本集 replica set 實現。一個副本集通常是一主雙從。一個副本集通常是跨交換機的,採取 raft 分佈式協議選舉。

數據不丟失是 CP 模型,犧牲的是 A。但我們希望 HA 提供 A 的功能實現。一主兩從就是一個副本集。

MongDB 的系統架構如下:mongodb 天然支持 sharding,從 DAS 訪問 MongoDB 的時候,經過 mongos 這個 router。而 config server 存放的是元數據。

數據可能會在 mongos 上做匯聚。momgos 是無狀態的。

Sharding 的兩種方式如下:

hash 哈希方式:取模

按照 range 方式分表。

需要注意的是,hash 不支持範圍查詢。

下圖是按照 range 方式分表:

下圖是按照哈希方式分表。哈希精準查詢的速度很快,如下圖所示

MogoDB 線上分片結構如下。我們看到每個 sharding 是一主兩從。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/YmHzBv3bYIS-gM2Geu9P5Q