docker中mysql主从同步配置并用sharding实现读写分离
1.首先在docker启动两个mysql容器
docker run -p 3306:3306 --name mysql-master
-v /data/mysql/master/log:/var/log/mysql
-v /data/mysql/master/data:/var/lib/mysql
-v /data/mysql/master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run -p 3307:3306 --name mysql-slaver
-v /data/mysql/slaver/log:/var/log/mysql
-v /data/mysql/slaver/data:/var/lib/mysql
-v /data/mysql/slaver/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
分别开启3306和3307端口,并将mysql的日志,配置文件等挂载到自己新建的目录下,方便查看和修改。
2. 修改mysql配置文件
在刚才新建的 /data/mysql/master/conf和/data/mysql/slaver/cnf目录下创建my.cnf文件
主
[mysqld]
server_id=1 #数据库服务唯一标识
log-bin=mysql-bin
read-only=0 #不读
binlog-do-db=*** #同步的数据库
#忽略mysql初始的数据库
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
从
[mysqld]
server_id=2
log-bin=mysql-bin #数据库服务唯一标识
read-only=1 #只读
binlog-do-db=*** #同步的数据库
#忽略mysql初始的数据库
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
配置完成后重启数据库。
3. 配置主从同步
- 进入主库
docker exec -it mysql-master /bin/bash
- 登录
mysql -uroot -proot
- 创建用于从服务器同步数据使用的帐号
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by '123456';
FLUSH PRIVILEGES;
- 获取主服务器的二进制日志信息
show master status
5. 进入从库
docker exec -it mysql-slaver /bin/bash
- 登录
mysql -uroot -p
- 设置主库连接
填好自己的数据库host和port
change master to master_host='192.168.0.1', master_port=3306,master_user='slave', master_password='123456', master_log_file='mysql-bin.000001',master_log_pos=0;
- 启动从库同步
start slave;
- 查看从库状态
show slave status \G
只要Slave_IO_Running和Slave_IO_Running为yes即成功
最后,只要在主库增删改数据,从库就会自动读取主库并更新到自己的数据库里。
4.使用sharding结合springboot实现读写分离
数据库虽然配好了,但是还需要通过代码去实现读写分离。实现的方式可以用MyCat数据库中间件,但因为太重量级了,而且配置复杂,所以选用了较轻量但功能齐全的sharding。
- 首先在maven引入依赖
这里使用了2.x.x版本
不同版本配置不同,详细内容见官网
<dependency>
<groupId>io.shardingjdbc</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>2.0.3</version>
</dependency>
- 使用简单的yml配置
在resources下创建sharding.yml文件
dataSources:
db_master: !!com.zaxxer.hikari.HikariDataSource #数据源
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.0.1:3306/db
username: root
password: root
db_slave: !!com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://192.168.0.1:3307/db
username: root
password: root
masterSlaveRule: #配置主从
name: ms_rule
masterDataSourceName: db_master # 主库数据源名称
slaveDataSourceNames: [db_slave] #可写多个从库 用逗号隔开
- 用配置类读取yml文件
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() throws IOException, SQLException {
File file = ResourceUtils.getFile("classpath:sharding.yml");
DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource(file);
return dataSource;
}
}
大功告成,最后测试一下是否读取成功和主从数据库的数据是否同步即可。