主頁 > 資料庫 > 分而治之 -- 淺談分庫分表及實踐之路

分而治之 -- 淺談分庫分表及實踐之路

2023-06-01 09:49:28 資料庫

前言

之前總在聊微服務, 微服務本身也是分布式系統,其實微服務的核心思想是分而治之,把一個復雜的單體系統,按照業務的交付,分成不同的自服務,以降低資深復雜度,同時可以提升系統的擴展性,

今天想聊一下分庫分表,因為對于快速增長的業務來說,這個是無法回避的一環,之前我在做商城相關的SAAS系統,商品池是一個存盤瓶頸,商品池數量會基于租戶增長和運營變得指數級增長,短短幾個月就能漲到幾千萬的資料,而運營半年后就可能過億,而對于訂單這種資料,也會跟著業務的成長,也會變得愈發巨大,

存盤層來說,提升大資料量下的存盤和查詢性能,就涉及到了另一個層面的問題,但思想還是一樣的,分而治之,

我們面臨什么樣的問題

關系型資料庫在大于一定資料量的情況下檢索性能會急劇下降,在面對海量資料情況時,所有資料都存于一張表,顯然會輕易超過資料庫表可承受的,

此外單純的分表雖然可以解決資料量過大導致檢索變慢的問題,但無法解決過多并發請求訪問同一個庫,導致資料庫回應變慢的問題,所以需要分庫來解決單資料庫實體性能瓶頸問題,

資料庫架構方案

在講具體解決方案之前,我們需要先了解一下資料庫的三種架構涉及方案,

1. Shared Everything

一般指的是單個主機的環境,完全透明共享的CPU/記憶體/硬碟,并行處理能力是最差的,一般不考慮大規模的并發需求,架構比較簡單,一般的應用需求基本都能滿足,

2. Shared Disk

各處理單元使用自己的私有CPU和Memory,共享磁盤系統,典型的代表是Oracle RAC、DB2 PureScale,例如Oracle RAC,他用的是共享存盤,做到了資料共享,可通過增加節點來提高并行處理的能力,擴展能力較好,使用Storage Area Network (SAN),光纖通道連接到多個服務器的磁盤陣列,降低網路消耗,提高資料讀取的效率,常用于并發量較高的OLTP應用,其類似于SMP(對稱多處理)模式,但是當存盤器介面達到飽和的時候,增加節點并不能獲得更高的性能,同時更多的節點,則增加了運維的成本,

3. Shared Nothing

各處理單元都有自己私有的CPU/記憶體/硬碟等,Nothing,顧名思義,不存在共享資源,類似于MPP(大規模并行處理)模式,各處理單元之間通過協議通信,并行處理和擴展能力更好,典型代表DB2 DPF、帶分庫分表的MySQL Cluster,各節點相互獨立,各自處理自己的資料,處理后的結果可能向上層匯總或在節點間流轉,

我們常說的Sharding其實就是Shared Nothing,他是將某個表從物理存盤上被水平分割,并分配給多臺服務器(或多個實體),每臺服務器可以獨立作業,具備共同的schema,例如MySQL Proxy和Google的各種架構,只需增加服務器數就可以增加處理能力和容量,

至于MPP,指的是大規模并行分析資料庫(Analytical Massively Parallel Processing (MPP) Databases),他是針對分析作業負載進行了優化的資料庫,一般需要聚合和處理大型資料集,MPP資料庫往往是列式的,因此MPP資料庫通常將每一列存盤為一個物件,而不是將表中的每一行存盤為一個物件,這種體系結構使復雜的分析查詢可以更快,更有效地處理,例如TeraData、Greenplum,GaussDB100、TBase,

基于以上的這幾種架構方案,我們可以給出大資料量存盤的解決方案:

以上幾種解決方案各有利弊,磁區模式最大的問題是準share everything架構,無法水平擴展cpu和記憶體,所以基本可以排除;nosql本身其實是個非常好的備選方案,但是nosql(包括大部分開源newsql)硬體消耗非常大,運維成本較高,而常用的一種方案就是基于Mysql的分庫分表方案,

