一、簡介
今天,跟大家分享一些企業級的互聯網技術。
我要介紹的就是分佈式數據庫(distributed database)。我儘量用通俗的語言,說清楚它的概念、產品和用法,文末還會提供學習資料下載。
分佈式數據庫堪稱最重要的數據庫,幾乎所有你知道的大型互聯網服務,都運行在它之上。

平時,我們自己開發,接觸的都是單機數據庫(又稱集中式數據庫),就是數據庫只運行在一臺服務器上。

(圖片說明:左側的單個數據庫服務器,支撐著整個應用。)
分佈式數據庫指的是,數據庫系統分佈在多臺服務器。

(圖片說明:單個數據庫分佈在多臺服務器上,共同支撐應用。)
在宏觀層面,金融、電信、航空、物流、電商等國民經濟的重要產業,都離不開分佈式數據庫。
如果沒有它,我們很難想象生活會變成什麼樣,比如12306那樣的購票網站,就沒法提供服務了。
在個人層面,當你從初級開發者成長為大型項目的架構師,就多多少少會遇到分佈式數據庫。
設計架構時,除非只用一臺服務器,否則就免不了要考慮,數據在多臺服務器之間如何拆分和保存。
總之,產品做大以後,分佈式數據庫是避不開的。對於個人來說,這也意味著事業和能力的進步。
二、分佈式數據庫的優點
分佈式數據庫為什麼那麼重要?因為它有一些單機數據庫無法比擬的優點。
(1)更安全。分佈式數據庫包含多個節點,不管是放在同一個機房,還是不同機房,都要比單機數據庫安全得多。
(2)高可用。如果單個數據庫節點故障下線,其他節點還可以照常工作,不會單點失敗。
(3)性能更好。對於大數據、大計算量的任務,分佈式數據庫可以並行處理,大大縮短處理時間。
(4)體驗更好。當數據庫分佈在多個機房,可以為用戶分配就近的數據庫節點,提供更好的響應速度。
三、分佈式數據庫的難點
雖然有上面這些優點,但是分佈式數據庫的使用並不普及,小公司一般不用它,這是為什麼?
主要原因是,分佈式數據庫有兩大問題,阻礙了它的普及:成本高和複雜性。
分佈式數據庫屬於"異地多活",提供了額外的冗餘性,來保障數據安全,成本高自不必多言。
它的複雜性主要體現在下面幾點。
(1)一致性問題。如何保證不同節點的數據一致?如果節點的數據不一致怎麼辦?
(2)通信問題。怎樣保證節點之間的通信可靠?如果通信延遲或失敗怎麼辦?
(3)分區問題。如果拆分大型數據表,數據儲存在不同的節點,那麼拆分策略、節點間的數據遷移可能會非常複雜。
(4)優化問題。如果來自多個節點的數據需要組合,查詢就必須優化以提高性能。
四、CAP 定理
大家可能知道,有一條著名的 CAP 定理,說的就是分佈式系統(包括分佈式數據庫)無法克服的侷限性。

分佈式系統有三大目標----數據一致(Consistency)、高可用(Availability)、數據分區(Partition tolerance)。
CAP 定理告訴我們,三大目標無法同時滿足,最多隻能同時做到兩個。在數據分區的前提下,要麼為了(強)一致性,捨棄高可用;要麼為了高可用,捨棄(強)一致性。
因此,任何分佈式數據庫都做不到完美,只能是三大目標的某種取捨和均衡。
五、分佈式數據庫的產品
分佈式數據庫的歷史非常悠久,市場上至少有上百種產品,有開源的,也有閉源的。

幾乎所有的分佈式數據庫,既可以單機使用(即作為單機數據庫),也可以多機聯合,分佈式使用。因此,很多我們熟悉的單機數據庫,其實也是分佈式數據庫。
開源的分佈式數據庫,比較有名的是 Postgres 和 MySQL(關係型數據庫),以及 MongoDB 和 CockroachDB(非關係型數據庫)。
商業數據庫裡面,最有名的就是 Oracle。它是分佈式數據庫事實上的標準,大企業一般都選擇用它。
六、國產數據庫 TDSQL
下面,我選擇國產數據庫 TDSQL 作為示例,介紹分佈式數據庫的功能和用法。

