一、Sharding JDBC實現分庫分表
對於Sharding JDBC分庫分表,配置殘燭可以分為幾大塊:
數據源配置:
配置參數:spring.shardingsphere.datasource.names
說明:如果用到分表,則需要配置多個數據源,多數據源之間用逗號分隔
數據源連接信息配置:
配置參數:spring.shardingsphere.datasource.dbname.*
說明:其中dbname就是上面配置的數據源名稱,后面需要配置數據庫類型、數據庫驅動、地址、用戶名密碼等信息
表的分配策略:
配置參數:spring.shardingsphere.sharding.tables.tablename.actual-data-nodes
說明:其中tablename就是我們實際要用來分庫分表的表名;該配置用來配置該表分幾個庫幾張表:
如果只分庫,配置樣例為:ds1.order_info_$->{1..4},這就表明,對於order_info這張表,都存在ds1的這個數據庫中,而表則分4張表,分別為order_info_1到order_info_4;
如果只分庫,配置樣例為:ds$->{1..2}.order_info_new,這就表明,對於order_info_new這張表,會根據分庫策略將其存入ds1和ds2兩個數據庫中,但是不分表,都是存在庫中的order_info_new表中;
既分庫又分表:配置樣例為:ds$->{1..2}.order_info_$->{1..4},這就表明,對於order_info這張表,會根據分庫策略將其存入ds1和ds2兩個數據庫中,同時也會更具分表策略,將數據存入order_info_1到order_info_4中;
設置主鍵信息:
配置參數:spring.shardingsphere.sharding.tables.order_info.key-generator.*
分表策略配置:
配置參數:spring.shardingsphere.sharding.tables.tablename.table-strategy.inline.sharding-column
說明:tablename表的分表策略使用哪一列來分
配置參數:spring.shardingsphere.sharding.tables.tablename.table-strategy.inline.algorithm-expression
說明:tablename表的分表策略,例如value為order_info_$->{order_id % 4 + 1},說明根據order_id的值與4取余加1的表,例如order_id為5,那么數據就會被存入order_info_2表中。
分庫配置:
配置參數:spring.shardingsphere.sharding.tables.tablename.database-strategy.inline.sharding-column
說明:tablename表的分庫策略使用哪一列來分
配置參數:spring.shardingsphere.sharding.tables.tablename.database-strategy.inline.algorithm-expression=
說明:tablename表的分庫策略,例如value為ds$->{vender_id % 2 + 1},說明根據vender_id的值與2取余加1的庫,例如vender_id為5,那么數據就會被存入ds2庫中。
(一)分表
1、引入依賴
<!-- Druid連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> </dependency> <!-- Mysql驅動依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- MybatisPlus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency> <!-- Sharding-JDBC --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC2</version> </dependency>
2、創建表
在不同的兩個庫中(192.168.1.104和192.168.1.106),分別創建訂單表(分4張表)
create table order_info_1(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11)); create table order_info_2(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11)); create table order_info_3(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11)); create table order_info_4(id bigint(11) PRIMARY KEY NOT NULL auto_increment,order_id bigint(11),vender_id bigint(11));
3、配置分表
分表主要就是配置數據源信息,分表策略(分幾張表,從幾到幾),分表列(根據那一列進行分表),分片策略(根據什么樣的策略進行分表,hash、取模等)
spring.shardingsphere.datasource.names=lcldata104 # 配置數據源具體內容————————包含 連接池, 驅動, 地址, 用戶名, 密碼 # 由於上面配置數據源只有lcldata104因此下面只配置lcldata104.type,lcldata104.driver-class-name,lcldata104.url,lcldata104.username,lcldata104.password spring.shardingsphere.datasource.lcldata104.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.lcldata104.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.lcldata104.url=jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC spring.shardingsphere.datasource.lcldata104.username=root spring.shardingsphere.datasource.lcldata104.password=root # 配置表的分布,表的策略 spring.shardingsphere.sharding.tables.order_info.actual-data-nodes=lcldata104.order_info_$->{1..4} # 指定訂單表 根據訂單號生成策略為 SNOWFLAKE spring.shardingsphere.sharding.tables.order_info.key-generator.column=order_id spring.shardingsphere.sharding.tables.order_info.key-generator.type=SNOWFLAKE # 指定分片策略 spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.sharding-column=order_id spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.algorithm-expression=order_info_$->{order_id % 4 + 1} # 打開sql輸出日志 spring.shardingsphere.props.sql.show=true
4、測試
測試就直接上代碼
@Data @Builder public class OrderInfo { private long id; private long orderId; private long venderId; }
@Repository public interface OrderMapper extends BaseMapper<OrderInfo> { }
@RequestMapping("/save") public String save(long orderId, long venderId){ orderService.save(OrderInfo.builder().orderId(orderId).venderId(venderId).build()); return "OK"; }
@SpringBootApplication @MapperScan("com.lcl.galaxy.lcl.galaxy.mysql.dao") public class LclGalaxyMysqlApplication { public static void main(String[] args) { SpringApplication.run(LclGalaxyMysqlApplication.class, args); } }
測試結果如預期一樣,根據訂單號取余加一,落在了不同的表中。
(二)分庫
分庫的話就需要配置多個數據源,同時配置分庫分表策略時,只分庫,不分表,同時配置分庫策略
spring.shardingsphere.datasource.names=ds1,ds2 spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds1.url=jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password=root spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds2.url=jdbc:mysql://192.168.1.106:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC spring.shardingsphere.datasource.ds2.username=root spring.shardingsphere.datasource.ds2.password=root # 配置表的分布,表的策略 spring.shardingsphere.sharding.tables.order_info_new.actual-data-nodes=ds$->{1..2}.order_info_new # 指定分片策略 spring.shardingsphere.sharding.tables.order_info_new.database-strategy.inline.sharding-column=vender_id spring.shardingsphere.sharding.tables.order_info_new.database-strategy.inline.algorithm-expression=ds$->{vender_id % 2 + 1} # 打開sql輸出日志 spring.shardingsphere.props.sql.show=true
(三)分庫分表
分庫分表與分庫的區別就是,配置表的策略時,既分庫又分表,同時既要配置分庫策略又要配置分表策略。
spring.shardingsphere.datasource.names=ds1,ds2 spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds1.url=jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password=root spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds2.url=jdbc:mysql://192.168.1.106:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC spring.shardingsphere.datasource.ds2.username=root spring.shardingsphere.datasource.ds2.password=root # 配置表的分布,表的策略 spring.shardingsphere.sharding.tables.order_info.actual-data-nodes=ds$->{1..2}.order_info_$->{1..4} # 指定訂單表 根據訂單號生成策略為 SNOWFLAKE spring.shardingsphere.sharding.tables.order_info.key-generator.column=order_id spring.shardingsphere.sharding.tables.order_info.key-generator.type=SNOWFLAKE # 指定分片策略 spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.sharding-column=order_id spring.shardingsphere.sharding.tables.order_info.table-strategy.inline.algorithm-expression=order_info_$->{order_id % 4 + 1} spring.shardingsphere.sharding.tables.order_info.database-strategy.inline.sharding-column=vender_id spring.shardingsphere.sharding.tables.order_info.database-strategy.inline.algorithm-expression=ds$->{vender_id % 2 + 1} # 打開sql輸出日志 spring.shardingsphere.props.sql.show=true
二、Sharding JDBC實現讀寫分離
讀寫分離,主要就是需要配置配置主從服務器連接,然后配置讀寫分離的輪詢策略等內容。
spring: datasource: url: jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC #用戶名密碼 username: root password: root #數據庫驅動 #此處驅動有兩個 #com.mysql.jdbc.Driver #com.mysql.cj.jdbc.Driver #MySQL5用的驅動url是com.mysql.jdbc.Driver,MySQL6以后用的是com.mysql.cj.jdbc.Driver。 #使用何種驅動,根據安裝MySQL的版本而定 driver-class-name: com.mysql.cj.jdbc.Driver main: allow-bean-definition-overriding: true shardingsphere: datasource: names: lcl104,lcl106 # 主數據源 lcl104: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.1.104:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC username: root password: root # 從數據源 lcl106: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.1.106:3306/lcltest?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC username: root password: root masterslave: # 讀寫分離配置 load-balance-algorithm-type: round_robin # 最終的數據源名稱 name: dataSource # 主庫數據源名稱 master-data-source-name: lcl104 # 從庫數據源名稱列表,多個逗號分隔 slave-data-source-names: lcl106 props: # 開啟SQL顯示,默認false sql: show: true