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()){}
        };
    }
}
相关推荐
m0_602857761 天前
如何提升SQL存储过程逻辑复用_封装通用存储过程函数
jvm·数据库·python
志栋智能1 天前
运维超自动化:构建弹性IT架构的关键支撑
运维·服务器·网络·人工智能·架构·自动化
ai产品老杨1 天前
GB28181与RTSP全协议兼容之道:基于Docker与微服务架构的AI视频中台架构解析(附源码交付方案)
docker·微服务·架构
池央1 天前
基于腾讯云架构部署OpenClaw并实现与Telegram终端集成的全链路技术解析与实践指南
架构·云计算·腾讯云·腾讯云openclaw玩虾大赛
薛定猫AI1 天前
【深度解析】Open Design:用本地优先架构重塑 AI UI 生成工作流
人工智能·ui·架构
forEverPlume1 天前
mysql如何实现高可用集群架构_基于MHA环境搭建与部署
jvm·数据库·python
草莓熊Lotso1 天前
Vibe Coding 时代:LangChain 与 LangGraph 全链路解析
linux·运维·服务器·数据库·人工智能·mysql·langchain
candyTong1 天前
一觉醒来,大模型就帮我排查完页面性能问题
前端·javascript·架构
zh1570231 天前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
代码AI弗森1 天前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库