TDSQL 是騰訊的產品,屬於國內領先的分佈式數據庫。騰訊的幾乎所有關鍵業務,比如微信、QQ、騰訊音樂、騰訊遊戲等等,都運行在它之上,經受了高強度、海量的實戰考驗。
外部很多大公司也在用它,比如小紅書、拼多多、B 站、海爾、深圳地鐵等等。
它完全按照金融級的標準打造,屬於金融級數據庫,注重安全、高可用、高併發,客戶目前超過50萬。在國內金融行業,它服務 TOP10 銀行中的7家,已經助力30餘家金融機構的核心繫統改造。
TDSQL 是完全的國產數據庫,特別強調 Oracle 的兼容,企業現有的 Oracle 數據庫可以平滑遷移,它的成本要比 Oracle 低很多。如果國內企業有國產化和供應鏈安全的考慮,它是很好的替代品。
它的產品能力和自主研發,通過了國家認證(《中國信息安全測評中心的安全可靠測評結果公告(2023年第1號)》),對於國有企業的技術選型,這也是很重要的考慮之一。
最後,TDSQL 是騰訊雲對外公開的一個服務,任何人都可以使用。只要在網頁上點擊幾下,就開通了,非常容易上手。
七、分佈式數據庫的功能
我們通過 TDSQL,看看分佈式數據庫有哪些功能。
(1)強同步複製。分佈式數據庫往往採用主從式架構,一個集群有一個主節點(master)和若干個從節點(slave)。系統支持節點之間的強同步複製,以保證數據一致。
具體來說,寫入數據時,主節點會等待從節點返回操作成功消息,然後才向用戶返回結果,這樣保證了主節點和從節點的數據完全一致。
(2)事務一致性。系統為每一筆事務提供全局唯一數字序列,每個節點都可以查詢事務的執行情況,保證在分佈式環境下的事務一致性。
(3)自動拆分。分佈式數據庫的大型數據表,往往需要進行拆分,儲存在不同的節點。TDSQL 支持自動水平拆分(分表),將數據均勻寫入到不同節點,查詢時也自動聚合返回。
對於用戶來說,分表是透明的,完全可以無視,業務端看到的就是一張邏輯完整的表,無需感知後端的分表細節。
(4)高度可擴展。當數據庫性能或容量不足時,TDSQL 可以不停機擴展,只需在控制台點擊,就可自動升級完成。系統內的數據遷移、數據均衡和路由切換,都是自動的。
(5)高度靈活性。用戶可以在線變更表結構;遇到某些類型的故障,系統可以自動恢復;所有節點,不管是主節點還是從節點,都可進行讀寫。
(6)產品管控能力。TDSQL 對開發者友好,提供大量監控工具,實時監控和告警,每日推送詳細的健康探查報告。
騰訊雲有一個專門的雲服務 DBbrain,利用機器學習、大數據、專家經驗引擎等手段,為用戶的數據庫提供性能、安全、管理等功能。
比如,它會全方位診斷和優化 SQL,發現性能瓶頸,讓 SQL、事務、業務流水全鏈路可觀測,可視化展現死鎖等異常,易於理解。
它很大程度上了替代了人工 DBA,將傳統的人工運維變成智能化服務。
TDSQL 還有一個 AI 智能問答系統(下圖)。它基於知識庫與小模型訓練,快速準確地響應用戶查詢,相當於一個智能客戶,提供專業且個性化的解答。

八、TDSQL 的用法
下面,我來演示一下 TDSQL 的用法,很簡單,在網頁上開通後,你就可以使用分佈式數據庫了。
第一步,在 TDSQL 的官網上,進入產品控制台。

第二步,在控制台頁面,選擇數據庫服務器所在的地域(跟你的雲服務器應該是同一個地域),以及數據庫引擎,然後點擊"新建"按鈕。

目前 TDSQL 有三種引擎:MySQL、自研的 TDStore 和 PostgreSQL。不管哪一種引擎,都具備一樣的容災能力和高可用,並且兼容 Oracle。
第三步,會跳出一個配置頁面,讓你選擇數據庫配置。不同的配置,價格不一樣。
其中有一項,問你要不要開通"強同步"。

