Mysql主从原理图
1. 创建两个Mysql实例 Docker安装模拟MySQL集群(和本地安装没啥区别,我为了方便直接Docerk了)
1、下载mysql镜像
2、创建Master实例并启动
1 2 3 4 5 6 7 8 9 10 11 12 13 docker run -p 3306 :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=root \ -d mysql:5.7 参数说明 -p 3306 :3306 :将容器的3306 端口映射到主机的3306 端口 -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用户的密码
修改master基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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会超级慢,加上会跳过域名解析 skip-character-set-client-handshake 为跳过字符编码客户端与服务端的握手过程
修改后重启Mysql服务: **docker restart mysql-master **
3、创建Slave实例并启动
1 2 3 4 5 6 7 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基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 修改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
修改后重启Mysql服务: **docker restart mysql-slaver-01 **
2. 设置好主从的配置文件 修改master基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 vim /mydata/mysql/master/conf/my.cnf(还是之前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
修改slaver基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vim /mydata/mysql/slaver/conf/my.cnf(还是之前slaver配置文件) 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
3. 主从环境搭建完成 3.1 为master授权用户来他的同步数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 、进入master容器docker exec -it mysql /bin/bash 2 、进入mysql内部 (mysql –uroot -p) 1 )、授权root可以远程访问( 与主从无关,为了方便我们远程连接mysql @后面应该为ip地址,现在是%表示所有ip都可以用root用户访问) 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;
3.2 配置slaver同步master数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 、进入slaver容器docker exec -it mysql-slaver-01 /bin/bash 2 、进入mysql内部(mysql –uroot -p) 1 )、授权root可以远程访问( 主从无关,为了方便我们远程连接mysql) grant all privileges on *.* to 'root' @'%' identified by 'root' with grant option; flush privileges; # master_log_file 为上图主库的bin-log日志 mysql-bin.000001 ,master_log_pos应该填上图中 889 因为主库现在位置只有889 ,所以填0 ,也可以自动确定889 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=3306 ; 3 )、启动从库同步 start slave; 4 )、查看从库状态(下图) show slave status\G;
至此主从配置完成;
总结 : 1)、主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。并且server-id不能一样 2)、主库授权某个账号密码来同步自己的数据 3)、从库使用这个账号密码连接主库来同步数据
4. 主从环境测试完成 在主数据库中建库、导入测试表、 以及测试数据
1 2 3 4 5 6 CREATE DATABASE `gmall_cms` ; CREATE DATABASE `gmall_pms` ; CREATE DATABASE `gmall_oms` ; CREATE DATABASE `gmall_ums` ; CREATE DATABASE `gmall_sms` ;
从库跟着同步
dbc完成读写分离配置
1 2 3 4 5 6 https://mvnrepository.com/artifact/io.shardingjdbc/sharding-jdbc-core --> <dependency > <groupId > io.shardingjdbc</groupId > <artifactId > sharding-jdbc-core</artifactId > <version > 2.0.3</version > </dependency >
构建Sharding-jdbc.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 dataSources: db_master: !!com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://39.97.251.40:3306/gmall_pms?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root db_slave: !!com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://39.97.251.40:3316/gmall_pms?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root masterSlaveRule: name: db_ms masterDataSourceName: db_master slaveDataSourceNames: [db_slave ]
配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 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.IOException;import java.sql.SQLException;@Configuration public class PmsDataSourceConfig { @Bean public DataSource dataSource () throws IOException, SQLException { File file = ResourceUtils.getFile("classpath:sharding-jdbc.yml" ); DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource(file); return dataSource; } }
测试
因为代码涉及到controller Service Mapper 所以都不写了,就写一点伪代码
1 2 3 4 Brand brand = new Brand (); brand.setName("哈哈哈" ); brandService.save(brand);
数据库中主从库都有数据
手动修改数据库从库53号数据
1 2 Brand byId=brandService.getById(53 ); System.out.println(byId);
查询出来从库数据