分庫分表架構方案

對于分庫分表,首先看一下市面上有哪些產品,

業界組件 原廠 功能特性 備注
DBLE 愛可生開源社區 專注于mysql的高可擴展性的分布式中間件 基于MyCAT開發出來的增強版,
Meituan Atlas 美團 讀寫分離、單庫分表 目前已經在原廠逐步下架,
Cobar 阿里(B2B) Cobar 中間件以 Proxy 的形式位于前臺應用和實際資料庫之間,對前臺的開放的介面是 MySQL 通信協議 開源版本中資料庫只支持 MySQL,并且不支持讀寫分離,
MyCAT 阿里 是一個實作了 MySQL 協議的服務器,前端用戶可以把它看作是一個資料庫代理,用 MySQL 客戶端工具和命令列訪問,而其后端可以用MySQL 原生協議與多個 MySQL 服務器通信 MyCAT 基于阿里開源的 Cobar 產品而研發
Atlas 360 讀寫分離、靜態分表 2015年后已經不在維護
Kingshard 開源專案 由 Go 開發高性能 MySQL Proxy 專案,在滿足基本的讀寫分離的功能上,Kingshard 的性能是直連 MySQL 性能的80%以上,
TDDL 阿里淘寶 動態資料源、讀寫分離、分庫分表 TDDL 分為兩個版本, 一個是帶中間件的版本, 一個是直接Java版本
Zebra 美團點評 實作動態資料源、讀寫分離、分庫分表、CAT監控 功能齊全且有監控,接入復雜、限制多,
MTDDL 美團點評 動態資料源、讀寫分離、分布式唯一主鍵生成器、分庫分表、連接池及SQL監控
Vitess 谷歌、Youtube 集群基于ZooKeeper管理,通過RPC方式進行資料處理,總體分為,server,command line,gui監控 3部分 Youtube 大量應用
DRDS 阿里 DRDS(Distributed Relational Database Service)專注于解決單機關系型資料庫擴展性問題,具備輕量(無狀態)、靈活、穩定、高效等特性,是阿里巴巴集團自主研
Sharding-proxy apache開源專案 提供MySQL版本,它可以使用任何兼容MySQL協議的訪問客戶端(如:MySQL Command Client, MySQL Workbench等)操作資料,對DBA更加友好,向應用程式完全透明,可直接當做MySQL使用,適用于任何兼容MySQL協議的客戶端, Apache專案,定位為透明化的資料庫代理端,提供封裝了資料庫二進制協議的服務端版本,用于完成對異構語言的支持,
Sharding jdbc apache開源專案 完全兼容JDBC和各種ORM框架,適用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC,基于任何第三方的資料庫連接池,如:DBCP,C3P0, BoneCP, Druid, HikariCP等,支持任意實作JDBC規范的資料庫,目前支持MySQL,Oracle,SQLServer和PostgreSQL Apache專案,定位為輕量級Java框架,在Java的JDBC層提供的額外服務, 它使用客戶端直連資料庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動

對于分庫分表的產品模式,又分為兩種,中間件模式和客戶端模式,

1. 中間件模式其優缺點

中間件模式獨立行程,所以可以支持異構語言,對當前程式沒有侵入性,對業務方來說是透明的mysql服務,但是缺點也非常明顯,硬體消耗大、運維成本高(尤其是在本地化實施情況下),同時因為對關系型資料庫增加了代理,會造成問題難除錯,

2. 客戶端模式優缺點

客戶端模式的主要缺點是對代碼有侵入,所以基本只能支持單語言,同時因為每個客戶端都要對schema建立連接,所以如果資料庫實體不多,需要對連接數仔細控制,但是客戶端模式的優點也非常明顯,首先從架構上它是去中心化的,這樣就避免了中間件模式的proxy故障問題,同時因為沒有中間層性能高、靈活可控,而且因為沒有proxy層,不需要考慮proxy的高可用和集群,運維成本也比較低,

sharding-jdbc接入實戰

