默认已经安装好docker容器
系统:centos7.9
一、关闭selinux
#关闭selinux
vim /etc/selinux/config
SELINUX=disabled
二、创建mysql专用网络
#查看所有网络
docker network ls
#创建mysql网络
docker network mysqlNet
#查看linux中已经创建的docker0的mysql网络
ifconfig
#查看已经创建好的mysql网络详细信息
docker inspect mysqlNet
三、创建mysql挂载卷(用来持久化数据)
#在linux根目录下创建data目录
cd /
mkdir /data
#创建mysql主节点挂载卷目录
mkdir -p /data/mysqlmaster
cd /data/mysqlmaster
mkdir config #用来创建配置文件
mkdir data #用来存放数据
mkdir init #用来存放脚本
-----------------------------------------------------------------------------------------
#创建mysql从节点挂载卷目录
mkdir -p /data/mysqlslave
cd /data/mysqlslave
mkdir config #用来创建配置文件
mkdir data #用来存放数据
mkdir init #用来存放脚本
四、创建mysql的配置文件
#进入config目录下创建mysql主节点配置文件
cd /data/mysqlmaster/config
vim my.cnf
---------------------------------------------------------------------------------------
[mysqld]
# 主数据库端ID号
server_id = 101
# # 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# # 开启二进制日志
log-bin = mysql-bin
# # 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# # 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# # 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# # 将函数复制到slave
log_bin_trust_function_creators = 1
# # 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# # 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# # log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
--------------------------------------------------------------------------------------
#进入config目录下创建mysql从节点配置文件
cd /data/mysqlslave/config
vim my.cnf
---------------------------------------------------------------------------------------
[mysqld]
# 从数据库端ID号(重点)
server_id = 102
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave1-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1
五、docker-compose文件(重要,一定要注意格式)
[yml格式调整] https://www.yamllint.com/
cd /data
vim docker-compose.yml
---------------------------------------------------------------------------------------
version: "3"
services:
mysql-master:
image: mysql:5.7 #镜像
container_name: mysqlmaster
ports:
- "3307:3306" #映射3307为外部访问端口
environment:
TZ: Asia/Shanghai #调整时区
MYSQL_ROOT_PASSWORD: root #设置登陆密码
MASTER_SYNC_USER: "sync_admin" #设置脚本中定义的用于同步的账号
MASTER_SYNC_PASSWORD: "123456" #设置脚本中定义的用于同步的密码
ALLOW_HOST: "172.19.%.%*" #允许同步账号的host地址
volumes:
- "/data/mysql/config:/etc/mysql/conf.d"
- "/data/mysql/config/my.cnf:/etc/mysql/my.cnf"
- "/data/mysql/data:/var/lib/mysql"
- "/data/mysql/init:/etc/mysql/docker-entrypoint-initdb.d"
networks:
mysqlNet:
ipv4_address: 172.19.0.3 #固定ip,因为从库在连接master的时候,需要设置host
mysql-slave:
image: mysql:5.7
container_name: mysqlslave
ports:
- "3308:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
SLAVE_SYNC_USER: "sync_admin"
SLAVE_SYNC_PASSWORD: "123456"
MASTER_HOST: "172.19.0.1"
volumes:
- "/data/mysql1/config:/etc/mysql/conf.d"
- "/data/mysql1/config/my.cnf:/etc/mysql/my.cnf"
- "/data/mysql1/data:/var/lib/mysql"
- "/data/mysql1/init:/etc/mysql/docker-entrypoint-initdb.d"
networks:
mysqlNet:
ipv4_address: 172.19.0.4
networks:
mysqlNet:
external: true
ps:如果在docker-compose文件中设置external为true,那么使用docker-compose up -d来启动服务时,首先docker引擎会查找external声明的网络,找到后进行连接
六、启动docker-compose
docker-compose up -d #up是启动,-d是后台
docker ps #查看启动后的容器,可以看到有mysqlmaster和mysqlslave已经运行
#关闭或者放开firewalld防火墙即可通过Navicat连接两个节点
七、分别登录主节点和从节点(配置主从关系)
#主从节点都一样的方式进入
docker exec -it mysqlmaster bash #exec 进入 bash命令行
show variables like '%server_id%'; #查看id是否正常如下图:
------------------------------------------------------------------------------------------
show master status; #查看主节点状态
show slave status \G; #查看从节点状态,
ps:查看从节点时IO和SQL线程都是NO:Slave_IO_Running: No、Slave_SQL_Running: No
------------------------------------------------------------------------------------------
#在主节点上创建账户:slave,并赋予部分权限,密码为123456a?
grant replication slave,replication client on *.* to 'slave'@'%' identified by "123456a?";
flush privileges; #刷新
------------------------------------------------------------------------------------------
#在slave从节点上加入主节点
change master to master_host='192.168.86.144',master_user='slave',master_password='123456a?',master_port=3307,master_log_file='mysql-bin.000001',master_log_pos=16258,master_connect_retry=30;
ps:这里master_host必须是宿主机ip地址,使用mysql主节点内网ip不好使,
#启动slave
start slave;
#查看主从状态
show slave status \G;
#查看主从连接的网络信息
docker inspect mysqlNet
八、查看日志
#查看主节点日志 -f 实时打印
docker logs -f mysqlmaster
附图: