【Docker】MySQL高可用

本文介绍了MySQL如何通过主从复制实现高可用性,涉及二进制日志的使用、主库与从库的配置,以及如何进一步扩展到主主互备模式。同时提到了与GaleraCluster、MySQLGroupReplication和MyCat等解决方案的关联。
摘要由CSDN通过智能技术生成

MySQL高可用性是确保数据库系统在面临故障或计划维护时仍然可用的重要因素之一。

原理

在这里插入图片描述

  1. master将数据改变记录到二进制日志(binary log)中
  2. slave将master的binary log events拷贝到它的中继日志(relay log)
  3. slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)

注意:

  1. 主DB server和从DB server数据库的版本一致
  2. 主DB server和从DB server数据库数据一致
  3. 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

主从复制

主从复制是一种基本的高可用性方案。它可以用于将读负载分散到多个从数据库,并在主数据库发生故障时提供故障切换。

ps:主从复制是一个单向复制过程,只有主库向从库传输数据。

搭建

前置准备

  1. 准备my.cnf数据库配置文件,酌情修改
    [mysqld]
    # 基本设置
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    user=mysql
    
    # 长连接设置
    wait_timeout=600
    interactive_timeout=600
    
    # 缓冲池设置
    key_buffer_size=64M
    innodb_buffer_pool_size=512M
    innodb_log_file_size=64M
    
    # 字符集设置
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    
    # 服务器 ID,如果是主从复制,需要设置不同的值
    server-id=1
    
    # 开启二进制日志,用于主从复制
    log-bin=mysql-bin
    binlog_format=row
    
    # 单个数据库包的最大大小
    max_allowed_packet = 1024M
    
    
    [client]
    default-character-set=utf8mb4
    
    [mysql]
    default-character-set=utf8mb4
    
  2. docker-compose.yml,酌情修改,且network:mysql已提前创建
    version: '2'
    services:
      mysql:
        image: mysql:latest
        container_name: master01
        environment:
          MYSQL_ROOT_PASSWORD: "123456"
        volumes:
          - $PWD/config:/etc/mysql/conf.d
        ports:
          - "13306:3306"
        command: >
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
          --default-authentication-plugin=mysql_native_password
        networks:
          - mysql
          
    networks:
      mysql:
        external: true
    
  3. 相关目录结构
    在这里插入图片描述

主库

  1. 创建master01并观察相关启动日志
    在这里插入图片描述
  2. 工具连接测试,并检查log_bin是否开启
    在这里插入图片描述
  3. 创建同步用户
    在这里插入图片描述
     create user 'slave'@'%' identified by '123456';
    
     GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
    
     ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    
     flush privileges;
    
  4. 查看master状态
    在这里插入图片描述

从库

  1. 配置文件稍作修改

    # 中继日志名称
    relay_log=wnhz-relay-bin
    
  2. 启动slave01,并观察启动日志

    在这里插入图片描述

  3. 从库设置和主库连接

    CHANGE MASTER TO master_host = 'master01',
    master_user = 'slave',
    master_password = '123456',
    MASTER_LOG_FILE = 'mysql-bin.000003',
    MASTER_LOG_POS = 1123;
    

    注意和主库的对应关系:
    在这里插入图片描述

  4. 开启slave

    start slave;

  5. 查看slave日志

    在这里插入图片描述

  6. 查看slave状态 在这里插入图片描述

  7. 验证:master建库,刷新slave,数据得到同步体现
    在这里插入图片描述

主主互备

两个MySQL服务器都充当主服务器和从服务器两个角色。这意味着两个服务器之间可以相互写入和读取数据。当一个服务器写入数据时,它将数据同步到另一个服务器,反之亦然。

真正意义上的主主互备还需要处理一些额外的问题和配置:像是心跳检测,需要一种机制来监测主库的可用性。又或者是故障转移,某个主库监测到不可用时,需要自动切换到另一个主库,以确保系统的高可用性。又或者是冲突解决方案,当两个主库同时接收写入请求时,可能会导致数据冲突。需要一种机制来解决这些冲突,确保数据的一致性等。

本文只从数据库层面构建所谓的主主互备,具体选择如Galera Cluster或MySQL Group Replication又或者是MyCat中间件去解决上述问题,并不做具体演示。

搭建

上文中,搭建了主从复制,实现了主库增删改,从库数据自动同步的效果。实现主主互备,当在此基础上,实现所谓的从库中增删改,主库跟着同步的效果。此时,两个数据库对于自己来说,都是主库(负责接收写操作),对于对方来说,都是对方的从库(负责接收对方主库的数据更改)。

  1. slave库中创建用于同步的账号
    在这里插入图片描述
  2. master库设置和slave库的连接
    在这里插入图片描述
  3. 修改slave库中的信息可以看到master库中也做了更改
    在这里插入图片描述

ps:实际上的主主互备一般都与主从复制结合使用,即:有A、B、C、D、E、F 六个数据库,其中AB为主主互备,ACD为主从复制(A主,C、D从),BEF也为主从复制(B主,E、F从)
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总在寒冷清秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值