Docker安装mysql 5.7主从复制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 使用docker安装mysql主从复制,踩了很多坑,把过程记录下来方便以后查阅

一、安装master

拉取mysql镜像

docker pull mysql:5.7.19

启动主服务器mysql

docker run -m 400m -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD="root" -d mysql:5.7.19

进入容器

docker exec -it mysql-master /bin/bash

安装必要组件

apt-get update & apt-get install vim

这两条命令执行不成功的话,可以分开执行,多试几次就可以了。

修改mysql的配置

$ cd /etc/mysql/

$ ls
conf.d  my.cnf  my.cnf.fallback  mysql.cnf  mysql.conf.d

$ cd mysql.conf.d

$ ls
mysqld.cnf

$ vim mysqld.cnf
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

在[mysqld]下面添加以下配置,并保存

log-bin=mysql-bin
server-id=1
log-slave-updates=true

最后结果

[mysqld]
log-bin=mysql-bin
server-id=1
log-slave-updates=true
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

然后进入mysql

mysql -uroot -proot

创建同步的用户

mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
mysql> FLUSH PRIVILEGES;

重启docker

docker restart mysql-master

重新进入容器

docker exec -it mysql-master /bin/bash

进入mysql

mysql -uroot -proot

查看是否server_id配置成功

mysql> SHOW GLOBAL VARIABLES like 'server\_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.01 sec)

可以看到server_id和我们配置的一致

查看master状态

mysql> show master status \G;
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 350
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

刷新日志

mysql> flush logs;

再次查看master状态,可以看到mysql-bin文件变成mysql-bin.000002了,Position也变成154了,记录下这两个值,后面配置slave时需要使用到。

mysql> show master status \G;
*************************** 1. row ***************************
             File: mysql-bin.000002
         Position: 154
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

二、安装slave

启动从服务器mysql

docker run -m 400m -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD="root" -d mysql:5.7.19

进入容器

docker exec -it mysql-slave /bin/bash

安装必要组件

apt-get update & apt-get install vim

修改mysql的配置

在[mysqld]下面添加以下配置,并保存

# server-id要与master不一样
server-id=2

最后结果

[mysqld]
server-id=2
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

重启docker,再次进入容器后进入mysql

mysql -uroot -proot

查看配置是否成功

mysql> SHOW GLOBAL VARIABLES like 'server\_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.00 sec)

开启同步,master_log_filemaster_log_pos是查看master状态时的值,需要填写一致。另外master_host配置的是master的IP,可以在master使用cat /etc/hosts查看。

mysql> stop slave;

mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos=154;

mysql> reset slave;
mysql> start slave;

查看slave状态

mysql> show slave status\G;

image.png

看到以下两个值都为Yes就表示配置成功了。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

异常情况

如果Slave_IO_Running: No 的话,需要看下面的日志,具体问题具体分析。

  • 网络不通

这个可以通过工具来测试,或者在slave中使用mysql -uslave -p123456 -h 172.17.0.2 -P3306来测试是否能连接master。

  • 配置的change master to不正确

可以看到错误日志

Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

重新在master的mysql上flush logs;再设置一下change master to

mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.0000xx', master_log_pos=xxx;

这里设置完需要重新启动一下slave

mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)

mysql> reset slave;
Query OK, 0 rows affected (0.05 sec)

mysql> start slave;
Query OK, 0 rows affected (0.05 sec)

三、其他

docker安装mysql所保存的系统表备份在/usr/share/mysql目录

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22小时前
|
安全 关系型数据库 MySQL
解决centos7.0安装mysql后出现access defind for user@'localhost'的错误
在使用yum 安装完mariadb, mariadb-server, mariadb-devel后
6 0
|
1天前
|
关系型数据库 MySQL 网络安全
Docker部署MySQL,2024网络安全通用流行框架大全
Docker部署MySQL,2024网络安全通用流行框架大全
|
1天前
|
jenkins 持续交付 数据安全/隐私保护
Docker 安装 Jenkins
Jenkins 是一个独立的开源自动化服务器,可用于自动化与构建、测试、交付或部署软件相关的各种任务。
16 1
|
2天前
|
Linux Docker 容器
安装新版本Docker报错container-selinux >= 2:2.74 - 蓝易云
以上步骤应该能够帮助你解决遇到的问题。如果问题仍然存在,你可能需要寻求专业的技术支持。
11 0
|
2天前
|
Ubuntu Linux Docker
window10下安装ubuntu系统以及docker使用
window10下安装ubuntu系统以及docker使用
|
3天前
|
并行计算 Ubuntu Docker
Docker环境Ubuntu20.04安装Python3.10版本
Docker环境Ubuntu20.04安装Python3.10版本
20 0
|
3天前
|
Ubuntu Docker 容器
Ubuntu 22.04.3 LTS_安装Docker
Ubuntu 22.04.3 LTS_安装Docker
40 1
|
3天前
|
应用服务中间件 PHP nginx
安装基于docker的php运行环境
安装基于docker的php运行环境
10 0
|
3天前
|
并行计算 Shell Docker
【环境配置】Ubuntu16.04安装nvidia-docker
【环境配置】Ubuntu16.04安装nvidia-docker
19 2