mysql 主从分库
时间: 2023-11-16 20:57:53 浏览: 49
MySQL主从分库是指将一个大的数据库分成多个小的数据库,每个小的数据库都有自己的主从复制架构。主库负责写入数据,从库负责读取数据,从而实现读写分离和负载均衡。主从分库可以提高数据库的性能和可用性,同时也可以减少单点故障的风险。
在主从分库中,主库和从库之间通过二进制日志文件进行数据同步。当主库执行更新操作时,会将更新的内容写入到二进制日志文件中,并且写入二进制文件的过程是一个异步的过程。从库会开启IO线程去读取主库的二进制日志文件,之后写入中继(临时存储)日志中。从库会开启SQL线程去读取中继日志中的信息,之后将数据同步到从库中。
需要注意的是,在主从分库中,分库分表引入了分库分表键,也叫做分区键,也就是我们对数据库做分库分表所依据的字段。这也是主从分库引入的一个最大的问题。
相关问题
springBoot连接mysql主从配置
1. 在pom.xml文件中添加以下依赖:
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
```
2. 在application.properties中添加以下配置:
```
# 主库配置
spring.datasource.master.url=jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.master.username=root
spring.datasource.master.password=root
spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver
# 从库配置
spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.slave.username=root
spring.datasource.slave.password=root
spring.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
# 配置多个从库,用逗号分隔
spring.datasource.slave2.url=jdbc:mysql://localhost:3306/slave2?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.slave2.username=root
spring.datasource.slave2.password=root
spring.datasource.slave2.driver-class-name=com.mysql.jdbc.Driver
# 配置读写分离
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.read-type=READ_ONLY
spring.datasource.master.slaves=slave,slave2
```
3. 在代码中使用@Primary注解来指定默认的数据源:
```
@Configuration
public class DataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "slave2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave2")
public DataSource slave2DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dynamicDataSource")
@Primary // 指定默认的数据源
public DataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(masterDataSource());
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", masterDataSource());
dataSourceMap.put("slave", slaveDataSource());
dataSourceMap.put("slave2", slave2DataSource());
dynamicDataSource.setTargetDataSources(dataSourceMap);
return dynamicDataSource;
}
}
```
4. 实现自定义的动态数据源:
```
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
```
5. 创建一个数据源上下文,用于保存当前线程使用的数据源类型:
```
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
public static String getDataSourceType() {
return contextHolder.get();
}
public static void clearDataSourceType() {
contextHolder.remove();
}
}
```
6. 在service层中根据需要调用不同的数据源:
```
@Service
public class UserService {
@Autowired
private UserDao userDao;
public List<User> findAll() {
// 从主库读取数据
DataSourceContextHolder.setDataSourceType("master");
return userDao.findAll();
}
public User findById(Long id) {
// 从从库1读取数据
DataSourceContextHolder.setDataSourceType("slave");
return userDao.findById(id);
}
public void save(User user) {
// 写入主库
DataSourceContextHolder.setDataSourceType("master");
userDao.save(user);
}
public void deleteById(Long id) {
// 写入主库
DataSourceContextHolder.setDataSourceType("master");
userDao.deleteById(id);
}
}
```
mysql 分库分表实践
MySQL分库分表是一种数据库分布式架构的实践方案,旨在解决大数据量、高并发访问等问题。在实践中,可以采取以下步骤:
1. 数据库的垂直拆分:将一个大型数据库拆分成多个功能相关的小型数据库。例如,可以将用户信息存储、商品信息存储等拆分成独立的数据库,便于管理和维护。
2. 数据库的水平拆分:将某个数据库中的表按照某种规则拆分成多个分表,例如按照用户ID哈希值进行拆分。这样每个分表只负责一部分数据的存储和查询,提高查询性能。
3. 集群和分布式处理:通过数据分片策略,将数据分布在不同的数据库实例上,形成一个数据库集群。每个数据库实例可以部署在不同的服务器上,提供更高的容错性和可用性。
4. 数据同步和一致性:在分库分表架构中,需要保持数据的一致性。可以通过主从复制、双写一致性、分布式事务等机制来实现数据的同步和一致性。
5. 路由和负载均衡:在分库分表的架构中,需要通过路由器来确定每个查询应该路由到哪个数据库实例和表中。同时,为了提高性能和可扩展性,可以通过负载均衡技术将查询请求均匀地分发到各个数据库节点。
总的来说,MySQL分库分表实践是一种将大型数据库拆分成小型数据库和分表,通过集群和分布式处理来提高性能和可扩展性的架构方案。在实施过程中需要注意数据的一致性和同步,以及合理的路由和负载均衡策略。