Linux使用docker搭建Mysql主从复制

(一)引言

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

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

(二)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

d17fd78636493f06e10719a878c5f998.png

(三)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

ff1ed51acdc3177999456ab320aeb9e6.png

## 创建配置文件
[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]# 

2de76fd03144dab8a7fecea202fe8203.png

## 创建容器
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

eeaee89f0ceda8501ab40c9def241faf.png

b)连接主库9875d6f53e6a3a7c21c056a1833b7d06.png

## 进入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';
## 如果前面步骤没有报错且刷新权限了还是不可以远程连接,就重新启动数据库。

 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'@'%';

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

0aaa17947f8726d241f69f333441b618.png

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

 cb4d6ac59ab9e9c5a6009776cd66510b.png

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

611fef2c03dfe4196a7cee43fe89aa0a.png 

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]# 

 2928c1e35dff0a1b5f7747301bb24a5f.png

## 创建配置文件
[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%';

 be3058ed2717d9ccab7d1c9c6bd3b1fb.png

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';
## 如果前面步骤没有报错且刷新权限了还是不可以远程连接,就重新启动数据库。

40c44d616534e74bcbd50440c18eb9e7.png

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;

 3、测试主从复

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

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

e2e962cb935d0721cd7e2200363b23a9.png 3bc91a44a3cdca9524f67166502b7b84.png

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

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

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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 安装Docker 如果您还没有安装Docker,请按照官方文档的说明安装Docker。 2. 创建Docker网络 为了使主从复制工作,我们需要为Docker容器创建一个网络。在命令行中运行以下命令: ``` sudo docker network create mysql_network ``` 3. 启动主数据库 我们将使用官方的MySQL Docker镜像来启动主数据库。在命令行中运行以下命令: ``` sudo docker run -d --name mysql_master --net mysql_network -e MYSQL_ROOT_PASSWORD=password mysql:latest --server-id=1 --log-bin=mysql-bin --binlog-do-db=mydb ``` 这将启动一个名为mysql_master的Docker容器,并将其连接到我们创建的mysql_network网络中。我们还指定了一个root用户的密码,并为该容器分配了一个server-id,以便在创建从数据库时使用。 我们还使用了两个MySQL选项来启用二进制日志记录和仅记录mydb数据库的事务。 4. 启动从数据库 现在我们需要启动另一个MySQL容器作为从数据库。在命令行中运行以下命令: ``` sudo docker run -d --name mysql_slave --net mysql_network -e MYSQL_ROOT_PASSWORD=password mysql:latest --server-id=2 --log-bin=mysql-bin --binlog-do-db=mydb --relay-log=mysql-relay-bin --log-slave-updates=1 --read-only=1 --slave-skip-errors=all --skip-slave-start ``` 这将启动一个名为mysql_slave的Docker容器,并将其连接到我们创建的mysql_network网络中。我们还指定了一个root用户的密码,并为该容器分配了一个server-id。 我们还使用了一些MySQL选项来启用二进制日志记录和仅记录mydb数据库的事务。我们还启用了中继日志记录和从服务器更新主服务器的日志记录。我们还将容器设置为只读模式,并跳过任何从数据库错误。最后,我们将跳过从服务器的启动。 5. 配置主数据库 现在我们需要登录主数据库并为它创建一个用于从服务器的用户。在命令行中运行以下命令: ``` sudo docker exec -it mysql_master mysql -u root -p ``` 输入我们在启动容器时指定的root密码,这将进入MySQL shell。在MySQL shell中,运行以下命令: ``` GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; SHOW MASTER STATUS; ``` 这将创建一个名为slave_user的用户并授予其复制权限。我们还刷新了特权表以确保更改生效。最后,我们显示了主服务器的状态,以便稍后配置从服务器。 请注意,我们在第一行中使用了“%”通配符,以便从任何位置连接到主服务器。在生产环境中,您应该更明确地指定从服务器的IP地址。 6. 配置从数据库 现在我们需要登录从数据库并配置它以连接到主服务器。在命令行中运行以下命令: ``` sudo docker exec -it mysql_slave mysql -u root -p ``` 输入我们在启动容器时指定的root密码,这将进入MySQL shell。在MySQL shell中,运行以下命令: ``` CHANGE MASTER TO MASTER_HOST='mysql_master', MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; START SLAVE; ``` 这将配置从服务器以连接到我们的主数据库,并指定将从哪个二进制日志文件开始复制。我们还启动从服务器以开始复制。 请注意,我们在第一行中使用了主服务器的容器名称(mysql_master)作为主机名。在Docker网络中,容器可以使用其名称进行通信。 7. 测试主从复制 现在,我们已经成功配置了主从复制,我们可以测试它是否正常工作。在MySQL shell中,运行以下命令: ``` USE mydb; CREATE TABLE test (id INT PRIMARY KEY); INSERT INTO test VALUES (1); ``` 这将在主服务器上创建一个名为test的表,并将一行插入其中。我们可以使用以下命令在从服务器上检查是否成功复制: ``` USE mydb; SELECT * FROM test; ``` 如果一切正常,您应该看到与主服务器上插入的相同的行。 现在,我们已经成功地使用Docker部署了MySQL主从复制。请记住,这只是一个简单的示例,用于演示如何设置主从复制。在生产环境中,您应该仔细考虑安全性和高可用性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值