sharding-jdbc其實是這些產品中最為大家熟知的,也是因為它定位為輕量級 Java 框架,在 Java 的 JDBC 層提供的額外服務, 它使用客戶端直連資料庫,以 jar 包形式提供服務,無需額外部署和依賴,可理解為增強版的 JDBC 驅動,完全兼容 JDBC 和各種 ORM 框架,適用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC,而且在社區活躍度,代碼質量等方面,也是很不錯的,接下來,我講詳細講一下接入細節,

1. 組件集成

<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version> 5.0.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.0</version>
</dependency> 

2. bean配置

配置sharding jdbc資料源并且加入到動態資料源中,用于資料源路由,

修改原配置中心對應服務的mysql資料源配置,對不分庫分表的資料源配置為動態資料源默認路由

3. sharing JDBC配置

spring.shardingsphere.enabled=true #shardingsphere開關 
spring.shardingsphere.props.sql.show=true 
spring.shardingsphere.mode.type=Standalone #在使用配置中心的情況下,使用standalone模式即可(memery、standalone、cluster三種模式) 
spring.shardingsphere.mode.repository.type=File #standalone模式下使用File,即當前組態檔 
spring.shardingsphere.mode.overwrite=true # 本地配置是否覆寫配置中心配置,如果可覆寫,每次啟動都以本地配置為準, 
spring.shardingsphere.datasource.names=ds-0,ds-1 #配置資料源名字,真實資料源 
#配置ds-0資料源 
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://**** 
spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource 
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.jdbc.Driver 
spring.shardingsphere.datasource.ds-0.username= 
spring.shardingsphere.datasource.ds-0.password= 
#配置ds-1資料源 
spring.shardingsphere.datasource.ds-1.jdbc-url=jdbc:mysql://****
spring.shardingsphere.datasource.ds-1.type=com.zaxxer.hikari.HikariDataSource 
spring.shardingsphere.datasource.ds-1.driver-class-name=com.mysql.jdbc.Driver 
spring.shardingsphere.datasource.ds-1.username= 
spring.shardingsphere.datasource.ds-1.password= 
#配置模式資料庫分片鍵和相關的表 
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-column=user_id 
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-algorithm-name=database-inline 
spring.shardingsphere.rules.sharding.binding-tables[0]=t_order,t_order_item 
spring.shardingsphere.rules.sharding.broadcast-tables=t_address #配置廣播表,即所有庫中都會同步增刪的表 

以上是一些基本配置,還有一些業務場景配置,大家可以參考開源社區檔案: https://shardingsphere.apache.org/document/4.1.0/cn/overview/

總結

對于具體業務場景,我們首先是基于DDD的思想劃分業務單元,最開始先做好垂直分庫,接著是針對一些特定的業務增長量巨大的表,進行水平的分庫處理,比如商品子域中的商品池表,訂單子域中的訂單表等等,

而在分表維度,業務初期,就要最好垂直分表的設計,比如商品池設計中,只需要存盤關系資訊,而商品詳情的資訊單獨存盤在一個底表之中,

作者:京東物流 趙勇萍

來源:京東云開發者社區

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554014.html

標籤:MySQL

上一篇:SQL優化之EXPLAIN執行計劃

下一篇:返回列表

