上一篇文章中老顧介紹了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的水平分表,核心就是分表的策略配置,以及配置的注意點,相對是比較簡單的,後續的文章會介紹分庫以及讀寫分離,謝謝持續關注!!!