歡迎關注頭條號:老顧聊技術
精品原創技術分享,知識的組裝工
上一篇文章中老顧介紹了sharding-jdbc的基本概念,今天老顧就來介紹一下如何使用。
經常碰到一些小夥伴的問題,就是我們到達什麼量級才會分庫分表?
mysql單表經驗
一般MySQL單表1000W左右的數據是可以不需要考慮分表的。當然,除了考慮當前的數據量和性能情況時,我們需要提前考慮系統半年到一年左右的業務增長情況。但是要避免過度設計(考慮了很多未來幾年的需求,例如一張表在未來幾年內數據預計會達到幾千萬,這個就過渡考慮了)
根據數據量增長速度,選擇實現步驟
第一步:不分庫不分表
第二步:同庫內的分表
第三步:分庫分表
不要過度設計,一上來玩大的就進行分庫分表
分庫如果多個實例存在同一臺伺服器上,只是解決了資料庫最大連接數的問題,但是 io(資料庫數據是存儲在硬碟上,每次獲取都需要去硬碟把數據撈出來),cpu 等伺服器資源瓶頸並沒有解決。資料庫的性能取決於伺服器等性能
我們採用SpringBoot + MybatisPlus + Shrading-JDBC + Druid連結池
POM.xml依賴
老顧用了相對比較新的版本,SpringBoot 2.2.9,Sharding-Jdbc4.1.1版本
水平分表,創建資料庫表
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。
怎麼解決呢?
解決方式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、面試必備:網關異常了怎麼辦?如何做全局異常處理?
4、Gateway網關系列(二):SpringCloud Gateway入門實戰,路由規則
5、Gateway網關系列開篇:SpringCloud的官方網關Gateway介紹
6、API網關在微服務架構中的應用,這一篇就夠了
7、學習Lambda表達式看這篇就夠了,不會讓你失望的哦(續篇)
8、Lambda用在哪裡?幾種場景?
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實戰