zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

【Docker】MySQL 主从配置(一主一从)

2023-09-27 14:22:51 时间

※ 主从同步

主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)

复制异步进行,从服务器无需一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。

使用主从同步的好处:

  • 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
  • 提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
  • 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能

1. Docker 安装 MySQL

作为准备阶段,我们需要下载 MySQL 镜像,并准备主从两个容器

仓库中查询MySQL

输入docker search mysql 在docker 镜像仓库中查询 MySQL镜像
仓库中查询MySQL

拉取 MySQL 镜像

随后使用docker pull docker.io/mysql命令下载该版本(即“拉取”镜像)

下载完成后,使用docker image ls命令查看镜像列表:
查看镜像列表
运行 主(master)容器

主从容器必须设置不同的对外端口,这里我们规定,主容器的端口号设置为3310,从容器的端口号设置为3311

docker run -itd --name=mysql_master -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123 docker.io/mysql

运行 主(master)容器

使用docker ps命令查询 主(master)容器 是否启动:
查询启动

运行 从(slave)容器
设置从容器的端口号为3311
运行 从(slave)容器

查询 从(slave)容器 是否启动:
查询 从(slave)容器 是否启动

使用navicat测试是否连通
测试主容器
测试从容器
至此,容器准备工作完成!

【注】连接失败 可能原因:防火墙未开放目标端口号

2. 配置 主(master)容器

配置阶段:配置 主(master)容器

进入 master 容器内

使用如下命令进入 master容器内:

docker exec -it mysql_master /bin/bash

进入容器
进入 /etc/mysql 文件夹
进入 /etc/mysql 文件夹
使用 vi/vim 编辑 my.cnf 文件
尝试编辑
vi/vim 没有安装,解决步骤:

  • 执行 apt-get update 做准备工作:
    apt-get update

  • 执行 apt-get install vim 安装vim
    apt-get install vim
    继续操作

  • 使用vim my.conf进行编辑 my.cnf
    打开文件

  • 在my.cnf添加 唯一ID 和 必要信息(使用“i” 键进入编辑模式,结束后Esc + :wq 保存修改)
    添加信息

  • 重新启动容器:使配置生效
    重新启动容器

创建专用账户(slave)进行主从同步

  • 使用root账户登入MySQL:
    root账户登入MySQL
  • 创建专用同步账户(slave):
    创建专用同步账户

3. 配置 从(slave)容器

配置阶段:配置 从(slave)容器

进入 slave 容器内
进入 slave 容器内
进入 /etc/mysql 文件夹
进入 /etc/mysql 文件夹
使用 vi/vim 编辑 my.cnf 文件

  • 准备工作:
    apt-get update
    apt-get install vim
  • 编辑文件:
    添加信息
server-id=201
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin

4. 主(master)从(slave)复制

关联阶段:主从复制

查看master状态

  • 进入master容器:
    进入master容器
  • 显示主服务器状态:
    显示状态

在slave中执行命令

  • 使用命令 docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql_master 查询master容器的独立IP
    查询master容器的独立IP
  • 进入slave容器,执行SQL语句:
    进入slave容器
    执行SQL语句
master_host:Master库的地址,容器独立ip
master_port:Master库的端口号,容器端口号(默认3306)
master_user:用于数据同步的用户
master_password:用于数据同步用户的密码
MASTER_LOG_FILE:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
MASTER_LOG_POS:从哪个 Position 开始读,即上文中提到的 Position 字段的值
  • 开启主从复制过程
    开启主从复制过程
  • 配置成功:
    配置成功
show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.17.0.2
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 879
               Relay_Log_File: edu-mysql-relay-bin.000002
                Relay_Log_Pos: 324
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1416
              Relay_Log_Space: 537
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 200
                  Master_UUID: a699d8b9-f9dc-11eb-a124-0242ac110002
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified

可能遇到的错误:
错误截图
查看主库:

USE mysql;
SELECT plugin FROM user WHERE user = 'slave';

查询结果
原来是主库 slave用户的 plugin 是 caching_sha2_password 导致连接不上,修改为mysql_native_password 即可解决。

ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

执行SQL
如果还是出现错误,可以尝试删除 salve 用户、抛弃权限,重新建立即可:
问题描述

  • 删除用户命令:
DELETE FROM user WHERE user='用户名';
flush privileges;
DROP user 用户名@'%';

在图形化界面navicat中测试

建立数据库 test_db 进行测试:
创建数据库
同步完成
至此,MySQL 主从配置完成!