Linux使用docker搭建Mysql主从复制

(一)引言

Mysql5.7与Mysql8操作稍有差别,Mysql8的授权模式有改动,需要先创建用户;

使用Docker来模拟两台服务器,原理和使用2台不同IP的服务器一样。

Linux使用docker搭建Mysql主从复制_第1张图片

(二)percona

        Percona 为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升。

        该版本提升了在高 负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。

        Percona Server 只包含 MySQL 的服务器版,并没有提供相应对 MySQL 的 Connector 和 GUI 工具进行改进。

        Percona Server 使用了一些 google-mysql-tools, Proven Scaling, Open Query 对 MySQL 进行改造。

        镜像地址:https://hub.docker.com/_/percona/

        使用docker拉取percona镜像

[root@icoolkj docker]# docker pull percona:ps-8.0.28-19

Linux使用docker搭建Mysql主从复制_第2张图片

(三)Mysql主从复制搭建

1、主库搭建

a)搭建主库

## 创建主库映射目录
[root@icoolkj docker]# pwd
/usr/local/docker
[root@icoolkj docker]# mkdir -p mysql-master
[root@icoolkj docker]# cd mysql-master/
[root@icoolkj mysql-master]# mkdir data logs conf 
[root@icoolkj mysql-master]#  chmod 777 * -R

Linux使用docker搭建Mysql主从复制_第3张图片

## 创建配置文件
[root@icoolkj mysql-master]# cd conf/
[root@icoolkj conf]# vim my.cnf
[root@icoolkj conf]# cat my.cnf
[mysqld]
#开启二进制日志 
log-bin=mysql-bin 
#标识唯一id(必须),一般使用ip最后位 
server-id=1 
#不同步的数据库,可设置多个
binlog-ignore-db=information_schema 
binlog-ignore-db=performance_schema 
binlog-ignore-db=mysql 
#指定需要同步的数据库(和slave是相互匹配的),可以设置多个
#binlog-do-db=test
#设置存储模式不设置默认
binlog_format=MIXED 
#日志清理时间
expire_logs_days=7 
#日志大小 
max_binlog_size=200m 
#缓存大小 
binlog_cache_size=5m 
#最大缓存大小 
max_binlog_cache_size=512m  
[root@icoolkj conf]# 

Linux使用docker搭建Mysql主从复制_第4张图片

## 创建容器
docker create --name percona-master \
-v /usr/local/docker/mysql-master/conf:/etc/mysql \
-v /usr/local/docker/mysql-master/logs:/var/log/mysql \
-v /usr/local/docker/mysql-master/data:/var/lib/mysql \
-p 13306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
percona:ps-8.0.28-19

## 参数解释:
--name: percona 指定是容器的名称
 -v: /usr/local/docker/mysql-master/data:/var/lib/mysql 将主机目录/usr/local/docker/mysql-master/data挂载到容器的/var/lib/mysql上
-p: 13306:3306 设置端口映射,主机端口是13306,容器内部端口3306
 -e: MYSQL_ROOT_PASSWORD=root 设置容器参数,设置root用户的密码为root
percona:latest: 镜像名版本
## 启动容器 并 查看日志
[root@icoolkj mysql-master]# docker start percona-master && docker logs -f percona-master

Linux使用docker搭建Mysql主从复制_第5张图片

b)连接主库Linux使用docker搭建Mysql主从复制_第6张图片

## 进入percona-master容器
[root@icoolkj ~]# docker exec -it percona-master bash
bash-4.4$ mysql -uroot -proot
## 打开mysql库
mysql> use mysql
## 允许使用root账户连接的ip为任意
mysql> alter user 'root'@'%' identified with mysql_native_password by 'root';
## 如果前面步骤没有报错且刷新权限了还是不可以远程连接,就重新启动数据库。

Linux使用docker搭建Mysql主从复制_第7张图片

 c)创建同步账号及授权

## 也可以用navicat 工具创建
create user 'sync_user'@'%' identified by 'sync_user';
alter user 'sync_user'@'%' identified with mysql_native_password by 'sync_user';
grant replication slave on *.* to 'sync_user'@'%';

Linux使用docker搭建Mysql主从复制_第8张图片

## 查询master的状态
mysql> show master status;

Linux使用docker搭建Mysql主从复制_第9张图片

