# customMasterSlaveDatabaseSharding **Repository Path**: xcOschina/custom-master-slave-database-sharding ## Basic Information - **Project Name**: customMasterSlaveDatabaseSharding - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-12-13 - **Last Updated**: 2025-12-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Custom Master-Slave Database Sharding 自定义主从数据库读写分离与分片项目,基于Spring Boot、MyBatis-Plus和Apache ShardingSphere实现。 ## 项目概述 本项目演示了如何构建一个支持以下特性的数据库访问层: 1. **主从复制读写分离** - 写操作路由到主库,读操作路由到从库 2. **自定义延迟感知负载均衡算法** - 监控从库延迟并在延迟过高时自动切换到主库 3. **数据库分片** - 基于用户ID对订单表进行水平分片 4. **动态监控** - 实时监控从库延迟状态 ## 技术栈 - Spring Boot 2.x - MyBatis-Plus - Apache ShardingSphere - MySQL主从复制集群 - HikariCP连接池 ## 架构设计 ### 数据库架构 ``` 主库 (ds-master) ↓ (复制) 从库1 (ds-slave1) 从库2 (ds-slave2) ``` ### 分片策略 - 表分片:根据`user_id`字段对订单表进行分片,使用`user_id % 16`算法分到16个物理表中 - 读写分离:写操作发送到主库(ds-master),读操作发送到从库(ds-slave1, ds-slave2) ### 延迟感知机制 项目包含两种延迟感知负载均衡算法: 1. [DelayAwareLoadBalanceAlgorithm](src/main/java/com/example/sharding/DelayAwareLoadBalanceAlgorithm.java) - 基础版本 2. [DelayAwareLoadBalanceAlgorithm2](src/main/java/com/example/sharding/DelayAwareLoadBalanceAlgorithm2.java) - 改进版本 当检测到从库延迟超过阈值时,读请求会自动路由到主库以确保数据一致性。 ## 核心组件 ### 1. 自定义负载均衡算法 实现了[MasterSlaveLoadBalanceAlgorithm](src/main/java/com/example/sharding/DelayAwareLoadBalanceAlgorithm2.java)接口,提供延迟感知的负载均衡策略。 关键特性: - 实时监控从库延迟 - 延迟超过阈值时自动切换到主库 - 正常情况下轮询使用从库以分散查询压力 ### 2. 延迟监控器 [SlaveDelayMonitor](src/main/java/com/example/sharding/SlaveDelayMonitor.java)组件定时检查各从库的延迟情况: - 每5分钟执行一次延迟检查 - 通过MySQL的`SHOW SLAVE STATUS`命令获取延迟信息 - 将延迟信息更新到负载均衡算法中 ### 3. 数据源配置 [DataSourceConfig](src/main/java/com/example/sharding/config/DataSourceConfig.java)负责注册从库数据源到监控器中。 ## 配置说明 主要配置文件: - [application.yml](src/main/resources/application.yml) - 主配置文件 - [application-local2.yml](src/main/resources/application-local2.yml) - 数据库连接配置 ### 数据库配置示例 ```yaml spring: shardingsphere: datasource: names: ds-master,ds-slave1,ds-slave2 ds-master: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://192.168.56.121:3307/demo_ds username: app_user password: Str0ng!App#Pass2025 ds-slave1: # 从库1配置... ds-slave2: # 从库2配置... sharding: tables: t_order: actual-data-nodes: ds.t_order_$->{0..15} table-strategy: inline: sharding-column: user_id algorithm-expression: t_order_$->{user_id % 16} master-slave-rules: ds: master-data-source-name: ds-master slave-data-source-names: ds-slave1,ds-slave2 load-balance-algorithm-class-name: com.example.sharding.DelayAwareLoadBalanceAlgorithm2 ``` ## API接口 ### 订单管理接口 | 接口 | 方法 | 描述 | |------|------|------| | [/orders](src/main/java/com/example/controller/OrderController.java#L55-L57) | POST | 创建订单 | | [/orders/{orderId}](src/main/java/com/example/controller/OrderController.java#L39-L41) | DELETE | 删除订单 | | [/orders](src/main/java/com/example/controller/OrderController.java#L45-L47) | PUT | 更新订单 | | [/orders/{orderId}](src/main/java/com/example/controller/OrderController.java#L50-L52) | GET | 根据ID查询订单 | | [/orders](src/main/java/com/example/controller/OrderController.java#L55-L57) | GET | 查询所有订单 | | [/orders/page](src/main/java/com/example/controller/OrderController.java#L63-L74) | GET | 分页查询订单 | | [/orders/user/{userId}](src/main/java/com/example/controller/OrderController.java#L77-L82) | GET | 根据用户ID查询订单 | ## 部署说明 1. 准备MySQL主从复制环境(1主2从) 2. 修改[application-local2.yml](src/main/resources/application-local2.yml)中的数据库连接信息 3. 运行Spring Boot应用 ```bash mvn spring-boot:run ``` ## 监控端点 项目集成了Spring Boot Actuator,提供了以下监控端点: - `/actuator/health` - 健康检查 - `/actuator/prometheus` - Prometheus指标导出 ## 扩展性考虑 1. 可以轻松添加更多从库节点 2. 可以调整分片策略以适应不同业务场景 3. 延迟阈值和检查间隔可以配置化 4. 可以扩展监控器以支持更多类型的数据库监控 ## 注意事项 1. 项目依赖特定的MySQL主从复制环境 2. 延迟监控仅适用于MySQL数据库 3. 生产环境中应根据实际情况调整延迟阈值 4. 分片键(user_id)的选择对性能有重要影响