docker搭建MySQL主从复制
0 鸣谢
(老规矩,楼顶布置沙发,大神留坐。感谢知识分享…)
1、本文主要参考《centos7安装Docker详细步骤(无坑版教程)》安装docker环境。
2、docker学习过程中主要参考《docker 常用命令大全》,《Docker与VMware的区别》。
3、docker安装MySQL过程参考《使用docker安装mysql》。
1 基础环境说明
本方案采用下表基础环境构建:
环境 | 软件 | 下载地址 | 安装方法 |
---|---|---|---|
实验机环境 | Windows11 | 略 | 略 |
虚拟机环境 | Vmware 17 For Windows | 下载链接 | 操作简单,本文不展开。可参考站内成熟方案。(点击跳转) |
虚拟机操作系统 | CentOS-8.5.2111-x86_64-dvd1.iso | 阿里镜像站 | 操作简单,本文不展开。可参考站内成熟方案。点击跳转 |
docker | 最新版本 | 在线下载安装 | 文中有展示。 |
MySQL | MySQL 8.0 | docker拉取的镜像 | 文中有具体展示。 |
相关软件 | securityCRT | 自行百度 | 主要使命令操作更加方便。未使用过的同学,自行学习,教程很多。如有疑问,留言回答。 |
2 CentOS 上安装 docker
至此处,应已完成如下工作:
- 拥有windows实验机环境。
- 部署成功Vmware17。(Vmware16应该也可以,其他版本自行试用。)
- 已完成安装CentOS 8.0。(CentOS7.0应该也可以。其他版本自行试用。)
2.1 linux内核版本
查看内核版本:
uname -r
docker官方建议,内核版本3.10以上。
2.2 更新yum包
这个命令不是必须执行的,一般最新的系统无需更新。
yum -y update
注意 :
yum -y update:升级所有包同时也升级软件和系统内核;
yum -y upgrade:只升级所有包,不升级软件和系统内核
2.3 卸载旧版本的docker
如已安装docker,则需要将旧版本卸载。新安装无需执行。
yum remove docker docker-common docker-selinux docker-engine
2.4 安装软件包
2.4.1 安装yum-util、device-mapper-persistent-data、lvm2
yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖。
yum install -y yum-utils device-mapper-persistent-data lvm2
2.4.2 遇到的问题
报错: Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist
分析原因1: 可能的情况便是网络连接问题。检查是否可以连接外部网络,可以使用 ping baidu.com 查看是否有丢包情况。如果丢包,则进一步检查网络连接是否正常。该步骤需要安装ping软件。
解决:
1、安装ping软件。参考《docker 笔记》
分析原因2: CentOS 已经停止维护的问题。2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org。
解决:
1、进入到 yum 的 repos 目录
cd /etc/yum.repos.d/
2、修改 centos 文件内容
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
3、生成缓存更新(第一次更新,速度稍微有点慢,耐心等待两分钟左右)
yum makecache
4、运行 yum update 并重新安装 vim
yum update -y
yum -y install vim
2.5 设置yum源(镜像仓库)
两个yum源都可以,但一般选择第二个阿里云,速度快。
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
2.6 更新yum软件包的索引
CentOS 7
yum makecache fast
CentOS 8
yum makecache
注意:
因为CentOS 8没有fast这个命令 需要去掉,不然会出现以下提示!
yum makecache: error: argument timer: invalid choice: ‘fast’ (choose from ‘timer’)
2.7 选择docker版本并安装
1、列出版本
yum list docker-ce --showduplicates | sort -r
2、以下为各种安装方式。
选择版本安装:yum install docker-ce-版本号
yum -y install docker-ce-18.03.1.ce
安装docker和引擎
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
安装稳定版(使用该命令即可)
sudo yum install -y docker-ce
3、解释
名词 | 说明 |
---|---|
containerd.io docker-compose-plugin | 管理多个docker容器的工具,其中管理包括:下载镜像、创建容器和删除容器。 |
containerd.io | 守护进程 containerd。 它在 docker 包上独立工作,并且是 docker 包所必需的。 |
docker-ce-cli | docker 引擎的命令行界面,社区版 |
docker-ce | docker 引擎,社区版。 需要 docker-ce-cli。 |
2.8 启动和测试docker
操作 | 命令 | 说明 |
---|---|---|
启动 | systemctl start docker | |
测试 | systemctl start docker | |
重启容器 | systemctl restart docker service docker restart | |
关闭容器 | docker service docker stop docker systemctl stop docker | |
设置开机自启动 | systemctl enable docker.service | |
查看版本 | docker version docker -v |
验证:运行hello容器服务
docker run hello-world
出现 hello from Docker!代表安装成功
3 docker 安装MySQL
以下操作均在启动docker容器后进行。
3.1 拉取MySQL镜像(主从只做一次)
操作 | 命令 |
---|---|
拉取最新的mysql镜像 | docker pull mysql:latest |
拉取版本号为XXX的mysql镜像 | docker pull mysql:XXX |
检查拉取的镜像 | docker images |
拉取图像说明 | ![]() |
3.2 主服务器搭建
3.2.1 创建MySQL数据卷目录
// 主服务器容器卷创建
mkdir -p /mydata/mysql-master/conf
3.2.2 创建容器并运行
// 命令1 不推荐使用 记录bug作用
docker run --privileged=true -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v/mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -v /mydata/mysql-master/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --restart=unless-stopped -d mysql
// 命令2 只是比命令3多挂了个数据卷 推荐使用
docker run -d -p 3307:3306 --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -v /mydata/mysql-master/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql
// 命令3 推荐使用
docker run -d -p 3307:3306 --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql
说明:
–privileged=true 容器内的 root 拥有真正的 root 权限
-v /mydata/mysql-master/conf:/etc/mysql 配置文件
-v /mydata/mysql-master/log:/var/log/mysql 日志目录
-v/mydata/mysql-master/data:/var/lib/mysql 数据存储目录
-e MYSQL_ROOT_PASSWORD=123456
这个可加可不加 --restart=unless-stopped 容器挂载后自动重启
MYSQL_ROOT_PASSWORD=123456 指定root密码
3.2.3 配置文件 my.cnf
cd /mydata/mysql-master/conf
touch my.cnf
文件内容如下(可原样不动复制):
[client]
default_character_set=utf8
[mysql]
default-character-set=utf8mb4
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## 设置编码
collation_server = utf8_general_ci
character_set_server = utf8
##解决 mysql 2059 错误,没有此问题的不加
default_authentication_plugin=mysql_native_password
3.2.4 重启容器
docker restart mysql-master
3.2.5 检查是否启动成功
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d98b2124d54 mysql:8.0.25 "docker-entrypoint.s…" 23 hours ago Exited (0) 3 minutes ago mysql-slave
3.2.6 容器内配置
1 进入容器
docker exec -it mysql-master /bin/bash
2 进入mysql
mysql -uroot -p123456
3、若密码失效,则重置密码。
4、远程连接工具连接
use mysql;
update user set host='%' where user='root';
Grant all privileges on root.* to 'root'@'%'; //执行两次
alter user root identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;
show variables like 'character%'; // 查看字符编码
5、创建从服务器连接用户
// 创建用户名为 slave,后面从库需要连接到这个用户上,by 后面的密码和数据库密码没有关系
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
// 授权表示可以从任意 ip 使用此用户名和密码连接到主数据库
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%';
// 刷新配置
flush privileges;
// 查看日志文件 这个可以不执行
show master status;
3.3 从服务器搭建
3.3.1 创建MySQL数据卷目录
// 主服务器容器卷创建
mkdir -p /mydata/mysql-slave/conf
3.3.1 创建容器并运行
docker run -d -p 3308:3306 --privileged=true -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql/conf.d -v /mydata/mysql-slave/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql
3.3.2 配置文件 my.cnf
cd /mydata/mysql-slave/conf
touch my.cnf
文件内容如下(可原样不动复制):
[client]
default_character_set=utf8
[mysql]
default-character-set=utf8mb4
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
## 设置编码
collation_server = utf8_general_ci
character_set_server = utf8
##解决 mysql 2059 错误,没有此问题的不加
default_authentication_plugin=mysql_native_password
3.3.4 重启容器
docker restart mysql-slave
3.4 配置主从复制
3.4.1 主服务器操作:查看主从复制状态
进入主服务器查看主从复制状态
docker exec -it mysql-master /bin/bash
mysql -uroot -p123456
show master status;
3.4.2 主服务器操作:查看IP地址
1、容器内查看。
docker exec -it mysql-master /bin/bash
cat /etc/hosts
2、容器外查看
docker ps -a
docker inspect 容器名
3.4.3 主服务器操作:查看端口
docker exec -it mysql-master /bin/bash
mysql -uroot -p123456
show global variables like 'port';
3.4.4 从服务器操作:配置主从连接关系
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
change master to master_host='主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='主机信息获取', master_log_pos= 820, master_connect_retry=30;
主机IP,为master主服务器的容器IP地址,图中标志③。
master_log_file,为master主服务器容器状态的值,图中标志①。
master_log_pos,为master主服务器容器状态的值,图中标志②。
master_port,为mater主服务器的容器内部数据库端口,图中标志④。
注意: 端口不用容器映射端口。如创建容器时,语句为
docker run -d -p 3308:3306
,则3308为映射地址,取3306。
3.5 开启主从复制
3.5.1 从服务器操作:查看从数据库状态
show slave status \G;
未启动时,红框状态未NO。
3.5.2 从服务器操作:启动主从复制
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
// 开启主从同步
start slave;
其他相关命令
//停止主从同步
stop slave;
3.5.3从服务器操作:查看从数据库状态
show slave status \G;
状态正常时,为yes。
3.6 主从复制验证
3.6.1 主数据库操作
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
create database testdb;
3.6.2 从数据库操作
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
show databases;
存在testdb数据库即主从复制正常。可以,建立表进行同步。
4 docker 迁移
5 一些问题的说明
5.1 关于操作环境
CentOS安装docker,docker安装mysql。其操作环境共有3层。操作时,应清楚位于哪层环境。
操作层级 | 命令 | 退出 | 图示 |
---|---|---|---|
操作系统层 | 1、可操作docker建立、删除、重启;查询容器信息、进入容器等。 2、可以正常使用操作系统命令。 | 无 | ![]() |
容器内部操作 | 1、可以执行连接数据库等操作。 2、可以给容器安装插件,如ping软件。 | 从容器退出到操作系统,使用命令:exit | ![]() |
数据库内部操作 | 1、可以执行数据库增删改查。 2、可以建立连接用户并赋权。 | 命令:quit 或 exit | ![]() |
5.2 关于防火墙
使用centos搭建主从复制,可能会存在操作系统的防火墙阻碍。故,对防火墙进行操作。
5.2.1 放开特定IP地址
stop slave; // 停止主从连接
firewall-cmd --reload // 重启防火墙
firewall-cmd --zone=public --add-port=3070/tcp --permanent // 放行防火墙3070端口
firewall-cmd --zone=public --list-ports // 查看防火墙所有开放的端口
5.2.2 关闭防火墙
#检查防火墙状态
systemctl status firewalld.service
#启动防火墙状态
systemctl start firewalld.service
#停止防火墙状态
systemctl stop firewalld.service
#关闭防火墙开机自启动
systemctl disable firewalld.service
启动状态图示。
关闭状态图示。