## 查看二进制日志相关的配置项
mysql>  show global variables like 'binlog%';

 Linux使用docker搭建Mysql主从复制_第10张图片

## 查看server相关的配置项
mysql> show global variables like 'server%';

Linux使用docker搭建Mysql主从复制_第11张图片 

2、从库搭建

a)搭建从库

## 创建从库映射目录
[root@icoolkj ~]# cd /usr/local/docker/
[root@icoolkj docker]# ls
mysql-master
[root@icoolkj docker]# mkdir mysql-slave
[root@icoolkj docker]# cd mysql-slave/
[root@icoolkj mysql-slave]# mkdir data logs conf 
[root@icoolkj mysql-slave]# chmod 777 * -R
[root@icoolkj mysql-slave]# ll
总用量 12
drwxrwxrwx 2 root root 4096 6月   8 11:31 conf
drwxrwxrwx 2 root root 4096 6月   8 11:31 data
drwxrwxrwx 2 root root 4096 6月   8 11:31 logs
[root@icoolkj mysql-slave]# 

 Linux使用docker搭建Mysql主从复制_第12张图片

## 创建配置文件
[root@icoolkj ~]# cd /usr/local/docker/mysql-slave/
[root@icoolkj mysql-slave]# cd conf/
[root@icoolkj conf]# vim my.cnf
[root@icoolkj conf]# cat my.cnf 
[mysqld]
#开启二进制日志 
log-bin=mysql-bin 
server-id=2 
binlog-ignore-db=information_schema 
binlog-ignore-db=performance_schema 
binlog-ignore-db=mysql 
#与主库配置保持一致 
#replicate-do-db=test 
replicate-ignore-db=mysql 
log_replica_updates 
replica_skip_errors=all 
replica_net_timeout=60 
[root@icoolkj conf]# 
## 创建容器
docker create --name percona-slave \
-v /usr/local/docker/mysql-slave/conf:/etc/mysql \
-v /usr/local/docker/mysql-slave/logs:/var/log/mysql \
-v /usr/local/docker/mysql-slave/data:/var/lib/mysql \
-p 13307:3306 \
-e MYSQL_ROOT_PASSWORD=root \
percona:ps-8.0.28-19
## 启动容器 并 查看日志
[root@icoolkj conf]# docker start percona-slave && docker logs -f percona-slave
## 查看server相关的配置项
mysql> show global variables like 'server%';

 Linux使用docker搭建Mysql主从复制_第13张图片

b)连接从库

根据主库连接方式设置连接,连接navicat。

## 进入percona-slave容器
[root@icoolkj ~]# docker exec -it percona-slave bash
bash-4.4$ mysql -uroot -proot
## 打开mysql库
mysql> use mysql
## 允许使用root账户连接的ip为任意
mysql> alter user 'root'@'%' identified with mysql_native_password by 'root';
## 如果前面步骤没有报错且刷新权限了还是不可以远程连接,就重新启动数据库。

Linux使用docker搭建Mysql主从复制_第14张图片

c)配置主库信息

## navicat 查询主库的master的状态
show master status;
## navicat 设置master相关信息
change master to
master_host='192.168.188.98',  ## 互联ip
master_user='sync_user',
master_password='sync_user',
master_port=13306,
master_log_file='mysql-bin.000003',
master_log_pos=157;
## 启动同步
start slave;


## 查看slave 状态
show slave status;

Linux使用docker搭建Mysql主从复制_第15张图片

 3、测试主从复

主库创建数据库,刷新从库,看看是否复制成功;

主库创建表并插入数据,刷新从库,看看是否存在同样表及数据信息;

Linux使用docker搭建Mysql主从复制_第16张图片

Linux使用docker搭建Mysql主从复制_第17张图片 Linux使用docker搭建Mysql主从复制_第18张图片

Linux使用docker搭建Mysql主从复制_第19张图片

(四)Mysql主从复制错误排查

  1. 先确定主机和从机的server-id是否不一样,如果一样也会导致主从复制失败。主机和从机的server-id在/etc/my.cnf配置文件中配置的。

  2. 看错误日志,我们可以从/etc/my.cnf文件中知道错误日志文件的位置,这是mysql配置文件中默认就有的,如果你改变了也可以查看你改变的位置。

 

 

你可能感兴趣的:(docker,linux,运维,mysql,数据库)