目录
1 MySql主从复制简介
1.1 主从复制的概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
1.2 主从复制的作用
数据的热备:作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
架构的扩展:业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
读写分离:使数据库能支撑更大的并发。
(1)在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
(2)在从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
高可用性:数据备份实际上是一种冗余的机制,通过这种冗余的方式可以换取数据库的高可用性,也就是当服务器出现故障或宕机的情况下,可以切换到从服务器上,保证服务的正常运行。
2. 搭建主从复制
2.1 pull mysql 镜像
docker pull mysql
2.2 新建主服务器容器实例 3307
先创建文件夹:
mkdir -p /mydocker/mysql-master/log
mkdir -p /mydocker/mysql-master/data
mkdir -p /mydocker/mysql-master/conf
docker run -p 3307:3306 --name=mysql-master -v /mydocker/mysql-master/log:/var/log/mysql -v /mydocker/mysql-master/data:/var/lib/mysql -v /mydocker/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
[root@192 mysql-master]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a298c5defda mysql "docker-entrypoint.s…" 4 seconds ago Up 2 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-master
#创建容器时出现 找不着/var/lib/mysql-files 的错误
解决办法:在my.cnf 配置文件中加入 secure_file_priv=/var/lib/mysql
2.2.1 master创建 my.cnf
在/mydocker/mysql-master/conf 目录下 创建 my.cnf
[mysqld]
#指定此路径限制数据导入导出,不然默认读取/var/lib/mysql-files路径,但是容器中此路径没有会报错
secure_file_priv=/var/lib/mysql
#设置server_id,同一局域网中需要唯一
server_id=101
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=mall-mysql-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slae端复制终端
#如:1062错误是指一些主键重复,1032错误是因为主从数据库不一致
slave_skip_errors=1062
2.2.2 重启master
docker restart 6a298c5defda
2.2.3 进入mysql 容器,创建同步用户
docker exec -it mysql-master /bin/bash
mysql -uroot -p
mysql> CREATE USER 'slave'@'%'IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.15 sec)
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON*.*TO'slave'@'%';
Query OK, 0 rows affected (0.01 sec)
#由于mysql8之后默认使用认证方式为caching_sha2_password,会使主从复制change命令后出现Slave_IO_Running: Connecting
解决办法:
① :在my.cnf 配置文件中加入 default_authentication_plugin=mysql_native_pa