一、簡介
今天,跟大家分享一些企業級的網際網路技術。
我要介紹的就是分散式資料庫(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 對開發者友好,提供大量監控工具,實時監控和告警,每日推送詳細的健康探查報告。
比如,它會全方位診斷和最佳化 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)如何配置硬體
分散式資料庫的硬體,下面給出三個推薦的配置。
這種情況不要求效能,只用來驗證系統,建議配置2個節點,每個節點 2GB 記憶體 + 25GB 硬碟。
B. 業務發展初期。
這種情況資料規模較小,增長快,建議配置2個節點,每個節點 16GB 記憶體 + 200GB 硬碟。
C. 業務發展穩定期。
這種情況根據業務實際情況配置,可以配置4個節點,每個節點硬體為:(當前業務峰值 * 增長率) / 4。
十、總結
總的來說,當代的分散式資料庫產品,將自身的大量複雜性,都隱藏了起來,為使用者提供一個易用的操作介面。
一般來說,不建議自己搭建分散式資料庫,即使你有專門的資料庫工程師和運維工程師,成本也會非常高。使用雲服務商的產品,是更經濟更省事的選擇。
就拿 TDSQL 來說,它有兩個版本:叢集版和基礎版。前者是多節點的,供企業在生產環境使用;後者是單節點的,費用較低,專門供個人使用,但功能是一樣的,很適合個人開發者學習或者嘗試分散式資料庫。
(完)
福利內容
在這個 AI 時代,如何使用雲服務,助力企業的資料管理?
下面是三個國內大廠的真實案例。
案例二:海峽銀行核心系統升級。省級銀行如何使用 TDSQL,將核心系統升級為分散式資料庫。
案例三:極光大資料平臺的架構最佳化。極光(URORA)是國內領先的開發者服務提供商,資料量近百 PB,節點過千,檔案4億,應該如何最佳化架構?
它們來自騰訊雲內部編寫的資料 《AGI 時代首選的全棧式資料管理方案》 ,包括工具指南、使用者案例分享等諸多內容。
現在可以免費下載,只需微信掃描下方二維碼。如果你關注國內真實環境中的企業級開發,不妨看看。