MySQL主从架构配合ShardingJdbc实现读写分离

文章目录

目录

架构搭建

基于Docker去创建MySQL的主从架构

读写分离

pom.xml

xml 复制代码
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${fdy-mysql.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>${sharding.jdbc.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>${snakeyaml.version}</version>
</dependency>

fdy-live-user-provider 模块

application.yml
yaml 复制代码
spring:
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:classpath:fdy-db-sharding.yaml
    # 设置连接池的全局属性
    hikari:
      pool-name: fdy-user-pool
      minimum-idle: 15 # 初始化连接池
      maximum-pool-size: 300
      connection-init-sql: select 1
      connection-timeout: 4000
      max-lifetime: 60000

logging:
  level:
    org.apache.shardingsphere: DEBUG
    com.zaxxer.hikari: DEBUG
fdy-db-sharding.yaml
yaml 复制代码
dataSources:
  user_master: ##新表,重建的分表
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver  # 统一为 driverClassName
    jdbcUrl: jdbc:mysql://192.168.56.101:8808/fdy_live_user?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  user_slave0: ##新表,重建的分表
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver  # 统一为 driverClassName
    jdbcUrl: jdbc:mysql://192.168.56.101:8809/fdy_live_user?useUnicode=true&characterEncoding=utf8
    username: root
    password: root

rules:
  - !READWRITE_SPLITTING
    dataSources:
      #读写分离配置
      user_ds:
        staticStrategy:
          writeDataSourceName: user_master
          readDataSourceNames:
            - user_slave0
  - !SINGLE
    #  不分表分分库的默认数据源
    defaultDataSource: user_ds
  - !SHARDING
    tables:
      t_user:
        actualDataNodes: user_ds.t_user_${(0..04).collect(){it.toString().padLeft(2,'0')}}
        tableStrategy:
          standard:
            #指定用于分表的列名。
            shardingColumn: user_id
            shardingAlgorithmName: t_user-inline

    #定义分表算法
    shardingAlgorithms:
      t_user-inline:
        type: INLINE
        props:
          #根据"user_id"对5取模的结果将作为分表的后缀,范围为00到04,对应五个表,并在左侧填充0。
          algorithm-expression: t_user_${(user_id % 5).toString().padLeft(2,'0')}
props:
  sql-show: true
ShardingJdbcDatasourceAutoInitConnectionConfig.java

java\org\fdy\live\user\provider\config\ShardingJdbcDatasourceAutoInitConnectionConfig

java 复制代码
package org.fdy.live.user.provider.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.Connection;

/**
 * @author lee
 * @description 解决hikari存在bug, 强制hikari进行数据源的初始化操作
 */
@Slf4j
@Configuration
public class ShardingJdbcDatasourceAutoInitConnectionConfig {

    @Bean
    public ApplicationRunner runner(DataSource dataSource) {
        return args -> {
            log.info("dataSource: {}", dataSource);
            // 手动触发下连接池的连接创建
            Connection connection = dataSource.getConnection();
//            try (Connection connection = dataSource.getConnection()){}
        };
    }
}
相关推荐
SHIPKING3931 分钟前
【开发策略】MCP 多表查询策略方案
数据库·oracle
kka杰7 分钟前
MYSQL 事务-1
数据库·mysql·oracle
禅思院7 分钟前
vite项目hmr热更新问题
前端·vue.js·架构
雨中飘荡的记忆16 分钟前
MySQL + Redis 分布式事务消息中间件:保证最终一致性
redis·mysql
程序员小胖16 分钟前
每天一道面试题之架构篇|设计千万级高并发点赞/收藏系统架构
面试·架构
chian_ocean21 分钟前
在 KubeSphere 上部署 AI 大模型 Ollama
数据库
网络小白不怕黑22 分钟前
IPv6核心技术与NDP协议深度解析:从地址架构到邻居发现
开发语言·架构·php
踏浪无痕24 分钟前
乐观锁和悲观锁,到底该怎么选?
后端·面试·架构
BullSmall25 分钟前
MySQL8.0连接数查询全攻略
mysql
跟着珅聪学java30 分钟前
Jedis SetParams教程:参数化设置 Redis 键值对
数据库·redis·缓存