记录一下自己在CentOS7中安装Docker,并实现MySQL主从复制的过程。
网上查了很多,配置过多次,总是会出现重启之后主从复制就失效的问题,又或者根本没成。
搜索了很多,现在成功了,记录一下。
那我们就开始吧!
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
安装yum工具:
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
更新本地镜像源:
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' \
/etc/yum.repos.d/docker-ce.repo
yum makecache fast
安装Docker:
yum install -y docker-ce
启动Docker之前需要关闭防火墙:
systemctl stop firewalld
为了以后方便,直接给它禁了得了,反正我是虚拟机(doge),禁用防火墙:
systemctl disable firewalld
启用Docker:
systemctl start docker
在运行容器之前,创建一个新的网络连接,用来固定mysql容器的ip。防止其他容器启动之后,占用ip,导致主mysql的ip被迫发生变化。
docker network create --subnet=172.28.197.0/16 mysql_net
创建主库:--p:3358是这个容器暴露在宿主机中的端口,3357是容器内部端口。--name:容器的名称。--net:指定网络连接,就是上面创建那个。--ip:指定ip。-v:宿主机目录直接挂载到容器。-e:设置环境变量的MySQL密码为123。-d:代表让容器后台运行。
docker run -p 3358:3357 \
--name mysql5-master \
--net mysql_net \
--ip 172.28.197.58 \
-v /db/mysql/5/master/log:/var/log/mysql \
-v /db/mysql/5/master/data:/var/lib/mysql \
-v /db/mysql/5/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql:5.7
创建从库:--p:3359是这个容器暴露在宿主机中的端口,3357是容器内部端口。--name:容器的名称。--net:指定网络连接,就是上面创建那个。--ip:指定ip。-v:宿主机目录直接挂载到容器。-e:设置环境变量的MySQL密码为123。-d:代表让容器后台运行。
docker run -p 3359:3357 \
--name mysql5-slave1 \
--net mysql_net \
--ip 172.28.197.59 \
-v /db/mysql/5/slave1/log:/var/log/mysql \
-v /db/mysql/5/slave1/data:/var/lib/mysql \
-v /db/mysql/5/slave1/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql:5.7
编辑主库配置文件my.cnf,将横线之间的复制进去。
当然,也可以用FinalShell等可视化工具。创建好文件之后,直接拖到这个文件夹。
vim /db/mysql/5/master/conf/my.cnf
[mysqld]
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
## 同一局域网内注意要唯一
server-id=58
## 开启二进制日志功能
log-bin=mysql-bin
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1032,1062
# 设置3357端口
port=3357
# 创建新表时将使用的默认存储引擎
default_storage_engine=innodb
innodb_buffer_pool_size=1000M
innodb_log_file_size=50M
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
# 允许最大连接数
max_connections=20
# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysql.server]
default-character-set=utf8mb4
[mysql_safe]
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port = 3357
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port = 3357
default-character-set=utf8mb4
重启主库:
docker restart mysql5-master
进入主库:
docker exec -it mysql5-master bash
进入MySQL命令行:
mysql -uroot -p123
创建一个用于复制的用户:
create user 'slave'@'%' identified with mysql_native_password by '123';
授予用户权限:
grant replication slave on *.* to 'slave'@'%';
刷新:
flush privileges;
查看并记录二进制文件名与位置,也就是File和Position:
show master status;
编辑从库配置文件my.cnf,将横线之间的复制进去。
当然,也可以用FinalShell等可视化工具。创建好文件之后,直接拖到这个文件夹。
vim /db/mysql/5/slave1/conf/my.cnf
[mysqld]
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
## 同一局域网内注意要唯一
server-id=59
## 开启二进制日志功能
log-bin=mysql-bin
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1032,1062
# 设置3357端口
port=3357
# 创建新表时将使用的默认存储引擎
default_storage_engine=innodb
innodb_buffer_pool_size=1000M
innodb_log_file_size=50M
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
# 允许最大连接数
max_connections=20
# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysql.server]
default-character-set=utf8mb4
[mysql_safe]
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port = 3357
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port = 3357
default-character-set=utf8mb4
重启从库:
docker restart mysql5-slave1
进入从库:
docker exec -it mysql5-slave1 bash
进入MySQL命令行:
mysql -uroot -p123
设置主从复制的信息,从上至下分别是:
- 主库容器的ip地址,这里在创建容器的时候已经固定。
- 主库复制用户的用户名,这里是进入主库容器时,创建用户的用户名。
- 主库复制用户的密码,这里是进入主库容器时,创建用户的密码。
- 主库的端口号,配置主库配置文件的时候,已经配置了端口号。
- 主库的二进制文件名,进入主库命令行时,show master status; 的结果。(填自己的)
- 主库的二进制文件位置,进入主库命令行时,show master status; 的结果。(填自己的)
- 连接失败时,多少秒后,进行重试,本项目为30。
change master to
master_host='172.28.197.58',
master_user='slave',
master_password='123',
master_port=3357,
master_log_file='mysql-bin.000003',
master_log_pos=749,
master_connect_retry=30;
开启主从复制:
start slave;
查看主从复制状态:(这条语句需要在MySQL命令行发送才有效)
show slave status \G;
框住的两个是Yes,就代表配置主从复制成功,重启Docker依旧生效。
如果,有时常进入MySQL命令行的需要,又觉得MySQL比较多。可以看我另一篇文章,整一个bat来启动MySQL命令行。