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

2021-03-02 享學課堂online

前言

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

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

分庫分表經驗值

mysql單表經驗

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

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

第一步:不分庫不分表

第二步:同庫內的分表

第三步:分庫分表

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

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

搭建環境

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

POM.xml依賴

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

水平分表,創建資料庫表

創建資料庫course_db

創建兩張表course1,course2

course1、course2的表結構

分表規則

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

持久化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:spring.shardingsphere.datasource.m1.username = rootspring.shardingsphere.datasource.m1.password = root

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

表分布

指定course表分布情況,配置表在哪個資料庫裡面,表名稱是什麼 #m1.course1;m1.course2 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為偶數添加到course1表,為奇數添加到course2表中 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的水平分表,核心就是分表的策略配置,以及配置的注意點,相對是比較簡單的,後續的文章會介紹分庫以及讀寫分離,謝謝持續關注!!!

相關焦點

  • 分庫分表【Sharding-JDBC】入門與項目實戰
    小Hub領讀:Sharding-JDBC,這麼主流的分庫分表框架,你還不懂?來了解一下,然後入門吧!
  • 數據量大了一定要分表,分庫分表Sharding-JDBC入門與項目實戰
    最近項目中不少表的數據量越來越大,並且導致了一些資料庫的性能問題。因此想藉助一些分庫分表的中間件,實現自動化分庫分表實現。調研下來,發現Sharding-JDBC目前成熟度最高並且應用最廣的Java分庫分表的客戶端組件。
  • 分庫分表常見概念解讀+Sharding-JDBC實戰
    之前有不少剛入坑 Java 的粉絲留言,想系統的學習一下分庫分表相關技術,可我一直沒下定決心搞,眼下趕上公司項目在使用 sharding-jdbc  對現有 MySQL 架構做分庫分表的改造,所以藉此機會出一系分庫分表落地實踐的文章,也算是自己對架構學習的一個總結。
  • 一文快速入門分庫分表中間件 Sharding-JDBC(必修課)
    ,我們在前文中回顧了一下分庫分表的基礎知識,對分庫分表的拆分方式有了一定的了解。Sharding-JDBC 簡介Sharding-JDBC 最早是當當網內部使用的一款分庫分表框架,到2017年的時候才開始對外開源,這幾年在大量社區貢獻者的不斷迭代下,功能也逐漸完善,現已更名為 ShardingSphere,2020年4⽉16⽇正式成為 Apache 軟體基⾦會的頂級項目。
  • Spring Boot 採用Sharding-JDBC 實現Mybaits的分庫分表功能
    背景在開發大數據量的應用時為了減少單表數據量經常會使用到分庫分表功能,以前對分庫分表功能都是自己在代碼上單獨對需要分庫分表的實體進行特殊邏輯處理
  • 基於ShardingJDBC實現資料庫讀寫分離
    想要解決這一瓶頸問題,可能最簡單的有三種解決方案:增加單個資料庫節點的CUP和內存數量;採用分布式資料庫,對數據進行分庫分表;採用簡單的讀寫分離技術,降低單個資料庫節點的負荷;在上一篇文章ShardingJDBC實現多資料庫節點分庫分表 中,我將大致講解了一下如何實現對資料庫進行分庫分表操作,本篇文章我們將大致講解下如何通過ShardingJDBC
  • 利用 ShardingSphere-JDBC 實現分庫分表實踐
    利用ShardingSphere-JDBC實現分庫分表1.ShardingSphere概述1.1 概述業務發展到一定程度,分庫分表是一種必然的要求,分庫可以實現資源隔離,分表則可以降低單表數據量,提高訪問效率。
  • 敏感數據,「一鍵脫敏」,Sharding Sphere 完美搞定
    此方法固然可行,但是使用起來非常不便捷且繁瑣,使得日常的業務開發與存儲合規的細節緊耦合推薦下自己做的 Spring Boot 的實戰項目:https://github.com/YunaiV/ruoyi-vue-pro對於一些為了快速上線而一開始沒有實現合規脫敏的系統,如何比較快速的使得已有業務滿足合規要求的同時,儘量減少對原系統的改造
  • Sharding-Sphere 3.0.0.M4 正式發布 - OSCHINA - 中文開源技術...
    API調整Maven坐標調整:將<artifactId>sharding-jdbc</artifactId>調整為<artifactId>sharding-jdbc-core</artifactId>。
  • 分庫分表的4個面試連環炮問題!不會就慘了
    一、面試題為什麼要分庫分表(設計高並發系統的時候,資料庫層面該如何設計)?用過哪些分庫分表中間件?不同的分庫分表中間件都有什麼優點和缺點?你們具體是如何對資料庫如何進行垂直拆分或水平拆分的?sharding-jdbc噹噹開源的,屬於 client 層方案。確實之前用的還比較多一些,因為 SQL 語法支持也比較多,沒有太多限制,而且目前推出到了 2.0 版本,支持分庫分表、讀寫分離、分布式 id 生成、柔性事務(最大努力送達型事務、TCC 事務)。
  • Sharding-jdbc教程:Mysql資料庫主從搭建
    這是系列文章Sharding-jdbc文章的第一篇,本篇文章主要講述如何搭建Mysql的主從。搭建環境為centos 7.5,資料庫版本為5.7。需要三臺虛擬機,一主兩從,讀者可以在自己的電腦上創建虛擬機,也可以在雲服務商買三臺,按小時計費,一小時幾毛錢,比較實惠。
  • Sharding-Sphere 3.0.0 正式發布 - OSCHINA - 中文開源技術交流社區
    >ISSUE #1203 Adjust Spring namespace xsd for Sharding and Master-slaveISSUE #1289 Adjust Hint APIISSUE #1302 Refine package structureISSUE #1305 Deprecated and remove sharding-jdbc-transaction-parent
  • Django分表的兩個方案
    由來知乎上的一個問題:Django 分表 怎麼實現?
  • spring-data-jdbc的基礎使用(一)
    前言很多人知道Mybatis,知道Jpa,但是對spring-data-jdbc可能了解的少之又少。注意我們這裡說的是data-jdbc,而不是普通的jdbc。它擁有了類似jpa的一些特性,比如能夠根據方法名推導出sql,基本的CRUD等,也擁有了寫原生sql的能力。最為關鍵的是,它非常的清爽,不需要依賴hibernte或者jpa。
  • 一文讀懂 MySQL 主從複製讀寫分離
    讓我們帶著這些問題開始這段學習之旅吧!主從複製、讀寫分離一般是一起使用的。目的很簡單,就是為了提高資料庫的並發性能。你想,假設是單機,讀寫都在一臺MySQL上面完成,性能肯定不高。如果有三臺MySQL,一臺mater只負責寫操作,兩臺salve只負責讀操作,性能不就能大大提高了嗎?
  • JDBC MySQL
    前言:什麼是JDBC一、準備工作(一):MySQL安裝配置和基礎學習二、準備工作(二):下載資料庫對應的jar包並導入
  • 分庫分表:TiDB,求別搶飯碗!
    比如 cobar、TDDL、atlas、sharding-jdbc、mycat 等,都是非常優秀的產品,解決了各種問題。但是引入了中間件肯定就會增加各方面的維護成本,這篇帶大家了解一款替代分庫分表的解決方案:分布式資料庫:TiDB 前言 如今硬體的性價比越來越高,網絡傳輸速度越來越快,資料庫分層的趨勢逐漸顯現,人們已經不再強求用一個解決方案來解決所有的存儲問題,而是通過分層,讓緩存與資料庫負責各自擅長的業務場景。
  • JDBC這個問題,問的小夥伴一臉懵逼
    他頓時一臉懵逼,因為大部分人只知道JDBC的幾個步驟,至於底層到底是怎麼連接資料庫的,還真不知道。由於小夥伴是面試高級開發,問這種問題倒也不能說面試官過分,如果是初級或者中級,那問著問題就確實有些過分了。
  • 「詳細」MySQL資料庫與JDBC編程
    刪除列ALTER TABLE 表名 drop columnName;刪除數據表DROP TABLE 表名;表結構刪除,表對象不再存在;表的所有數據被刪除;該表所有相關的索引、約束也被刪除。清空表TRUNCATE 表名;刪除表內的全部數據,但保留表結構。