Sharding-jdbc的實戰入門之水平分表(一)

2020-10-03 老顧聊技術

歡迎關注頭條號:老顧聊技術

精品原創技術分享,知識的組裝工

前言

上一篇文章中老顧介紹了sharding-jdbc的基本概念,今天老顧就來介紹一下如何使用。

經常碰到一些小夥伴的問題,就是我們到達什麼量級才會分庫分表

分庫分表經驗值

mysql單表經驗

  • 300W Mysql 可以輕鬆抗住
  • 600W 數據開始卡,優化可以解決(表結構,索引設計)
  • 800W ~ 1000W 牛逼的DBA 優化都會遇到瓶頸

一般MySQL單表1000W左右的數據是可以不需要考慮分表的。當然,除了考慮當前的數據量和性能情況時,我們需要提前考慮系統半年到一年左右的業務增長情況。但是要避免過度設計(考慮了很多未來幾年的需求,例如一張表在未來幾年內數據預計會達到幾千萬,這個就過渡考慮了)

根據數據量增長速度,選擇實現步驟

第一步:不分庫不分表

第二步:同庫內的分表

第三步:分庫分表

不要過度設計,一上來玩大的就進行分庫分表

分庫如果多個實例存在同一臺伺服器上,只是解決了資料庫最大連接數的問題,但是 io(資料庫數據是存儲在硬碟上,每次獲取都需要去硬碟把數據撈出來),cpu 等伺服器資源瓶頸並沒有解決資料庫的性能取決於伺服器等性能

搭建環境

我們採用SpringBoot + MybatisPlus + Shrading-JDBC + Druid連結池

POM.xml依賴

老顧用了相對比較新的版本,SpringBoot 2.2.9,Sharding-Jdbc4.1.1版本

水平分表,創建資料庫表

  1. 創建資料庫course_db
  2. 創建兩張表course_1,course_2

course_1、course_2的表結構

分表規則

如果增加的課程cid為偶數把數據插入到course_1,如為奇數把數據插入到course_2中。

持久化mybatis

我們引用的是mybatis-plus

定義實體類

操作數據mapper

啟動類,MapperScan

到此環境搭建完成。

配置分表策略

配置數據源

#配置數據源spring.shardingsphere.datasource.names=m1

數據源地址

#配置數據源具體內容,spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.m1.driver-class-name = com.mysql.jdbc.Driverspring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/course_dbspring.shardingsphere.datasource.m1.username = rootspring.shardingsphere.datasource.m1.password = root

注意數據源的名稱,和數據源地址配置的用的數據源一致

表分布

#指定course表分布情況,配置表在哪個資料庫裡面,表名稱是什麼 #m1.course_1;m1.course_2

spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->{1..2}

上面的表達式m1.course_$->{1..2}表示course表的分布,利用了行表達式算法指明真實的表名;course這個表為邏輯表

表的主鍵定義

#指定course表裡面的鍵cid生成策略

spring.shardingsphere.sharding.tables.course.key-generator.column=cid

spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE

上面指定了主鍵為cid,並且利用雪花算法生成,小夥伴不了解雪花算法,可以查看老顧之前的文章

策略

#指定分片策略 cid為偶數添加到course_1表,為奇數添加到course_2表中

spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid

spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2 + 1}

上面定了course邏輯表的table-strategy策略,根據cid欄位,表達式course_$->{cid % 2 + 1},可以看到cid%2 + 1,就是對2取模 + 1,就會落到1、2

sql日誌

#打開sql輸出日誌

spring.shardingsphere.props.sql.show=true

輸入執行sql日誌

#不要忘了允許覆蓋重複的Bean

spring.main.allow-bean-definition-overriding=true

測試類

上面循環10次,進行課程course插入

執行報錯了

我們看看錯誤信息是什麼

BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class]: Invocation of init method failed; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class

at org.springframework.beans.factory.

如上所示,DruidDataSourceAutoConfigure Failed to determine a suitable driver class,即druid找不到mysql driver,然而mysql的驅動包啥的都沒問題,於是直接點進DruidDataSourceAutoConfigure查看源碼

DruidDataSourceWrapper類源碼

如上,標紅表明druid是根據spring.datasource.druid找jdbc屬性的,如果not found,則根據spring.datasource找jdbc屬性,一般而言這是不會出現錯誤的。但是我這裡使用了shardingjdbc,並沒有配置spring.datasource,根據spring.datasource.druid或者spring.datasource確實找不到,因為我的結構是spring.shardingsphere.datasource

怎麼解決呢?

排除Druid數據源自動配置

解決方式1:

如果我們用的jar包是druid-spring-boot-starter,則在啟動類上排除druid自動配置

@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class})

解決方式2:

不用

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version></dependency>

改為

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version></dependency>

再次執行

老顧這裡採用方式1

我們在來執行看看,執行成功了

我們發現有2張表有10條數據,按照奇偶數插入了。我們也能看到控制臺的輸出sql日誌;日誌中有邏輯sql,和真實的sql。根據奇偶數真實的sql會不一樣

總結

今天老顧介紹了shrading-jdbc的水平分表,核心就是分表的策略配置,以及配置的注意點,相對是比較簡單的,後續的文章會介紹分庫以及讀寫分離,謝謝持續關注!!!

---End---


老顧的微服務網關分享課程,請大家多多支持

推薦閱讀

a、dubbo如何處理業務異常,這個一定要知道哦!

b、企業級SpringBoot應用多個子項目配置文件規劃、多環境支持(一)

c、企業級SpringBoot應用多個子項目配置文件規劃、多環境支持(二)

d、企業級SpringBoot應用多個子項目配置文件之配置中心(三)

e、利用阿里開源工具進行排查線上CPU居高問題

f、阿里二面:如何快速排查死鎖?如何避免死鎖?

g、微服務分布式架構中,如何實現日誌鏈路跟蹤?

h、網關如何聚合各個微服務的接口文檔?

i、Kubernetes之POD、容器之間的網絡通信

j、K8S中的Service的存在理由

k、企業微服務項目如何進入K8S的全過程

l、阿里開源項目Sentinel限流、降級的統一處理

m、大廠二面:Redis的分布式布隆過濾器是什麼原理?

1基於RocketMq的SpringCloud Stream框架實戰入門

2、如何搭建消息中間件應用框架之SpringCloud Stream

3面試必備:網關異常了怎麼辦?如何做全局異常處理?

4Gateway網關系列(二):SpringCloud Gateway入門實戰,路由規則

5Gateway網關系列開篇:SpringCloud的官方網關Gateway介紹

6API網關在微服務架構中的應用,這一篇就夠了

7學習Lambda表達式看這篇就夠了,不會讓你失望的哦(續篇)

8Lambda用在哪裡?幾種場景?

9、為什麼會出現Lambda表達式,你知道嗎?

10、不說「分布式事務」理論,直接上大廠阿里的解決方案,絕對實用

11、女程式設計師問到這個問題,讓我思考了半天,Mysql的「三高」架構

12、大廠二面:CAP原則為什麼只能滿足其中兩項?而不能同時滿足

13、阿里P7二面:聊聊零拷貝的原理

14、秒殺系統的核心點都在這裡,快來取

15、你了解如何利用token方式實現分布式Session嗎?

16、Mysql索引結構演變,為什麼最終會是那個結構呢?讓你一看就懂

17、一場比賽涉及到的知識,用通俗易通的方式介紹並發協調

18、企業實戰Redis全方面思考,你思考了嗎?

19、面試題:Thread的start和run的區別

20、面試題:什麼是CAS?CAS的作用以及缺點

21、如何訪問redis中的海量數據?避免事故產生

22、如何解決Redis熱點問題?以及如何發現熱點?

23、如何設計API接口,實現統一格式返回?

24、你真的知道在生產環境下如何部署tomcat嗎?

25、分享一線網際網路大廠分布式唯一ID設計 之 snowflake方案

26、分享大廠分布式唯一ID設計方案,快來圍觀

27、你想了解一線大廠的分布式唯一ID生成方案嗎?

28、你知道如何處理大數據量嗎?(數據拆分篇)

29、如何永不遷移數據和避免熱點? 根據伺服器指標分配數據量(揭秘篇)

30、你知道怎麼分庫分表嗎?如何做到永不遷移數據和避免熱點嗎?

31、你了解大型網站的頁面靜態化嗎?

32、你知道如何更新緩存嗎?如何保證緩存和資料庫雙寫一致性?

33、你知道怎麼解決DB讀寫分離,導致數據不一致問題嗎?

34、DB讀寫分離情況下,如何解決緩存和資料庫不一致性問題?

35、你真的知道怎麼使用緩存嗎?

36、如何利用鎖,防止緩存擊穿?重構思想的重要性

37、海量訂單產生的業務高峰期,如何避免消息的重複消費?

38、你知道如何保障生產端100%消息投遞成功嗎?

39、微服務下的分布式session該如何管理?

40、阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

41、網際網路架構重要組員CDN,很多高級開發都沒有實操過,來看這裡

42、阿里二面:CDN緩存控制原理,看看能不能難住你

43、SpringCloud Alibaba之Nacos多環境多項目管理

44、SpringCloud Alibaba系列之Nacos配置中心玩法

45、SpringCloud Alibaba之Nacos註冊中心

46、SpringCloud Plus版本之SpringCloud Alibaba

47、SpringCloud Alibaba之Nacos集群、持久化

48、SpringCloud Alibaba之Nacos共享配置、灰度配置

49、SpringCloud Alibaba之Sentinel工作原理

50、SpringCloud Alibaba之Sentinel流控管理

51、SpringCloud Alibaba之Sentinel降級管理

52、SpringCloud Alibaba之Sentinel熱點參數限流

53、SpringCloud Alibaba之Sentinel的API實戰

相關焦點

  • ShardingJdbc分庫分表實戰案例解析(上)
    在這個過程中會到涉及分庫分表實踐的三種主要場景:1、新系統在設計之初直接使用分庫分表方案;2、歷史系統運行一段時間後如何平滑地實施分庫分表;3、對現有分庫分表邏輯的Scaling操作(包括減少分表、增加分表)涉及的數據遷移問題。
  • ShardingJdbc分庫分表實戰案例解析(下)
    導讀上一篇文章《ShardingJdbc分庫分表實戰案例解析(上)》中我們初步介紹了使用ShardingJdbc實現訂單數據分散存儲的分庫分表方法,在本篇文章中將重點介紹在不停服的情況下實現數據分片存儲的在線擴容。
  • SpringBoot+Sharding-JDBC操作分庫分表
    上面講述了使用Sharding-JDBC如何對水平分表的操作,接下來玩玩水平分庫分表操作。&分庫分表利器 文章中了解到什麼是垂直分庫分表、水平分庫分表,為什麼分庫分表;在咱們實際項目中,垂直分庫後會有多個資料庫,每個資料庫中有屬於自己的表和公共表(操作公共表在本節後面會講述)。
  • Sharding-Jdbc之水平分庫和讀寫分離(二)
    的水平分表功能,今天我們繼續分享一些為了提升程序的性能,除了在表欄位建立索引(如主鍵索引、唯一索引、普通索引等)、優化程序代碼以及 SQL 語句等常規手段外,利用資料庫主從讀寫分離(Master/Slave)架構:就是為了緩解資料庫壓力,將寫入和讀取操作分離為不同數據源,寫庫稱為主庫,讀庫稱為從庫,一主庫可配置多從庫。
  • 數據量巨大還不分庫分表?JDBC 入門與項目實戰
    因此想藉助一些分庫分表的中間件,實現自動化分庫分表實現。調研下來,發現Sharding-jdbc目前成熟度最高並且應用最廣的Java分庫分表的客戶端組件。邏輯表水平拆分的資料庫(表)的相同邏輯和數據結構表的總稱。例:訂單數據根據主鍵尾數拆分為10張表,分別是t_order_0到t_order_9,他們的邏輯表名為t_order。
  • ShardingJDBC實現多資料庫節點分庫分表
    如果我們的應用系統的架構設計不是很合理,或者我們開發人員的技能水平不具備紮實的功底,可能面對這樣龐大的數據量會感到無從下手。面對這種海裡數據,在關係型資料庫領域,比如MySQL如何能夠達到高效的存儲和查詢呢?
  • sharding-jdbc 分庫分表的 4種分片策略
    上文《快速入門分庫分表中間件 Sharding-JDBC (必修課)》中介紹了 ,另一部分未做分庫分表的表怎麼處理?RangeShardingAlgorithm(範圍分片)。,方便後續分表中使用。# 分表策略# 分表分片健spring.shardingsphere.sharding.tables.t_order.table-strategy.standard.sharding-column=order_id# 分表算法spring.shardingsphere.sharding.tables.t_order.table-strategy.standard.precise-algorithm-class-name
  • 一文快速入門分庫分表(必修課)
    我在網上陸陸續續的也看了一些有關於分庫分表的文章,可發現網上同質化的資料有點多,而且知識點又都比較零碎,還沒有詳細的實戰案例。為了更深入的學習下,我在某些平臺買了點付費課程,看了幾節課發現有點經驗的人看還可以,但對於新手入門來說,其實學習難度還是蠻大的。
  • 聊聊sharding jdbc
    為什麼需要分表?這就很好理解,解決單表數據量過大,導致數據讀寫緩慢。如何分表?通常分表有垂直分表和水平分表。垂直分表可以根據使用列欄位的熱度,將列拆分成多個表,通過id來關聯,或者有大欄位列,也可以單獨拆開為一張表。
  • SpringBoot整合Sharding-JDBC實現數據分表+讀寫分離
    在工程的配置 文件application.yml做Sharding-JDBC的配置,代碼如下:在上面的配置中,sharding.jdbc.dataSource部分是配置的數據源的信息,本案例有三個數據源db-test0、db-test1、db-test2。
  • 分布式秒殺實戰之千萬訂單流量數據分庫分表
    前言一般來說電商的日訂單都是百千萬級甚至是億萬級別的了,小小的資料庫肯定是撐不住的,這時候就要提前考慮分庫分表了。國內一般大廠規則參考:單表500萬條記錄,正常水平800萬條警戒線1000萬條必須要分庫分表一般業界,對訂單數據的分庫分表,有兩類思路:按照訂單號來切分、按照用戶id來切分,當然各有利弊,這裡不細說。
  • sharding-jdbc4.0入門
    Sharding-jdbc 簡介Sharding-JDBC是ShardingSphere的第一個產品,也是ShardingSphere的前身。 它定位為輕量級Java框架,在Java的JDBC層提供的額外服務。
  • 分庫分表之Sharding-Jdbc前篇(基本概念)
    供分片使用的解析上下文包含查詢選擇項(Select Items)、表信息(Table)、分片條件(Sharding Condition)、自增主鍵信息(Auto increment Primary Key)、排序信息(Order By)、分組信息(Group By)以及分頁信息(Limit、Rownum、Top)。
  • SpringBoot 分庫分表sharding-sphere
    Apache ShardingSphere 是一套開源的分布式資料庫中間件解決方案組成的生態圈,它由 JDBC、Proxy 和 Sidecar(規劃中)這 3 款相互獨立,卻又能夠混合部署配合使用的產品組成。 它們均提供標準化的數據分片、分布式事務和資料庫治理功能,可適用於如 Java 同構、異構語言、雲原生等各種多樣化的應用場景。
  • Sharding-Jdbc之讀寫分離導讀
    Sharding-JDBC作為面向開發的微服務雲原生基礎類庫,完整的實現了分庫分表、讀寫分離和分布式主鍵功能,並初步實現了柔性事務。;import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration;/** * sharding-jdbc讀寫分離 * @author Admin * */public class MasterSalveDemo { public static void main(String[] args) throws Exception {
  • 分庫分表中間件 Sharding-JDBC
    ,大多是以水平切分模式(水平分庫、分表)為基礎來說的,數據分片將原本一張數據量較大的表 t_order 拆分生成數個表結構完全一致的小數據量表 t_orderCondition)、排序信息(Order By)、分組信息(Group By)以及分頁信息(
  • 一文快速入門分庫分表(送給不知該學點啥的你)
    而分庫與分表都可以從:垂直(縱向)和 水平(橫向)兩種緯度進行切分。>垂直分表是基於數據表的列(欄位)為依據切分的,是一種大表拆小表的模式。,讀庫與寫庫都要做分庫分表處理,後邊會有具體實戰案例。sharding-jdbc(噹噹)TSharding(蘑菇街)Atlas
  • 面試過關斬將:分庫分表-sharding-jdbc分頁,排序,條件查詢優化
    之前講了利用sharding-jdbc 3.1進行分表的情況,也講了利用一致性hash去做分表的高可用。今天講下分表後的分頁,排序,條件查詢優化。其實本身sharding-jdbc是提供了分頁功能的,我們方便期間是可以直接用的,但是不推薦用它。
  • SpringBoot分庫分表sharding-sphere2
    ;import java.util.Collection;import java.util.Date;import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue
  • 一文快速入門分庫分表
    我在網上陸陸續續的也看了一些有關於分庫分表的文章,可發現網上同質化的資料有點多,而且知識點又都比較零碎,還沒有詳細的實戰案例。為了更深入的學習下,我在某些平臺買了點付費課程,看了幾節課發現有點經驗的人看還可以,但對於新手入門來說,其實學習難度還是蠻大的。