Sharding-jdbc的實戰入門之水平分表(一) 前言 數據源地址 測試類 解決方式2: 再次執行

享學課堂特邀作者:老顧
轉載請聲明出處!!!

前言

上一篇文章中老顧介紹了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. 創建兩張表course1,course2

course1、course2的表結構

分表規則

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

持久化mybatis

我們引用的是mybatis-plus

定義實體類

操作數據mapper

啓動類,MapperScan

到此環境搭建完成。

配置分表策略

配置數據源

#配置數據源

數據源地址

#配置數據源具體內容,

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

表分佈

指定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>

改爲

<dependency>

再次執行

老顧這裏採用方式1

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

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

總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章