docker-compose搭建mysql一主一从

默认已经安装好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

附图:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值