慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
分佈式數據庫入門:以國產數據庫 TDSQL 為例
阮一峰 · 2024-05-29 · via 阮一峰的网络日志

一、簡介

今天,跟大家分享一些企業級的互聯網技術。

我要介紹的就是分佈式數據庫(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)如何將數據導入分佈式數據庫

這分成兩種情況。第一種情況是將現有的單機實例,導入到新建的分佈式實例。操作步驟如下(詳細命令見文檔)。

  1. 導出單機數據庫的表結構和數據,拿到兩個 SQL 文件。
  2. 打開數據庫的表結構文件,設置每個表的主鍵(primary key),以及分片依據的 shardkey。
  3. 將修改後的兩個 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 時代首選的全棧式數據管理方案》 ,包括工具指南、用戶案例分享等諸多內容。

現在可以免費下載,只需微信掃描下方二維碼。如果你關注國內真實環境中的企業級開發,不妨看看。