springboot MySql主从复制
时间: 2025-01-08 12:56:53 浏览: 13
### Spring Boot 中配置和使用 MySQL 主从复制
#### 一、MySQL 主从复制的基础设置
为了实现 Canal 成功伪装成 Slave 并正确获取 MySQL 的 binary log,在自建 MySQL 环境下需完成以下操作:
- **开启 Binlog 功能**:确保 `binlog` 已经被启用,并且其格式设定为 ROW 模式。这可以通过编辑 MySQL 配置文件 (`my.cnf`) 来达成。
```ini
[mysqld]
log-bin=mysql-bin # 启用 binlog 日志记录
binlog-format=ROW # 设置日志格式为行级事件
server_id=1 # 设定唯一的服务 ID,用于区分不同的 MySQL 实例
```
上述更改之后重启 MySQL 服务使新参数生效[^1]。
- **创建同步用户**:进入 MySQL 容器内部执行命令以建立具有适当权限的新用户供 Canal 使用。
```bash
docker exec -it mysql bash
mysql -uroot -p
CREATE USER 'canal'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
```
此过程赋予 canal 用户足够的权利去读取主库上的二进制日志数据。
#### 二、Spring Boot 应用程序端的调整
对于 Spring Boot 应用来说,要支持 MySQL Master-Slave 复制架构,则需要做额外的应用层面上的支持工作。
##### 数据源配置
在 application.yml 或者 properties 文件里定义多个数据源连接池指向各自的数据库实例(Master 和 Slaves),例如:
```yaml
spring:
datasource:
master:
url: jdbc:mysql://master_host:port/db_name?useSSL=false&serverTimezone=UTC
username: root
password: secret
slaves:
slave1:
url: jdbc:mysql://slave1_host:port/db_name?useSSL=false&serverTimezone=UTC
username: root
password: secret
slave2:
url: jdbc:mysql://slave2_host:port/db_name?useSSL=false&serverTimezone=UTC
username: root
password: secret
```
这里假设存在两个备选副本节点 (Slave),可以根据实际部署情况增减数量。
##### 自动化路由逻辑
为了让应用程序能够智能地选择合适的后端存储资源访问,默认情况下所有的写请求都发送给 Master 节点而读请求则分发到各个可用的 Slave 上面。可以借助开源框架 Dynamic Datasource Selector 或 MyBatis Plus 提供的功能简化这一流程。
下面是一个简单的例子展示如何基于 AOP 切片技术动态切换当前线程上下文中使用的 DataSource:
```java
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class DataSourceSwitcher {
@Autowired
private DynamicDataSource dynamicDataSource;
public void setReadMode() {
dynamicDataSource.setTargetDataSources(Map.of(
"read", dataSourceProperties.getSlaves().get(0),
"write", dataSourceProperties.getMaster()
));
dynamicDataSource.setDefaultTargetDataSource(dataSourceProperties.getMaster());
}
}
```
这段代码片段展示了怎样利用面向切面编程的方式拦截方法调用链路并适时改变目标数据源的选择策略。
阅读全文