package com.trj.shading.config;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration;
import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
import org.apache.shardingsphere.shardingjdbc.api.yaml.YamlMasterSlaveDataSourceFactory;
import org.apache.shardingsphere.shardingjdbc.api.yaml.YamlShardingDataSourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* @author TRJ
* @date 2019/10/11
* Description:
*/
@Configuration
public class ShadingConfig {
@Bean
public DataSource dataSource() throws IOException, SQLException {
File yamlFile = ResourceUtils.getFile("classpath:sharding-jdbc.yaml");
return YamlShardingDataSourceFactory.createDataSource(yamlFile);
}
// @Bean
public DataSource dataSourceByCode() throws SQLException {
// 配置真实数据源
Map<String, DataSource> dataSourceMap = new HashMap<>(5);
// 配置第一个数据源
BasicDataSource dataSource1 = new BasicDataSource();
dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
dataSource1.setUrl("jdbc:mysql://192.168.1.60:3306/shading0");
dataSource1.setUsername("root");
dataSource1.setPassword("19931213jie@JIE");
dataSourceMap.put("shading0", dataSource1);
// 配置第二个数据源
BasicDataSource dataSource2 = new BasicDataSource();
dataSource2.setDriverClassName("com.mysql.jdbc.Driver");
dataSource2.setUrl("jdbc:mysql://192.168.1.60:3306/shading1");
dataSource2.setUsername("root");
dataSource2.setPassword("19931213jie@JIE");
dataSourceMap.put("shading1", dataSource2);
// 配置Order表规则
TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order","shading${0..1}.t_order${0..1}");
// 配置分库 + 分表策略
orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "shading${user_id % 2}"));
orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));
// 配置分片规则
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
// 省略配置order_item表规则...
// ...
// 获取数据源对象
DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());
return dataSource;
}
}
mysql读写分离,分库分表-MysqlSample.zip
需积分: 0 135 浏览量
更新于2023-11-07
收藏 34KB ZIP 举报
MySQL数据库在面临高并发、大数据量的业务场景时,为了保证系统的稳定性和性能,通常会采用读写分离和分库分表的技术策略。本篇将详细介绍这两种技术,并结合"mysql读写分离,分库分表-MysqlSample"的示例进行讲解。
一、读写分离
读写分离是数据库优化的一种常见手段,主要目的是减轻主数据库的压力,提高系统整体的读取性能。在读写分离架构中,数据库分为两类角色:主库(Master)和从库(Slave)。主库负责接收并处理所有写操作,而从库则只处理读请求。当主库上的数据发生变化时,通过复制机制将变更同步到从库。
1. 数据库复制:MySQL提供了多种复制方式,如基于语句的复制(Statement-Based Replication, SBR)、基于行的复制(Row-Based Replication, RBR)和混合模式复制(Mixed Mode Replication)。SBR效率较高,但可能存在SQL语句不可重复性的问题;RBR更为安全,但数据传输量较大;混合模式根据情况自动选择。
2. 垂直切分:读写分离可以进一步细化,比如对读多写少的业务进行垂直切分,将部分只读或更新频率低的数据放到从库上,这样可以从主库上转移一部分读压力。
3. 配置与管理:可以通过配置MySQL的服务器参数,如`server-id`来区分主从库,设置`replicate-do-db`或`replicate-ignore-db`来控制复制的数据库范围。同时,需要监控复制延迟,确保数据的一致性。
二、分库分表
分库分表是在单个数据库无法承载大规模数据时,对数据进行水平分割的策略。其核心思想是将一个大表分成多个小表,分别存储在不同的数据库服务器上。
1. 水平分库:根据业务逻辑或用户群体,将数据分配到多个不同的数据库中,例如按照地域或部门进行划分。
2. 水平分表(Sharding):将一个大表按一定的规则(如哈希、范围、模取余等)拆分为多个小表,分布在同一个数据库的不同表空间或者不同数据库中。分表策略的选择应兼顾数据分布的均匀性和查询效率。
3. 分片键(Sharding Key):用于确定数据在哪个分片上的字段,通常选择业务上具有均匀分布特性的字段作为分片键。
4. 分片路由:当客户端发起SQL查询时,需要根据分片键计算出数据所在的分片,这一过程称为分片路由。常见的路由策略有哈希取模、范围分片和一致性哈希等。
5. 数据一致性与事务处理:分库分表后,跨分片的事务处理变得复杂,需要采用如两阶段提交、补偿事务等方法保证数据一致性。
结合"MysqlSample-master"示例,我们可以看到一个实际的读写分离和分库分表的实现,可能包含配置文件、数据迁移脚本、分片策略定义等。通过这个示例,可以学习如何在实际项目中应用这些技术,提升数据库系统的性能和稳定性。
总结来说,读写分离和分库分表是应对大数据量、高并发场景的有效解决方案,它们能有效降低单个数据库的压力,提高数据库的可用性和响应速度。然而,实施这些策略也会带来额外的复杂性,如数据一致性、事务处理和查询优化等问题,需要根据具体业务需求进行权衡和设计。