【Docker-compose Mysql 主从】

1.下载镜像
docker search mysql

docker pull mysql:5.7.35
2.安装配置流程
master:
  1. 安装主库 mysql-master
  2. 修改主库配置
  3. 创建用于从库的用户并授权
slave:
  1. 安装从库 mysql-slave
  2. 修改从库配置
  3. 选择主节点
  4. 验证同步功能
3.主库master节点

1.主节点服务器创建mysql文件夹

mkdir mysql

#mysql文件夹下 创建挂载目录 和 docker-compose.yml文件
mkdir volumes

mkdir conf data logs

2.制作docker-compose.yml

version : '3'
services:
  mysql:
    container_name: mysql
    restart: always
    image: mysql:5.7.35
    ports:
      - "3306:3306"
    volumes:
      - ./volumes/conf/mysql:/etc/mysql
      - ./volumes/logs:/logs
      - /var/lib/docker/volumes/data:/var/lib/mysql
    command: [
          'mysqld',
          '--innodb-buffer-pool-size=80M',
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--default-time-zone=+8:00',
          '--lower-case-table-names=0'
        ]
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - mysql-net

networks:
  mysql-net:
    driver: bridge

3.拷贝容器内的配置文件到宿主机

1)启动一个mysql临时容器

docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d  mysql:5.7.35

2)拷贝mysql-temp容器中的配置文件到宿主机

docker cp mysql-temp:/etc/mysql mysql/

3)重命名配置文件my.cnf.fallback

#拷贝出的配置文件虽然存在my.cnf文件但是link链接,容器停止后也会失效 故而直接用备份文件重命名,作为主要配置文件
mv -f my.cnf.fallback my.cnf

4.修改my.cnf配置文件

#在my.cnf配置文件最下方加入下方配置

[mysqld]
log-bin=mysql-bin # 开启 binlog
server-id=1 # 当前server在cluster中的id,必须保证在cluster中唯一
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#备份的数据库(可选)
binlog-do-db=Vasyslink_base
#不备份的数据库 (可选)
#binlog-ignore-db=information_schema  
#binlog-ignore-db=performation_schema
#binlog-ignore-db=sys

5.启动mysql-master

#docker-compose.yml同级目录
docker-compose up -d

6.创建用于从库的用户slave

#进入容器内mysql执行下方命令或使用第三方工具链接数据库后执行下方命令
CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
#刷新权限
FLUSH PRIVILEGES;

7.查看master状态

SHOW MASTER STATUS;
#查看Mater数据有哪些slave
select * from information_schema.processlist as p where p.command = 'Binlog Dump';
4.从库slave节点

1.从节点服务器创建mysql文件夹

mkdir mysql

#mysql文件夹下 创建挂载目录 和 docker-compose.yml文件
mkdir volumes

mkdir conf data logs

2.制作docker-compose.yml

version : '3'
services:
  mysql:
    container_name: mysql-slave
    restart: always
    image: mysql:5.7.35
    ports:
      - "3306:3306"
    volumes:
      - ./volumes/conf/mysql:/etc/mysql
      - ./volumes/logs:/logs
      - ./volumes/data:/var/lib/mysql
    command: [
          'mysqld',
          '--innodb-buffer-pool-size=80M',
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--default-time-zone=+8:00'
        ]
    environment:
      MYSQL_ROOT_PASSWORD: root
networks:
  mysql_mysql-net:
  	#外部网络
    external: true

3.拷贝容器内的配置文件到宿主机

1)启动一个mysql临时容器

docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d  mysql:5.7.35

2)拷贝mysql-temp容器中的配置文件到宿主机

docker cp mysql-temp:/etc/mysql mysql/

3)重命名配置文件my.cnf.fallback

#拷贝出的配置文件虽然存在my.cnf文件但是link链接,容器停止后也会失效 故而直接用备份文件重命名,作为主要配置文件
mv -f my.cnf.fallback my.cnf

4.修改my.cnf配置文件

#在my.cnf配置文件最下方加入下方配置
[mysqld]
server-id=2
relay_log=relay-log
#开启只读 意味着当前的数据库用作读,当然这也只会影响到非root的用户,如果使用root用户操作本库是不会有影响的
read_only=ON
#同步Vasyslink_base库下所有的表,%为通配符
replicate_wild_do_table = Vasyslink_base.%

5.启动mysql-master

#docker-compose.yml同级目录
docker-compose up -d

6.关联master节点,启动从库同步功能

#进入mysql-slave容器
docker exec -it mysql-slave /bin/bash
#进入mysql
mysql -uroot -p
mysql>

#关联master节点
change master to master_host='172.20.2.1', master_user='slave' ,master_password='123456', master_port=3306,master_log_file='mysql-bin.000002', master_log_pos=189733443,master_connect_retry=30;

#启动slave
start slave;
#注意
master_host: 若同服务器下,可以是master节点的容器名称,不同服务器,使用服务器IP
master_log_file: 主节点的bin-log日志文件名称,master主节点的File
master_log_pos: 主节点的bin-long日志文件的位置,master主节点的Position
#master主节点的File和Position 主节点容器中使用show master status;命令可以查看

【Docker-compose Mysql 主从】_第1张图片

7.验证

#mysql-slave容器 mysql内
show slave status;

#均为yes才算成功
#Slave_SQL_Running:yes
#Slave_IO_Running:yes

在master主节点上创建a_master_test表,刷新slave节点从库,出现了对应的表

【Docker-compose Mysql 主从】_第2张图片
【Docker-compose Mysql 主从】_第3张图片

5.出现问题

1)创建从节点报错

#从节点关联主节点时报错
change master to master_host='172.20.2.1', master_user='slave' ,master_password='123456', master_port=3306,master_log_file='mysql-bin.000002', master_log_pos=189733443,master_connect_retry=30;
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
#原因:之前已经创建过从节点,需要停掉已启动,然后重新配置
stop slave;
reset master;

你可能感兴趣的:(Mysql,docker,容器,运维)