前几天试着学习网上教程利用docker-compose搭建了一套简单的主从mysql,以学习为目的,接下来纯干货一步一步在下文演示.卷起来!!!
首先介绍笔者使用的基础环境和使用的软件.
Centos 7.6
Windows 10
Docker version 20.10.12
Docker Compose version v2.2.2
Navicat Premium 15
笔者是在/home/docker目录下构建的文件,首先在/home/docker新建一个docker-compose.yml 执行配置文件
#docker-compse对应版本docker版本
version: '3'
services:
# mysql配置(主)
mysql-master:
# 使用mysql5.7版本镜像
image: mysql:5.7
# 设置自启
restart: always
# 容器名
container_name: mysql-master
# mysql root用户密码配置
environment:
MYSQL_ROOT_PASSWORD: 123456
# mysql主库配置,详情看下文
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--server-id=1
--log-bin=mysql-bin
--binlog-do-db=数据库名
--innodb_flush_log_at_trx_commit=2
--sync_binlog=1
--max_allowed_packet=128M;
# 端口绑定
ports:
- 3306:3306
# 数据卷(需要在宿主机新建对应空文件)
volumes:
- "/home/docker/mysql/master/my.cnf:/etc/mysql/my.cnf"
- "/home/docker/mysql/master/conf:/etc/mysql/conf.d"
- "/home/docker/mysql/master/data:/var/lib/mysql"
- "/home/docker/mysql/master/error.log:/var/log/mysql/error.log"
# mysql配置(从)
mysql-slave-3307:
# 使用mysql5.7版本镜像
image: mysql:5.7
# 设置自启
restart: always
# 容器名
container_name: mysql-slave-3307
# mysql root用户密码配置
environment:
MYSQL_ROOT_PASSWORD: 123456
# mysql主库配置,详情看/home/docker/mysql/master/my.cnf
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--server-id=428
--max_allowed_packet=128M;
这里只介绍涉及到主从配置的参数
server-id 设置服务 的ID (id可以自己随便设置但是要保证和slave的id不一样,从库只需配置这个)
log-bin=mysql-bin 启用二进制日志文件(主从的核心,不了解作用的建议去了解一下主从数据库的执行流程,笔者这里不做介绍)
binlog-do-db=数据库名 这个表示只同步某个库 (如果没有此项,表示同步所有的库)
innodb_flush_log_at_trx_commit=2
0:事务提交时,不将重做日志缓冲写入磁盘,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。因此如果 MySQL 发生宕机,那么就有可能丢失一部分事务。
1:事务提交时,会将重做日志缓冲写入磁盘,并且立即刷新(fsync())。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。
2:事务提交时,会将重做日志缓冲写入磁盘,但是不会立即进行刷新操作,因此只是写到了操作系统的缓冲区。此时若操作系统发生宕机而没有即时的同步,也可能会丢失一部分数据。
可以看到,只有1才能真正地保证事务的持久性,但是由于刷新操作 fsync() 是阻塞的,直到完成后才返回,我们知道写磁盘的速度是很慢的,因此 MySQL 的性能会明显地下降。如果不在乎事务丢失,,0和2能获得更高的性能。
在效率上:
数据量:4w
临时改:set global innodb_flush_log_at_trx_commit=2;重启数据库后失效
查询语句:SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
设置0的时间:1分钟左右
默认1的时间:20分钟左右
设置2的时间: 8分钟左右
————————————————
参考博客文档链接:https://blog.csdn.net/qq_31984879/article/details/103952183
sync_binlog=1 开启binlog 志同步功能
至此,准备工作完成,在该目录下使用'docker-compose up --build -d'命令将docker容器运行起来.
此处为了方便,笔者使用Navicat Premium 15接下来搭建主从mysql工作,
首先,连接上两个mysql服务.
主数据库上
# 查询log_bin状态,log_bin为ON则docker初始化构建成功
show variables like '%log_bin%';
# 准备创建主库用户并赋予权限(此处为笔者用Navicat Premium 15图形化新建账号的sql语句)
CREATE USER `用户名`@`%` IDENTIFIED WITH mysql_native_password BY '123456';
GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Grant Option, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `主从数据库名`.* TO `用户名`@`%`;
# 授权主库账号
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%';
# 查询主库状态,此处的File列和Position列后面从库需要用上
SHOW MASTER STATUS;
从库数据库上
# 创建主库连接
change master to
master_host='' ,#主库host
master_user='' ,#授权主库账号账号
master_port= ,#主库端口
master_password='' ,#授权主库账号账号密码
master_log_file='' ,#查询主库状态File列(创建主库连接前查一遍)
master_log_pos= ;#查询主库状态Position列(创建主库连接前查一遍,取最新值)
# 启动从库服务
start slave;
# 查看从状态
show slave status;
# 若Slave_IO_Running和Slave_SQL_Running都为Yes时,则主从Mysql搭建成功
至此主从Mysql搭建成功,此时改动主库,从库也会同步改动.
注意,不要改动从库,否则Slave_IO_Running将会变为No,得重新配置主从mysql
建议从库使用新建一个只有读权限的账号使用,此时可以做读写分离
# 异常解决方案
# mysql主从复制Slave_SQL_Running: No的解决办法
stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;
show slave status;
# mysql主从复制Slave_IO_Running: No 的解决办法启动不成功,
# 先用把数据库使用工具栏的数据传输同步,然后重新来一遍主从搭建sql
# 启动从库服务启动不成功时使用,重置从状态
reset slave;
此次教程到此为止啦,有什么不对的,不好的,值得优化的地方,欢迎各位指教~俺是小卢,喜欢钻研互联网技术,一起卷起来~