<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分庫分表真的適合你的系統(tǒng)嗎?聊聊分庫分表和NewSQL如何選擇

          共 5000字,需瀏覽 10分鐘

           ·

          2022-07-17 14:55

          Hollis的新書限時折扣中,一本深入講解Java基礎(chǔ)的干貨筆記!

          曾幾何時,“并發(fā)高就分庫,數(shù)據(jù)大就分表”已經(jīng)成了處理 MySQL 數(shù)據(jù)增長問題的圣經(jīng)。

          面試官喜歡問,博主喜歡寫,候選人也喜歡背,似乎已經(jīng)形成了一個閉環(huán)。

          但你有沒有思考過,分庫分表真的適合你的系統(tǒng)嗎?

          分表

          在業(yè)務(wù)剛剛發(fā)展起來的時候,流量全部打到了一個 MySQL 上,用戶信息全落到了 user 表。

          后來,user 表的數(shù)據(jù)量越來越大了。

          于是,你做了一次垂直拆分,將原來的 user 表拆分成了新的 user 表和 user_details 表。

          這樣一拆之后,用戶的信息分散到兩個表,user 表的數(shù)據(jù)量一下就變小了,user 表數(shù)據(jù)量過大的問題暫時就解決了。

          但隨著業(yè)務(wù)的發(fā)展,線上的流量越來越大,單個 MySQL 已經(jīng)扛不住流量的壓力了。

          單個庫承受不住壓力的時候,就需要分庫了。

          分庫

          顧名思義,分庫就是將一個庫拆成多個庫,讓多個庫分擔(dān)流量的壓力。

          拆成多個庫也意味著進(jìn)行了分表,也就是說分庫一定分表,分表不一定分庫。

          我們可以根據(jù)偏應(yīng)用還是偏 DB,將分庫分表的實現(xiàn)方式分成三種類型:

          • JDBC 代理模式
          • DB 代理模式
          • Sharding On MySQL 的 DB 模式

          JDBC 代理模式

          JDBC 代理模式是一種無中心化的架構(gòu)模式。ShardingSphere-JDBC 就是 JDBC 代理模式的典型實現(xiàn)。

          通常以 jar 包形式提供服務(wù),讓客戶端直連數(shù)據(jù)庫,這種模式無需額外部署和依賴,可理解為增強(qiáng)版的 JDBC 驅(qū)動。

          JDBC 代理模式雖然簡單,但違背了 DB 透明的原則,侵入性比較高,需要針對不同的語言編寫不同的 Driver。

          美團(tuán)的 Zebra、MTDDL,阿里 TDDL 都是基于這種模式的實現(xiàn)。

          DB 代理模式

          DB 代理模式是中心化的架構(gòu)模式。ShardingSphere-Proxy 就是 DB 代理模式的經(jīng)典實現(xiàn)。

          這種模式旨在實現(xiàn)透明化的數(shù)據(jù)庫代理端,并獨立于應(yīng)用部署,因為獨立部署,所以對異構(gòu)語言沒有限制,不會對應(yīng)用造成侵入。

          DB 代理模式比 JDBC 代理模式消耗的連接數(shù)會少,相對來說性能也會更好。

          但中心化的設(shè)計也帶來了單點的問題,為了保持高可用和高性能,還需要引入 LVS/F5 等 VIP 來實現(xiàn)流量的負(fù)載均衡,如果跨 IDC,還依賴諸如 DNS 進(jìn)行 IDC 分發(fā),大大拉長了應(yīng)用到數(shù)據(jù)庫的鏈路,進(jìn)而提高了響應(yīng)時間。

          阿里的 MyCat、美團(tuán)的 Meituan Atlas 和百度 Heisenberg 就是基于 DB 代理模式的實現(xiàn)。

          Sharding On MySQL

          Sharding On MySQL 相當(dāng)于屏蔽了分庫分表的操作,是運維和中間件結(jié)合的沉淀,比較典型例子是阿里的 DRDS。

          這種模式讓分庫分表變得模糊,對應(yīng)用來說,更像是一個封裝了 MySQL 的新型數(shù)據(jù)庫。

          雖然用戶使用變得更簡單了,但簡單的背后是運維的沉淀,分庫分表該存在的問題它依然存在。

          分庫分表的成本

          實現(xiàn)分庫分表的方式有很多,但不同模式的實現(xiàn)似乎都是在彌補(bǔ) MySQL 不支持分布式的缺陷。

          分庫分表這種強(qiáng)行讓 MySQL 達(dá)到一個偽“分布式”的狀態(tài),也帶來了一些新的問題,比如:

          1. 功能限制問題:分庫分表后跨維度 join、聚合、子查詢不復(fù)存在,唯一鍵、外鍵等全局約束也只能靠業(yè)務(wù)保障,DB 慢慢弱化為存儲。
          2. 運維復(fù)雜度問題:分庫分表后的多個庫表的管理麻煩,運維成本非常高,數(shù)據(jù)查詢也很麻煩。
          3. Sharding Key 問題:非 Sharding key 的查詢需要做額外的冗余處理,需要引入 Elasticsearch、ClickHouse 等其他節(jié)點,進(jìn)一步提高了系統(tǒng)的復(fù)雜度。
          4. 唯一 ID 問題:分庫分表后唯一 ID 得不到保障,需要對唯一 ID 進(jìn)行改造。
          5. 分布式事務(wù)問題:MySQL 自帶的 XA 柔性事務(wù)性能太低,需要引入新的分布式事務(wù)解決方案。

          NewSQL

          從上文得知,分庫分表需要犧牲 MySQL 的一些功能,還帶來許多新的問題。

          那有沒有一種方案,既能擁有 MySQL 的功能,又能支持?jǐn)?shù)據(jù)的可擴(kuò)展?

          有。那就是 NewSQL。

          NewSQL 是一類關(guān)系數(shù)據(jù)庫管理系統(tǒng),旨在為在線事務(wù)處理(OLTP) 工作負(fù)載提供 NoSQL 系統(tǒng)的可擴(kuò)展性,同時保持傳統(tǒng)數(shù)據(jù)庫系統(tǒng)的 ACID 保證。

          國內(nèi)比較知名的 NewSQL 有阿里的 OceanBase、騰訊的 TDSQL、PingCAP 的 TiDB。它們既有 MySQL 的功能,又有分布式可擴(kuò)展的能力。

          筆者對阿里的 OceanBase 只能說是略懂皮毛,就不過多描述。

          我們重點看一下騰訊的 TDSQL 和 PingCAP 的 TiDB。

          從兩者的架構(gòu)圖(省略了部分模塊)上可以看出,TDSQL 和 TiDB 的架構(gòu)只有一些命名差別,可以說幾乎一模一樣。

          兩者整體來說分為三個部分:

          1. 計算:負(fù)責(zé)接受客戶端的連接,執(zhí)行 SQL 解析和優(yōu)化,最終生成分布式執(zhí)行計劃轉(zhuǎn)發(fā)給底層的存儲層執(zhí)行。(TDSQL:SQL Engine 、TiDB:TiDB-Server)
          2. 存儲:分布式KV 存儲,類似 NoSQL 數(shù)據(jù)庫,支持彈性擴(kuò)容和縮容。(TDSQL:TDStore 、TiDB:TiKV)
          3. 管控:整個集群的元信息管理模塊,是整個集群的大腦。(TDSQL:TDMetaCluster 、TiDB:Placement Driver )

          兩者核心的存儲模塊(TDStore/TiKV),都是基于 RocksDB 開發(fā)而來,都是KV 存儲的模式。

          RocksDB 是由 Facebook 基于 LevelDB 開發(fā)的一款提供鍵值存儲與讀寫功能的 LSM-tree 架構(gòu)引擎。

          底層利用了WAL(Write Ahead Log)技術(shù)Sorted String Table,比 B 樹類存儲引擎更高的寫吞吐。

          NewSQL 平滑接入方案

          因為筆者落地過 TiDB,所以會以 TiDB 為例描述如何接入 NewSQL,做到不影響線上使用的平滑遷移。

          第一步:初始狀態(tài),所有線上讀和寫都落到 MySQL。

          第二步:將 TiDB 作為 MySQL 的從節(jié)點接入系統(tǒng),所有線上讀寫還是都落到 MySQL,日末通過腳本或者任務(wù)驗證 MySQL 的數(shù)據(jù)和 TiDB 的數(shù)據(jù)是否一致,這一步主要驗證 MySQL 數(shù)據(jù)同步到 TiDB 沒有問題。

          第三步:將部分讀切換到 TiDB,這一步主要驗證 TiDB 同步的數(shù)據(jù)讀沒有問題,驗證系統(tǒng) SQL 能正常在 TiDB 執(zhí)行。

          第四步:斷掉 MySQL 和 TiDB 之間的同步,雙寫 MySQL 和 TiDB,所有的線上讀流量都落到 MySQL。

          第五步:將部分讀流量切到 TiDB,驗證 TiDB 寫入的數(shù)據(jù)能夠正常讀取。這一階段可以將部分冪等任務(wù)同時在兩個數(shù)據(jù)源上執(zhí)行,驗證兩者數(shù)據(jù)是否一致。

          第六步:將所有的線上讀流量切到 TiDB,同時保持雙寫,如果出問題隨即切到 MySQL。

          第七步:斷掉 MySQL 的寫流量,將 MySQL 作為 TiDB 的一個從庫,作為降級使用。

          整個方案的基礎(chǔ)是:TiDB 兼容 MySQL 協(xié)議和 MySQL 生態(tài)

          這個方案是建立在完全不信任 TiDB的基礎(chǔ)上設(shè)計的,驗證了 TiDB 和 MySQL 的契合點,所以整體會比較繁瑣,實際落地的時候可以根據(jù)情況省略一部分步驟。

          NewSQL 真的有那么好嗎?

          NewSQL 并是不萬能的,也不必去過于神化 NewSQL,國內(nèi)比較知名的幾種 NewSQL 或多或少都存在部分功能缺陷,以 TiDB 為例:

          1. TiDB 的自增 ID 只能保證單個 TiKV 上的自增,并不能保證全局自增。
          2. 由于 TiKV 存儲是根據(jù) key 的二進(jìn)制順序排列的,使用自增 ID 可能會造成熱塊效應(yīng)。
          3. TiDB 默認(rèn) RC(讀已提交)的事務(wù)隔離級別,并且不支持 RR(可重復(fù)讀)隔離級別,雖然提供了基本等價于RR的SI(Snapshot Isolation),但還是存在寫偏斜問題
          4. TiDB 的點查(select point)性能比 MySQL 要差不少,在幾個億級別的數(shù)據(jù)量才能勉強(qiáng)和 MySQL 打平。
          5. 因為底層基于 Raft 協(xié)議做數(shù)據(jù)同步,所以 TiDB 延遲會比 MySQL 要高。
          6. ...

          所以說,NewSQL 也并不是屠龍刀,需要根據(jù)實際應(yīng)用去評估這些缺陷帶來的影響。

          NewSQL 的應(yīng)用

          NewSQL 在國內(nèi)其實已經(jīng)發(fā)展了很多年,OceanBase 誕生于 2010 年,TDSQL 可追溯到 2004 年,TiDB 誕生于 2015 年。

          三者在國內(nèi)外積累了不少的客戶案例。

          OceanBase

          1. OceanBase 已經(jīng)覆蓋螞蟻集團(tuán)100%核心鏈路,支撐全部五大業(yè)務(wù)板塊。目前運行數(shù)十億條不同的 SQL、數(shù)據(jù)量達(dá)數(shù)百 PB、服務(wù)器核數(shù)過百萬。
          2. 中國工商銀行全行業(yè)務(wù)都使用 OceanBase,包含不限于存、貸、支付結(jié)算及創(chuàng)新業(yè)務(wù)等。
          3. OceanBase 憑借混合云架構(gòu)、高可用、Oracle 兼容等特性,通過分布式中間件、金融套件、移動開發(fā)平臺集成解決方案,支撐網(wǎng)商銀行核心系統(tǒng)數(shù)字化轉(zhuǎn)型。
          4. 招商銀行的“海量行情系統(tǒng)”和“歷史收益系統(tǒng)”就是采用 OceanBase 作為底層數(shù)據(jù)庫。

          TDSQL

          1. 微眾銀行實現(xiàn)了 TDSQL 私有化部署,是一個典型的兩地多中心架構(gòu)。
          2. 富途證券的港股交易系統(tǒng)、東吳證券新一代核心交易系統(tǒng)底層存儲都是 TDSQL。
          3. 數(shù)字廣東粵省事深圳地鐵碼上乘車等業(yè)務(wù)都是在 TDSQL 上面跑的。
          4. 平安銀行、中國農(nóng)業(yè)銀行、華夏銀行、中國銀行都有相關(guān)業(yè)務(wù)在 TDSQL 上。

          TiDB

          1. 北京銀行的網(wǎng)聯(lián)支付業(yè)務(wù),所有北京銀行的銀行卡綁定在比如支付寶、微信上的支付操作,后端的數(shù)據(jù)庫就是運行在 TiDB,而且是一個典型的兩地三中心同城雙活的架構(gòu),這個業(yè)務(wù)非常的關(guān)鍵,如果業(yè)務(wù)中斷超過一定時間,就是需要上報銀監(jiān)會的。
          2. 日本排名第一的支付公司——Paypay,錢包和支付的業(yè)務(wù)都在 TiDB 上面。
          3. 中國人壽的壽財險業(yè)務(wù),正在用 TiDB 陸續(xù)替換 Oracle 。
          4. 肯德基所有的會員登錄系統(tǒng),包括 KFC 的 APP 以及第三方登錄,后臺數(shù)據(jù)庫都是用的 TiDB ,這套業(yè)務(wù) 2020 年 4 月份上線,已經(jīng)經(jīng)歷過多次肯德基的大促等活動,目前肯德基的后臺支付系統(tǒng)也已經(jīng)切換到 TiDB 上。
          5. 麥當(dāng)勞的賬戶以及訂單系統(tǒng)全部基于 TiDB,如果 TiDB 出問題了,那么國內(nèi)所有的麥當(dāng)勞門店,包括線上和線下的點單系統(tǒng)都將沒法正常運行。
          6. 微眾銀行最核心和最賺錢的微粒貸業(yè)務(wù),后臺的全量批處理業(yè)務(wù)就運行在 TiDB 上面。

          分庫分表和 NewSQL 到底怎么選?

          分庫分表是一個重量級的方案,它會帶來很多新的問題,對基建和運維的要求也很高。

          NewSQL 功能強(qiáng)大但也有功能缺陷。

          如何去抉擇需要根據(jù)系統(tǒng)現(xiàn)狀和公司情況去綜合判斷。

          分庫分表是一個重量級的方案,如果讀寫分離冷熱分離等輕量級方案能解決的問題就沒必要上分庫分表

          如果緩存分流和讀寫分離都扛不住了,且你身處互聯(lián)網(wǎng)企業(yè),基建尚可且運維也跟得上,分庫分表仍然是第一選擇;

          但如果你身處一個傳統(tǒng)的企業(yè),基建很差甚至沒有基建,那么你可以考慮考慮NewSQL

          技術(shù)沒有高低之分,能解決問題的技術(shù)就是好技術(shù),技術(shù)方案選擇上切莫炫技,也切勿過度設(shè)計!

          參考資料

          • https://shardingsphere.apache.org/document/current/cn/overview/
          • https://docs.pingcap.com/zh/tidb/stable/tidb-architecture
          • https://www.oceanbase.com/customer/home
          • https://dbaplus.cn/news-11-1854-1.html


          我的新書《深入理解Java核心技術(shù)》已經(jīng)上市了,上市后一直蟬聯(lián)京東暢銷榜中,目前正在6折優(yōu)惠中,想要入手的朋友千萬不要錯過哦~長按二維碼即可購買~


          長按掃碼享受6折優(yōu)惠


          往期推薦

          突然宣布解散!


          SpringBoot 生產(chǎn)中 16 條最佳實踐


          HTTP/3發(fā)布了,我們來談?wù)凥TTP/3




          有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

          歡迎大家關(guān)注Java之道公眾號


          好文章,我在看??

          瀏覽 59
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人干AV人人操 | 粉嫩av懂色av蜜臀av熟妇 | 国产精品色在线 | 免费麻豆国产一区二区三区四区 | 国产区视频在线播放 |