天天看點

sharding-jdbc實作mysql讀寫分離概述場景讀寫分離

概述

今天開始整理一下分庫分表的筆記,以供後續複習。為什麼要分庫分表就不在贅述。在以前的公司項目的多資料源分庫分表都是自研,利用spring的IOC和AOP實作多資料源的自由切換,完成分庫分表、讀寫分離。之是以自研也不是因為重複造輪子,隻是想能貼合自己公司項目的業務以及從技術角度滿足自己的實際需求,達到熟練可配置的效果。今天和以後的文章要說的并不是我們自研的産品,自研即使說了也不一定适用所有公司,而且也不可能通過看這幾篇文章就能夠完全實作一個自研的産品,要說的是通過比較成熟和開源的分庫分表産品ShardingSphere。

ShardingSphrer是當當網開源的産品,後來免費送給aphach組織進行孵化,是目前比較流行的用戶端進行分庫分表的産品,【mycat也是一款分庫分表的産品,但是是基于服務端的】。現更名為Apache ShardingSphere,它由 JDBC、Proxy 和 Sidecar(規劃中)這 3 款既能夠獨立部署,又支援混合部署配合使用的産品組成。 它們均提供标準化的資料水準擴充、分布式事務和分布式治理等功能,可适用于如 Java 同構、異構語言、雲原生等各種多樣化的應用場景。

更多介紹請參看官網

http://shardingsphere.apache.org/index_zh.html

通過以上簡單的介紹可以知道sharding sphere有很多款産品,我們要介紹的是其中的一款sharding-jdbc在項目中的如何使用,當然具體使用和配置方式官網也有詳細的介紹,可進行對比參考

https://shardingsphere.apache.org/document/4.1.1/en/overview/

場景

首先分析一下分庫分表的資料場景:

  • 讀寫分離
  • 分庫不分表
  • 分庫不分表,讀寫分離
  • 分表不分庫
  • 分表不分庫,讀寫分離
  • 分庫分表
  • 分庫分表,讀寫分離
  • 廣播表
  • 廣播表,讀寫分離
  • 專庫專表
  • 專庫專表讀寫分離

因為讀寫分離其實是在我們實際使用的過程中比較基礎的操作,是以我們在每個資料場景都增加一個讀寫分離的場景配置。

  • 前情說明:在練習的過程中我們可以隻用安裝一個資料庫執行個體,我們應用中配置的主從資料庫資訊都可以是同一個資料庫,關于怎麼區分讀寫的時候是使用的那個資料庫配置,在idea控制台列印的輸出資訊中可以進行區分,後面會進行具體的截圖說明。
  • 環境說明:Spring boot:2.1.11.RELEASE,sharing-jdeb:4.1.1
  • 建立項目
sharding-jdbc實作mysql讀寫分離概述場景讀寫分離

pom.xml​​

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.1</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.22</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.1.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.75</version>
    </dependency>
</dependencies>      

application.properties

  • 一主兩從
# mybatis plus配置
mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml
mybatis-plus.type-aliases-package=com.spring.demo.xxx.entity
mybatis-plus.global-config.db-config.id-type=auto
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
#傳回map時,true:當查詢資料為空時字段傳回為null;false:不加這個查詢資料為空時,字段将被隐藏
mybatis-plus.configuration.call-setters-on-nulls=false
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# sharding jdbc 讀寫分離
spring.shardingsphere.datasource.names=master,slave0,slave1
# 主資料連接配接資訊
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://yourdburl:3306/yourdbname?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.shardingsphere.datasource.master.username=yourdbusername
spring.shardingsphere.datasource.master.password=yuordbpassword
# 第一個從資料連接配接資訊
spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://yourdburl:3306/yourdbname?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.shardingsphere.datasource.slave0.username=yourdbusername
spring.shardingsphere.datasource.slave0.password=yourdbpassword
# 第二個從資料庫連接配接資訊
spring.shardingsphere.datasource.slave1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.url=jdbc:mysql://yourdburl:3306/yourdbname?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.shardingsphere.datasource.slave1.username=yourdbusername
spring.shardingsphere.datasource.slave1.password=yourdbpassword
# 指定主從資料庫配置
# 預設資料庫,可配置可不配置
spring.shardingsphere.sharding.default-data-source-name=master
# 主從複制中的master資料庫節點
spring.shardingsphere.masterslave.master-data-source-name=master
# 主從複制中的slave資料庫節點,多個用逗号分隔
spring.shardingsphere.masterslave.slave-data-source-names=slave0,slave1
# 讀請求的時候,多個從節點的負載均衡方式,這裡是輪詢的方式
spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
# 指定主從的名稱,可配置可不配置
spring.shardingsphere.masterslave.name=ms
# 列印sharding的資料庫資訊,可以看出每次執行的sql語句是選用的哪個資料庫
spring.shardingsphere.props.sql.show=true      

啟動類

  • 啟動類的@SpringBootApplication需要過濾掉預設的資料配置,這樣才能使用sharding-jdbc的代理資料源
@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class, DataSourceAutoConfiguration.class})      
  • 省略掉controller、service、dao、mapper的編寫,編寫方法和單資料庫的編寫方式一樣

啟動項目

  • 配置的三個資料庫進行了初始化
sharding-jdbc實作mysql讀寫分離概述場景讀寫分離
  • 兩次查詢都通過sharding列印的sql語句可以看出是通路不同的slave資料庫
sharding-jdbc實作mysql讀寫分離概述場景讀寫分離
  • 儲存的時候選擇的是master資料庫
sharding-jdbc實作mysql讀寫分離概述場景讀寫分離

以上是讀寫分離的從0到1的配置過程。本執行個體省略了搭建資料庫的部分,若有不清楚的可以通過baidu進行搜尋相關文章即可。其中選用的連接配接池是druid,關于druid的生産配置後續在通過其他文章進行介紹,這片主要專注于sharding-jdbc。

參考資料

後續用新的篇章寫其他的場景配置,待續......