標籤雲
其他(160127) Python(38193) JavaScript(25471) Java(18172) C(15235) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7221) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5344) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4580) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1979) 功能(1967) Web開發(1951) HtmlCss(1950) C++(1928) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 分而治之 -- 淺談分庫分表及實踐之路

    今天想聊一下分庫分表,因為對于快速增長的業務來說,這個是無法回避的一環。之前我在做商城相關的SAAS系統,商品池是一個存盤瓶頸,商品池數量會基于租戶增長和運營變得指數級增長,短短幾個月就能漲到幾千萬的資料,而運營半年后就可能過億。而對于訂單這種資料,也會跟著業務的成長,也會變得愈發巨大。 ......

    uj5u.com 2023-06-01 09:49:28 more
  • SQL優化之EXPLAIN執行計劃

    一. EXPLAIN執行計劃分析
    EXPLAIN可以幫助開發人員分析SQL問題,EXPLAIN顯示了MySQL如何使用使用SQL執行計劃,可以幫助開發人員寫出更優化的查詢陳述句。使用方法,在select陳述句前加上EXPLAIN就可以了。 ......

    uj5u.com 2023-06-01 09:49:13 more
  • Doris(六) -- 查詢語法和內置函式

    # 查詢語法和內置函式 ## 查詢語法整體結構 ```sql SELECT [ALL | DISTINCT | DISTINCTROW ] -- 對查詢欄位的結果是否需要去重,還是全部保留等引數 select_expr [, select_expr ...] -- select的查詢欄位 [FROM ......

    uj5u.com 2023-06-01 09:48:47 more
  • kettle的學習

    # 第1章 Kettle概述 ## 1.1 ETL簡介 ETL(Extract-Transform-Load的縮寫,即資料抽取、轉換、裝載的程序),對于企業或行業應用來說,我們經常會遇到各種資料的處理,轉換,遷移,所以了解并掌握一種ETL工具的使用,必不可少。 市面上常用的ETL工具有很多,比如Sq ......

    uj5u.com 2023-06-01 09:40:18 more
  • Apache DolphinScheduler 3.0.6 發布,或將是最后一個 3.0.X 版本

    Apache DolphinScheduler 于近日發布了 3.0.6 版本,主要針對 3.0.5 重要 bug 進行修復。如果之后沒有發現重大問題,3.0.6 將會是 3.0.x 最后一個版本。 Bug修復 Master 重新連接 zk 后 slot 沒有正常更新 #14014 父作業流失敗時 ......

    uj5u.com 2023-06-01 09:36:33 more
  • 理論+實操|一文掌握 RFM 模型在客戶資料洞察平臺內的落地實戰

    確定用戶價值是整個[用戶運營](https://www.dtstack.com/easydigit/userinsight?src=https://www.cnblogs.com/DTinsight/p/szsm)程序中極其重要的一環。傳統的作業流程中,業務人員向資料部門提出資料需求,等待回傳結果后再進行價值分析是主要的準備作業,但這個程序非常耗時。為了提高[作業效率] ......

    uj5u.com 2023-06-01 09:36:14 more
  • 三十多萬健康問答疾病問答ACCESS資料庫

    健康是現代社會永不衰落的話題和關注點,而社會人群里內宅像流行病似的傳染,什么都想無人參與:無人旅館、無人酒店、無人超市等等,當然不能少了無人健康咨詢,有什么毛病都只想先網上偷偷查一查、匿名問一問,因此網上疾病問答才會火熱。而今天這份資料庫就是來自于這樣的健康知識問答網站。 全部欄位有:標題、創建日期 ......

    uj5u.com 2023-06-01 09:30:52 more
  • 圖解Redis和Zookeeper分布式鎖

    使用Redis還是Zookeeper來實作分布式鎖,最侄訓是要基于業務來決定,可以參考以下兩種情況:
    (1)如果業務并發量很大,Redis分布式鎖高效的讀寫性能更能支持高并發
    (2)如果業務要求鎖的強一致性,那么使用Zookeeper可能是更好的選擇 ......

    uj5u.com 2023-05-31 10:38:41 more
  • Doris(五) -- 資料的匯入匯出

    # 資料匯入 ## 使用 Insert 方式同步資料 用戶可以通過 MySQL 協議,使用 INSERT 陳述句進行資料匯入 INSERT 陳述句的使用方式和 MySQL 等資料庫中 INSERT 陳述句的使用方式類似。 INSERT 陳述句支持以下兩種語法: ```SQL INSERT INTO tabl ......

    uj5u.com 2023-05-31 09:54:01 more
  • PostgreSQL 9.6 檔案: 資料型別

    章 8. 資料型別 目錄8.1. 數字型別8.1.1. 整數型別8.1.2. 任意精度數字8.1.3. 浮點型別8.1.4. 序數型別8.2. 貨幣型別8.3. 字符型別8.4. 二進制資料型別8.4.1. bytea的十六進制格式8.4.2. bytea的逃逸格式8.5. 日期/時間型別8.5.1 ......

    uj5u.com 2023-05-31 09:53:57 more