史上最简docker环境下搭建mysql8.0主从同步数据库集群

前言

在mysql的使用过程中,因为单台数据库服务器访问压力过大,会导致数据库读写性能变差,响应迟缓等问题,更为严重的情况是出现数据库服务器宕机,数据丢失。这个时候我们使用数据库主从同步集群就能有效的避免上述的问题。本文以流行的docker容器为例,搭建一套mysql8.0版本的mysql主从同步集群,基于全局事务标识符(GTID)的方法实现集群数据同步,希望能够帮助到大家。

正文

  • 拉取mysql8.0镜像

#拉取mysql8.0镜像
docker pull mysql:8.0.23

史上最简docker环境下搭建mysql8.0主从同步数据库集群_第1张图片

  • 创建mysql配置文件my.cnf

ps:这里我们只演示GTID的主从同步配置方式,其它同步配置我们后续有时间在行补充。

[mysqld]
###############################master主配置##############################
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
lower_case_table_names=1
symbolic-links=0
#设置同步的binary log二进制日志文件名前缀,默认为binlog
log-bin=mysql-bin
#服务器唯一id,默认为1,主数据库和从数据库的server-id不能重复
server-id=1      
#开启GTID主从同步模式
gtid_mode=on
enforce_gtid_consistency=true
###################################可选配置##############################
#主从复制的数据库名
binlog-do-db=atp
#指定忽略同步的数据库
binlog-ignore-db=mysql
#为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
#主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
#设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。这里设置为7天
expire_logs_days=7
#跳过主从同步中遇到的所有错误或指定类型的错误,避免slave端复制中断。
#如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
[mysqld]
##############################slave从配置##############################
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
lower_case_table_names=1
symbolic-links=0
#设置同步的binarylog二进制日志文件名前缀,默认是binlog
log-bin=mysql-bin
#服务器唯一ID,主数据库和从数据库的server-id不能重复
server-id=2
#开启GTID同步模式
gtid_mode=on
enforce_gtid_consistency=true

###############################可选配置#################################
#需要主从复制的数据库 
replicate-do-db=atp
#忽略同步的数据库
binlog-ignore-db=mysql
#为每个session分配的内存,在事务过程中用来存储二进制日志的缓存 
binlog_cache_size=1M
#主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一) 
binlog_format=row
#设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。 
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 
slave_skip_errors=1062
#relay_log配置中继日志,默认采用主机名-relay-bin的方式保存日志文件 
relay_log=replicas-mysql-relay-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#防止改变数据(只读操作,除了特殊的线程)
read_only=1
  • 级联创建mysql配置文件目录

主配置命令:

创建主配置文件目录: mkdir -p /mysql/master/conf

创建主配置文件:touch my.cnf

使用vi将上文的my.cnf文件内容写入配置文件中

史上最简docker环境下搭建mysql8.0主从同步数据库集群_第2张图片

从配置命令

创建从配置文件目录: mkdir -p /mysql/slave/conf

创建从配置文件:touch my.cnf

使用vi将上文的my.cnf文件内容写入配置文件中

史上最简docker环境下搭建mysql8.0主从同步数据库集群_第3张图片

  • docker启动主数据库

命令:

docker run --name master-mysql -p 3306:3306 -v /mysql/master/data:/var/lib/mysql -v /mysql/master/conf:/etc/mysql -v /mysql/master/mysql-files/:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23

参数解释:

--name:启动的docker应用名字

-p:端口映射

-v:数据卷映射,第一个是数据库文件的映射,第二个是配置文件的映射,第三个是mysql-files的映射

-d:后台运行

-e:传递环境变量

  • docker启动从数据库

命令:

docker run --name slave-mysql -p 3307:3306 -v /mysql/slave/data:/var/lib/mysql -v /mysql/slave/conf:/etc/mysql -v /mysql/slave/mysql-files/:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23

参数解释:

--name:启动的docker应用名字

-p:端口映射

-v:数据卷映射,第一个是数据库文件的映射,第二个是配置文件的映射,第三个是mysql-files的映射

-d:后台运行

-e:传递环境变量

  • 主服务器与从服务器mysql登录密码方式修改

因为在高版本的服务器中mysql的密码方式安全级别更高,公网无法直接访问服务,我们这里授权一个可以主从同步的用户,使用另外的密码登录方式。

命令:

进入docker容器:

docker exec -it master-mysql /bin/bash

登录mysql:

mysql -uroot -proot

切换到mysql数据库:

use mysql;

设置root用户密码:

ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; 

刷新权限:

flush privileges;

主从库的密码修改方式都遵循上面的步骤,这里就不在赘述。

史上最简docker环境下搭建mysql8.0主从同步数据库集群_第4张图片

  •  从服务器开启主从同步服务

命令:

绑定主服务:

change master to MASTER_HOST='192.168.23.134',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='root',MASTER_AUTO_POSITION=1;

开启从服务:

start slave;

查看从服务同步状态:

show slave status \G;

停止同步:

stop slave;

 重置从服务:

reset slave;

史上最简docker环境下搭建mysql8.0主从同步数据库集群_第5张图片

到这里,证明我们的数据库主从同步服务器集群就搭建成功了。 

结语

今天的mysql主从同步集群搭建就到这里了,希望能对你有所帮助,好的,我们下期见。

你可能感兴趣的:(mysql,docker,java,linux,docker)