Mysql主从复制(作读写分离)
- 启动docker的mysql实例
- 写配置文件,配置需要同步和忽略的库
- 从库连接主库同步数据
一、创建Master实例
启动docker容器
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=bestvincent_mysql \
-d mysql:5.7
参数说明
-p 3307:3306:将容器的3306端口映射到主机的3307端口
-v /mydata/mysql/master/conf:/etc/mysql:将配置文件夹挂在到主机
-v /mydata/mysql/master/log:/var/log/mysql:将日志文件夹挂载到主机
-v /mydata/mysql/master/data:/var/lib/mysql/:将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化root用户的密码
配置mysql
#修改master基本配置
vim /mydata/mysql/master/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
#注意:skip-name-resolve一定要加,不然连接mysql会超级慢
#添加master主从复制部分配置
server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gmall_ums
binlog-do-db=gmall_pms
binlog-do-db=gmall_oms
binlog-do-db=gmall_sms
binlog-do-db=gmall_cms
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
#重启master
二、创建Slave并启动
启动从机docker容器
docker run -p 3316:3306 --name mysql-slaver-01 \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
配置从机
#修改slave基本配置
vim /mydata/mysql/slaver/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
#添加master主从复制部分配置
server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gmall_ums
binlog-do-db=gmall_pms
binlog-do-db=gmall_oms
binlog-do-db=gmall_sms
binlog-do-db=gmall_cms
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
#重启slaver
三、主库授权配置
进入mysql容器内部
#从docker进入mysql内部命令
docker exec -it mysql-master /bin/bash
#进入后运行mysql命令进入mysql命令行
mysql -uroot -proot
授权远程访问用户
#1)、授权root可以远程访问( 主从无关,为了方便我们远程连接mysql)
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;
#2)、添加用来同步的用户
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
#3、查看master状态
show master status\G;
四、从库连接配置
进入从库容器内部后,配置主库连接信息
#1)、授权root可以远程访问( 主从无关,为了方便我们远程连接mysql)
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;
#2)、设置主库连接
change master to master_host='192.168.159.128',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3307;
#3)、启动从库同步
start slave;
#4)、查看从库状态
show slave status\G;
五、整合sharding实现多数据源的读写分离
-
添加maven的sharding依赖
<dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>2.0.3</version> </dependency>
-
创建yml配置文件
dataSources: db_master: !!com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://192.168.214.131:3307/gmall_pms?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root db_slave: !!com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://192.168.214.131:3316/gmall_pms?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root masterSlaveRule: name: db_ms masterDataSourceName: db_master slaveDataSourceNames: [db_slave]
-
创建配置类
package com.bv.gmall.pms.config; import io.shardingjdbc.core.api.MasterSlaveDataSourceFactory; 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.FileNotFoundException; import java.io.IOException; import java.sql.SQLException; @Configuration public class PmsDataSourceConfig { @Bean public DataSource dataSource() { DataSource dataSource = null; try { //加载配置文件 File file = ResourceUtils.getFile("classpath:sharing-jdbc.yaml"); //使用数据源工厂创建数据源实例 dataSource = MasterSlaveDataSourceFactory.createDataSource(file); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return dataSource; } }