Docker中Mysql的主从配置

本文详细介绍了如何在Docker中配置MySQL的主从服务,包括创建MySQL容器、备份主库数据到从库以及开启主从配置的步骤。在主从配置中,需要注意版本、字符集的一致性,并正确设置主库的日志文件和位置,以及在从库中配置主库的连接信息以实现数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般来说为了保证Mysql的高可用的高性能,会做分库分表、读写分离、Mysql集群等一些操作,如果时读写分离,那么主从配置就是读写分离的前置,需要有主从的服务,才会有主库负责写,从库负责读的优化。

前言

如果是新创建Mysql服务器会比较简单,直接配置即可,如果是主库中已经有数据了,那么则需要将从库中的数据和主库中保持一致才可以。
特别注意:主库和从库的版本最好保持一致,还有数据库的字符集编码、数据表的字符集编码都要保持一致,否则可能会失败,并且在同步数据会因为编码集不同无法同步数据)。

配置

一、创建mysql容器

  • 创建mysql的从服务器
docker run -d --name mysql-slave \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai \
-v /server/mysql/data:/var/lib/mysql \
-v /server/mysql/conf/my.cnf:/etc/mysql/my.cnf \
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

说明:

-v /server/mysql/data:/var/lib/mysql 将数据挂载到宿主机,防止数据丢失,并挂载配置文件my.cnf

  • 配置从数据库的my.cnf配置文件,实现主从同步
    [mysqld]
    # 当前节点的id,不要重复
    server_id = 2
    # 使用binlog同步数据
    log-bin= mysql-bin
    
    # 可选配置,当前节点是否只读,一般从服务器建议只读
    read-only=1
    
    # 同步时忽略的DB
    replicate-ignore-db=mysql
    replicate-ignore-db=sys
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    
    !includedir /etc/mysql/conf.d/
    !includedir /etc/mysql/mysql.conf.d/
    

二、备份主库数据到从库

如果主数据库也是新建的容器,则无需备份数据进行同步

开启主从同步,则主库和从库的数据须一致,否则无法开启主从配置

  1. 备份主库的数据到sql文件中

    • 进入docker
      docker exec -it mysql-master bash

    • 进入bin目录
      cd /bin

    • 并通过mysql命令备份数据到sql文件
      mysqldump -uroot -p123456 --all-databases > /all_database.sql

    • 复制备份文件到宿主机(这个命令宿主机中执行)
      docker cp mysql-master:/all_database.sql /data/all_database.sql

    • 然后将该文件上传到从库所在的服务器
      使用scp或者使用工具上传

    • 注意:

      如果在同步的过程中,有操作表的行为(除了查询之外的操作,如增删改等),需要先进行锁定数据库再导出和导入(注意,锁定数据库会导致无法操作数据库数据

      • 锁定数据库
        FLUSH TABLES WITH READ LOCK;
      • 等待主从配置完成,解锁数据表
        UNLOCK TABLES;
  2. 将主库备份文件导入到从库中

    • 复制备份sql文件到从库的docker容器中
      docker cp /all_database.sql mysql-slave:/all_database.sql
    • 进入docker容器
      docker exec -it mysql-slave bash
    • 导入该文件到从库中
      cd /bin
      mysql -uroot -p < all_database.sql
    • 链接mysql查看是否导入成功即可

三、Mysql开启主从配置

  1. 主Mysql开启主从配置

    如果已经存在主库,则无需创建主Mysql容器,直接进入Docker容器修改配置即可

    • 进入docker容器(如果my.cnf已经挂载到宿主机,则直接在宿主机修改配置文件)
      docker exec -it mysql-master bash

    • 修改配置
      vi /etc/mysql/my.cnf

      • 增加一下配置
        [mysqld]
        # 指定当前节点的ID,不重复
        server_id = 1
        # 通过binlog同步数据
        log-bin= mysql-bin
        
        # 主节点可写可读
        read-only=0
        
        # 忽略同步的DB,下面的可加 也可以不加,
        replicate-ignore-db=mysql
        replicate-ignore-db=sys
        replicate-ignore-db=information_schema
        replicate-ignore-db=performance_schema
      

      说明:
      - read-only=0 read-only中值为0表示支持可读写、1的话表明仅支持可读
      - server_id 标识服务实例,master和slave值需要保证唯一
      - 下面的eplicate-ignore-db 表示哪些数据库是不需要同步数据

    • 在主Mysql中创建用户提供给从库访问使用

      • 登录mysql命令行
        mysql -uroot -p
      • 创建用户并赋权
        CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
        GRANT REPLICATION SLAVE ON *.* to 'slave'@'%';
    • 重启主库的docker容器
      docker restart mysql-master

    • 进入mysql容器,查看状态,记住FilePosition的值,在Slave中将用到
      show master status\G;

  2. 从库mysql开启主从配置

    • 进入docker容器
      docker exec -it mysql-slave bash

    • 因为创建从库的配置的时候,就已经指定配置了,所以这里不需要再修改

      • 如果从库也是已经给创建好了的mysql, 并没有创建时就指定配置文件,则修改配置文件
        vi /etc/mysql/my.cnf
      • 增加配置
        [mysqld]
        server_id = 2
        log-bin= mysql-bin
        
        read-only=1
        
        replicate-ignore-db=mysql
        replicate-ignore-db=sys
        replicate-ignore-db=information_schema
        replicate-ignore-db=performance_schema
        
    • 进入mysql客户端
      mysql -uroot -p

    • 执行链接主库的命令
      change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=155,master_port=3306;
      说明:

      • master_host 需要查看master所在的mysql的host(就是主库的IP),在mster所在的mysql容器中查看 cat /etc/hosts
      • master_user、master_password 是访问主库的用户名称和密码(刚才创建的用户)
      • master_log_file, master_log_pos 是在主库中查看的bin-log信息(在主库中最后一步操作查看的FilePosition的数据)
      • master_port 指定链接主库的端口
    • 启动从库同步
      start slave;

    • 查看链接状态
      show slave status\G;

      如果 show slave status\G命令结果中出现: Slave_IO_Running: Yes; Slave_SQL_Running: Yes 以上两项都为Yes,那说明没问题了。

    • 如果Slave_IO_Running: No 或者一直显示Connectinng,则可以在从库的容器中连接一下主库,查看是否可以连接到

      • 连接命令
        mysql -uslave -p123456 -h172.17.0.2;

      -h 指定主库的链接的ip,通过命令行尝试是否可以链接

    • 如果配置过程中过,始终无法连接到主库,则可以看这篇文章中是否有注意的问题:主从库无法链接

  3. 验证主从同步
    开启主从同步之后,在主库中操作数据、新建数据库、表等操作,从库都会相应的同步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值