強同步可以確保主節點和從節點的數據一致性。如果你的應用不要求強一致,更在意快速返回結果,這裡可以選擇"異步"。
第四步,配置完成後,會進入付款環節,然後數據庫就開通了,你的分佈式數據庫就已經在線了。
使用時,需要先連接數據庫,分成內網連接和外網連接,這裡可以參考文檔。需要注意,如果開通外網連接,數據庫就暴露在公網上,任何人都可以請求,必須注意安全風險。
連接數據庫以後,就可以執行 SQL 語句了,到了這一步,就跟使用普通數據庫沒有任何區別。分佈式數據庫的 SQL 與單機數據庫,基本是一樣的。
九、TDSQL 的最佳實踐
分佈式數據有一些最佳實踐,下面舉出三個(以 MySQL 引擎為例)。
(1)如何將數據導入分佈式數據庫
這分成兩種情況。第一種情況是將現有的單機實例,導入到新建的分佈式實例。操作步驟如下(詳細命令見文檔)。
- 導出單機數據庫的表結構和數據,拿到兩個 SQL 文件。
- 打開數據庫的表結構文件,設置每個表的主鍵(primary key),以及分片依據的 shardkey。
- 將修改後的兩個 SQL 文件,上傳到雲服務器,導入到分佈式數據庫。
第二種情況是將現有的一個分佈式實例,導入到另一個分佈式實例。操作步驟與上面一樣,只是少了第二步,不需要指定主鍵和 shardkey,因為原來就有了。(詳細命令見文檔)。
(2)如何分片
分片(sharding)是分佈式數據庫的核心問題之一:到底要架設多少個數據分區?數據在多個分區如何分佈?
分片數量取決於,整個數據庫預估的最大併發,以及每個分片能夠處理的請求數量,可以用下面的公式計算。
讀寫併發性能 = ∑(分片性能 * 分片數量)
單個分片的性能,主要與實例的 CPU / 內存數量相關。單個分片規格越高、分片數量越多,數據庫系統的處理能力越強。
除了性能,分片還要考慮容量問題。一般來說,單個分片至少存儲5000萬行數據。
(3)如何配置硬件
分佈式數據庫的硬件,下面給出三個推薦的配置。
A. 測試功能。
這種情況不要求性能,只用來驗證系統,建議配置2個節點,每個節點 2GB 內存 + 25GB 硬盤。
B. 業務發展初期。
這種情況數據規模較小,增長快,建議配置2個節點,每個節點 16GB 內存 + 200GB 硬盤。
C. 業務發展穩定期。
這種情況根據業務實際情況配置,可以配置4個節點,每個節點硬件為:(當前業務峰值 * 增長率) / 4。
十、總結
總的來說,當代的分佈式數據庫產品,將自身的大量複雜性,都隱藏了起來,為用戶提供一個易用的操作接口。
一般來說,不建議自己搭建分佈式數據庫,即使你有專門的數據庫工程師和運維工程師,成本也會非常高。使用雲服務商的產品,是更經濟更省事的選擇。
就拿 TDSQL 來說,它有兩個版本:集群版和基礎版。前者是多節點的,供企業在生產環境使用;後者是單節點的,費用較低,專門供個人使用,但功能是一樣的,很適合個人開發者學習或者嘗試分佈式數據庫。
(完)
福利內容
在這個 AI 時代,如何使用雲服務,助力企業的數據管理?
下面是三個國內大廠的真實案例。
案例一:微信讀書的"AI 問書"。這個功能讓 AI 來回答讀者提問,關於海量的書籍內容的各種問題。
案例二:海峽銀行核心系統升級。省級銀行如何使用 TDSQL,將核心系統升級為分佈式數據庫。
案例三:極光大數據平臺的架構優化。極光(URORA)是國內領先的開發者服務提供商,數據量近百 PB,節點過千,文件4億,應該如何優化架構?
它們來自騰訊雲內部編寫的資料 《AGI 時代首選的全棧式數據管理方案》 ,包括工具指南、用戶案例分享等諸多內容。
現在可以免費下載,只需微信掃描下方二維碼。如果你關注國內真實環境中的企業級開發,不妨看看。














