基于 Docker 的 MySQL GTID 主从复制与测试

本文详细介绍了如何使用Docker部署MySQL的双主双从架构,包括环境规划、服务部署、主从配置、压力测试(sysbench)以及主从复制延迟的检查。同时,讨论了主从复制的异步、全同步和半同步模式,以及GTID与BinaryLog在复制中的作用。
摘要由CSDN通过智能技术生成

ms-mysql



一、规划

1.1 基础环境

1、服务器环境

  • Linux:CentOS 7.9

  • Docker:23.0.4

  • Docker-compose:2.7.0

  • Sysbench:1.0.20

2、服务/应用

  • MySQL:8.0.33

1.2 应用架构

复制:双主双从,实现主从复制、主主复制;

读写:master 实例具备读写权限,slave 实例具备只读权限

M-S

1.3 路径规划

数据持久化管理。

.
├── docker-compose.yml
├── master1
│   ├── conf
│   ├── data
│   └── logs
├── master2
│   ├── conf
│   ├── data
│   └── logs
├── slave1
│   ├── conf
│   ├── data
│   └── logs
└── slave2
    ├── conf
    ├── data
    └── logs

image-20230429181901803

二、部署

2.1 服务部署

1、安装 docker 服务

curl https://csdn-rab.oss-cn-chengdu.aliyuncs.com/shellscript/docker_install.sh | bash

2、安装 docker-compse 编排工具

curl https://rab-package.oss-cn-hangzhou.aliyuncs.com/binary/el7/docker-compose/2.7.0/docker-compose-linux-x86_64
chmod +x docker-compose-linux-x86_64 && mv docker-compose-linux-x86_64 /usr/bin/docker-compose

3、安装 MySQL 服务

使用 Docker-compose 进行编排。

  • 创建持久化目录

    mkdir -p /root/mysql_install/{master1/{data,logs,conf},master2/{data,logs,conf},slave1/{data,logs,conf},slave2/{data,logs,conf}}
    
  • 修改权限

    chmod -R 777 /root/mysql_install/{master1/{data,logs},master2/{data,logs},slave1/{data,logs},slave2/{data,logs}}
    

    临时测试-删除

    rm -rf /root/mysql_install/{master1/{data/*,logs/*},master2/{data/*,logs/*},slave1/{data/*,logs/*},slave2/{data/*,logs/*}}
    
  • 分别上传配置文件(my.cnf)至 conf 目录下

    Master1 配置文件(server-id 为1,其他不变)

    [client]
    port = 3306
    
    [mysqld]
    # innodb_force_recovery = 6  # 数据恢复参数,在数据表结构异常时使用(缺省值为0)
    port = 3306
    datadir         = /var/lib/mysql
    log-error       = /var/log/mysql/error.log
    innodb-data-file-path = /var/lib/mysql/ibdata1:1G;/var/lib/mysql/ibdata2:1G;/var/lib/mysql/ibdata3:1G
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links = 0
    max_connections = 2000
    max_user_connections = 1900
    max_connect_errors = 100000
    max_allowed_packet = 50M
    lower_case_table_names = 1
    default-time_zone = '+8:00'
    
    # 1055异常处理
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    
    # GTID及二进制日志
    server-id = 1
    gtid_mode = on
    enforce_gtid_consistency = on
    master-info-repository = TABLE
    relay-log-info-repository = TABLE
    # 设置binlog日志
    log-bin = /var/log/mysql/mysql-binlog
    # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M  
    # 主从复制的格式(mixed,statement,row,默认格式是statement)官方推荐在使用GTID情况下,基于行复制
    binlog_format=row
    # 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7
    
    # 不需要同步的数据库
    binlog-ignore-db = mysql
    binlog_ignore_db = information_schema
    binlog_ignore_db = performation_schema
    binlog_ignore_db = sys
    
    # mysql_native_password
    default_authentication_plugin = 'mysql_native_password'
    
    [mysqld]
    skip-name-resolve
    

    Master2 配置文件(server-id 为2,其他不变)

    [client]
    port = 3306
    
    [mysqld]
    # innodb_force_recovery = 6  # 数据恢复参数,在数据表结构异常时使用(缺省值为0)
    port = 3306
    datadir         = /var/lib/mysql
    log-error       = /var/log/mysql/error.log
    innodb-data-file-path = /var/lib/mysql/ibdata1:1G;/var/lib/mysql/ibdata2:1G;/var/lib/mysql/ibdata3:1G
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links = 0
    max_connections = 2000
    max_user_connections = 1900
    max_connect_errors = 100000
    max_allowed_packet = 50M
    lower_case_table_names = 1
    default-time_zone = '+8:00'
    
    # 1055异常处理
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    
    # GTID及二进制日志
    server-id = 2
    gtid_mode = on
    enforce_gtid_consistency = on
    master-info-repository = TABLE
    relay-log-info-repository = TABLE
    # 设置binlog日志
    log-bin = /var/log/mysql/mysql-binlog
    # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M  
    # 主从复制的格式(mixed,statement,row,默认格式是statement)官方推荐在使用GTID情况下,基于行复制
    binlog_format=row
    # 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7
    
    # 不需要同步的数据库
    binlog-ignore-db = mysql
    binlog_ignore_db = information_schema
    binlog_ignore_db = performation_schema
    binlog_ignore_db = sys
    
    # mysql_native_password
    default_authentication_plugin = 'mysql_native_password'
    
    [mysqld]
    skip-name-resolve
    

    Slave1 配置文件(server-id 为3,其他不变)

    [client]
    port = 3306
    
    [mysqld]
    # innodb_force_recovery = 6  # 数据恢复参数,在数据表结构异常时使用(缺省值为0)
    port = 3306
    datadir         = /var/lib/mysql
    log-error       = /var/log/mysql/error.log
    innodb-data-file-path = /var/lib/mysql/ibdata1:1G;/var/lib/mysql/ibdata2:1G;/var/lib/mysql/ibdata3:1G
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links = 0
    max_connections = 2000
    max_user_connections = 1900
    max_connect_errors = 100000
    max_allowed_packet = 50M
    lower_case_table_names = 1
    default-time_zone = '+8:00'
    
    # 1055异常处理
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    
    # GTID及二进制日志
    server-id = 3
    gtid_mode = on
    enforce_gtid_consistency = on
    master-info-repository = TABLE
    relay-log-info-repository = TABLE
    # 设置binlog日志
    log-bin = /var/log/mysql/mysql-binlog
    # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M  
    # 主从复制的格式(mixed,statement,row,默认格式是statement)官方推荐在使用GTID情况下,基于行复制
    binlog_format=row
    # 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7
    
    # mysql_native_password
    default_authentication_plugin = 'mysql_native_password'
    
    # slave实例设置为只读
    read_only = on
    
    [mysqld]
    skip-name-resolve
    

    Slave2 配置文件(server-id 为4,其他不变)

    [client]
    port = 3306
    
    [mysqld]
    # innodb_force_recovery = 6  # 数据恢复参数,在数据表结构异常时使用(缺省值为0)
    port = 3306
    datadir         = /var/lib/mysql
    log-error       = /var/log/mysql/error.log
    innodb-data-file-path = /var/lib/mysql/ibdata1:1G;/var/lib/mysql/ibdata2:1G;/var/lib/mysql/ibdata3:1G
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links = 0
    max_connections = 2000
    max_user_connections = 1900
    max_connect_errors = 100000
    max_allowed_packet = 50M
    lower_case_table_names = 1
    default-time_zone = '+8:00'
    
    # 1055异常处理
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    
    # GTID及二进制日志
    server-id = 3
    gtid_mode = on
    enforce_gtid_consistency = on
    master-info-repository = TABLE
    relay-log-info-repository = TABLE
    # 设置binlog日志
    log-bin = /var/log/mysql/mysql-binlog
    # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M  
    # 主从复制的格式(mixed,statement,row,默认格式是statement)官方推荐在使用GTID情况下,基于行复制
    binlog_format=row
    # 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7
    
    # mysql_native_password
    default_authentication_plugin = 'mysql_native_password'
    
    # slave实例设置为只读
    read_only = on
    
    [mysqld]
    skip-name-resolve
    
  • 编写 docker-compose 文件

    指定 IP 时,注意不要与原网段重复,否则将创建失败!

    version: '3'
    services:
      master1:
        image: mysql:8.0.33
        container_name: master1
        restart: always
        ports:
          - 33061:3306
        environment:
          - MYSQL_ROOT_PASSWORD=Zhurs@123!
        volumes:
          - /root/mysql_install/master1/conf:/etc/mysql/conf.d
          - /root/mysql_install/master1/logs:/var/log/mysql
          - /root/mysql_install/master1/data:/var/lib/mysql
        networks:
          mysql-network:
            ipv4_address: 172.31.1.11
      master2:
        image: mysql:8.0.33
        container_name: master2
        restart: always
        ports:
          - 33062:3306
        environment:
          - MYSQL_ROOT_PASSWORD=Zhurs@123!
        volumes:
          - /root/mysql_install/master2/conf:/etc/mysql/conf.d
          - /root/mysql_install/master2/logs:/var/log/mysql
          - /root/mysql_install/master2/data:/var/lib/mysql
        networks:
          mysql-network:
            ipv4_address: 172.31.1.12
      slave1:
        image: mysql:8.0.33
        container_name: slave1
        restart: always
        ports:
          - 33063:3306
        environment:
          - MYSQL_ROOT_PASSWORD=Zhurs@123!
        volumes:
          - /root/mysql_install/slave1/conf:/etc/mysql/conf.d
          - /root/mysql_install/slave1/logs:/var/log/mysql
          - /root/mysql_install/slave1/data:/var/lib/mysql
        networks:
          mysql-network:
            ipv4_address: 172.31.1.13
      slave2:
        image: mysql:8.0.33
        container_name: slave2
        restart: always
        ports:
          - 33064:3306
        environment:
          - MYSQL_ROOT_PASSWORD=Zhurs@123!
        volumes:
          - /root/mysql_install/slave2/conf:/etc/mysql/conf.d
          - /root/mysql_install/slave2/logs:/var/log/mysql
          - /root/mysql_install/slave2/data:/var/lib/mysql
        networks:
          mysql-network:
            ipv4_address: 172.31.1.14
          
    networks:
      mysql-network:
        driver: bridge
        ipam:
          driver: default
          config:
            - subnet: 172.31.1.0/24
              gateway: 172.31.1.1
    
  • 运行 MySQL 服务

    docker-compose up -d
    

    查看容器是否正常运行。

    docker ps
    

    image-20230502225451248

2.2 主从配置

2.2.1 主从同步配置

1、配置 master1 - - > slave1 主从

  • master1 实例创建主从同步账号

    # 进入master1容器
    docker exec -it master1 bash
    
    # 登录MySQL
    mysql -u root -p
    
    # 创建用户
    # 注意:MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作
    create user 'repl_master1'@'%' identified by 'zhurs@123.com';
    
    # 授权(主从同步权限即可)
    # replication slave权限:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
    # super权限:允许用户使用修改全局变量的SET语句以及CHANGE(属于MASTER语句)
    # reload权限:必须拥有reload权限,才可以执行flush  [tables | logs | privileges]
    grant replication  slave,reload,super on *.* to 'repl_master1'@'%' with grant option;
    
    # 刷新授权
    flush privileges;
    
  • slave1 实例进行同步

    # 进入slave1容器
    docker exec -it slave1 bash
    
    # 登录MySQL
    mysql -u root -p
    
    # 连接master1主库
    CHANGE MASTER TO master_host='172.31.1.11', master_port=3306, master_user='repl_master1', master_password='zhurs@123.com', master_auto_position=1;
    
    # 启动slave连接
    start slave;
    
  • 查看同步状态

    show slave status\G
    

    image-20230503000000879

2、配置 master2 - - > slave2 主从

  • master2 实例创建主从同步账号

    # 进入master2容器
    docker exec -it master2 bash
    
    # 登录MySQL
    mysql -u root -p
    
    # 创建用户
    # 注意:MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作
    create user 'repl_master2'@'%' identified by 'zhurs@123.com';
    
    # 授权(主从同步权限即可)
    # replication slave权限:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
    # super权限:允许用户使用修改全局变量的SET语句以及CHANGE(属于MASTER语句)
    # reload权限:必须拥有reload权限,才可以执行flush  [tables | logs | privileges]
    grant replication  slave,reload,super on *.* to 'repl_master2'@'%' with grant option;
    
    # 刷新授权
    flush privileges;
    
  • slave2 实例进行同步

    # 进入slave2容器
    docker exec -it slave2 bash
    
    # 登录MySQL
    mysql -u root -p
    
    # 连接master2主库
    CHANGE MASTER TO master_host='172.31.1.12', master_port=3306, master_user='repl_master2', master_password='zhurs@123.com', master_auto_position=1;
    
    # 启动slave连接
    start slave;
    
  • 查看同步状态

    show slave status\G
    

    image-20230503001352692

至此,MySQL 的主从复制完成!接下来配置主主复制过程!

2.2.2 主主同步配置

1、配置 master1 - - > master2 主从

master1 为主,master2 为从

  • master1 实例创建主从同步账号

    已经创建。

  • master2 实例进行同步

    # 进入slave1容器
    docker exec -it master2 bash
    
    # 登录MySQL
    mysql -u root -p
    
    # 连接master1主库
    CHANGE MASTER TO master_host='172.31.1.11', master_port=3306, master_user='repl_master1', master_password='zhurs@123.com', master_auto_position=1;
    
    # 启动slave连接
    start slave;
    
  • 查看同步状态

    show slave status\G
    

    image-20230503001450209

2、配置 master2 - - > master1 主从

master2 为主,master1 为从

  • master2 实例创建主从同步账号

    已经创建。

  • master1 实例进行同步

    # 进入slave1容器
    docker exec -it master1 bash
    
    # 登录MySQL
    mysql -u root -p
    
    # 连接master1主库
    CHANGE MASTER TO master_host='172.31.1.12', master_port=3306, master_user='repl_master2', master_password='zhurs@123.com', master_auto_position=1;
    
    # 启动slave连接
    start slave;
    
  • 查看同步状态

    show slave status\G
    

    image-20230503001757491

至此,主从复制、主主复制结束!

:在配置 SLAVE 同步时

# 首先停止数据同步相关的线程: slave I/O 线程和 slave SQL 线程
STOP SLAVE;

# 为了避免可能发生的错误,直接重置客户端
RESET  SLAVE;

2.3 主从验证

2.3.1 主从同步验证

1、master1 创建测试数据库

create database if not exists master1 default charset utf8 collate utf8_general_ci;

2、slave1 验证是否同步

show databases;

# 如下图,已经同步

image-20230503002355116

2.3.2 主主同步验证

此时,master2、slave2 也都有名为 master1 的测试数据库,因为 master2 与 master1 互为主从,而 slave2 又是 master2 的从库。

因此得出结论,这种数据库架构下,只要你在任意一 master 节点上创建数据库,每个 MySQL 实例都会实现数据同步。

image-20230503002458446

2.4 客户端连接

2.4.1 控制台

需安装MySQL客户端命令(mysql)。

mysql -uroot -pZhurs@123! -h 192.168.56.120 -P 33061
2.4.2 图形化

如 client 通过 navicat 客户端软件连接 master 节点(只需要连接其中之一即可),或以 VIP 的方式连接(配置 keepalived 实现 master 节点高可用),由于在单台 Host 虚拟机下运行的多 MySQL 实例,就无法做高可用演示,生产中至少两台 master 的 Host 节点来实现高可用。

image-20230503003905267

查看数据库:

image-20230503003945019

至此,主从复制 + 主主复制 + 客户端连接已经配置完毕!

三、压测

测试:主从读写性能。

工具:sysbench

3.1 安装 sysbench

1、执行脚本

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash

2、开始安装

sudo yum -y install sysbench

3、验证

sysbench --version

image-20230503213303900

3.2 sysbench 压测

由于我的系统主机资源有限,因此就简单的 10 张表、每张表 1千条数据进行 5 分钟压测

参考:https://help.aliyun.com/document_detail/146103.html

3.2.1 读性能

1、准备数据

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300  oltp_read_only prepare
  
# 说明:
# --table_size:表记录数
# --tables:表数量

执行完毕后,来查看数据库。

image-20230503223241087

2、运行

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300 \
  --threads=5 \
  --percentile=95 \
  --range_selects=0 \
  --skip-trx=1 \
  --report-interval=1 oltp_read_only run
  
# 说明:
# --threads:并发线程数,可以理解为模拟的客户端并发连接数
# --skip-trx:省略begin/commit语句。默认是off

**执行结果:**从中可看出每秒查询,每秒事务等执行结果。

image-20230503224520488

除此之外,Host 系统的平均负载也在升高:

image-20230503225222279

3、清理

测试完成后清理数据,释放空间

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300   \
  --threads=5 \
  --percentile=95 \
  --range_selects=0 oltp_read_only cleanup
3.2.2 写性能

1、准备数据

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300  oltp_write_only prepare

2、运行

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300 \
  --threads=5 \
  --percentile=95 \
  --report-interval=1 oltp_write_only run

执行结果:

image-20230503225733818

3、清理

测试完成后清理数据,释放空间

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300 \
  --threads=5 \
  --percentile=95 oltp_write_only cleanup
3.2.3 读写性能

1、准备数据

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300 oltp_read_write prepare

2、运行

sysbench \
  --db-driver=mysql  \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300 \
  --threads=5 \
  --percentile=95 \
  --report-interval=1 oltp_read_write run

执行结果:

image-20230503231502157

3、清理

sysbench \
  --db-driver=mysql \
  --mysql-host=192.168.56.120 \
  --mysql-port=33061 \
  --mysql-user=root \
  --mysql-password=Zhurs@123! \
  --mysql-db=master1 \
  --table_size=1000 \
  --tables=10 \
  --events=0 \
  --time=300 \
  --threads=5 \
  --percentile=95 oltp_read_write cleanup
3.2.4 主从复制延迟

以 10 张表,每张表 1000 条记录,读写压测 5 分钟的数据来看,主从复制的延迟在为 1s,不超过 2s(本次测试结果),如下图所示。

image-20230503225703898

四、扩展

4.1 主从复制方式

4.1.1 异步复制(Asynchronous replication)

MySQL 默认使用的是异步复制,官方解释如下:

the master writes events to its binary log and slaves request them when they are ready. There is no guarantee that any event will ever reach any slave.

即 master 服务器将事件写入其二进制日志,slave 服务器在事件准备好时请求事件。不能保证任何事件都会影响到任何一个 slave。

说白了就是:主库只管把 events 写入 binlog 中,不管从库有没有收到。

4.1.2 全同步复制(Fully synchronous replication)

官方解释如下:

when a master commits a transaction, all slaves also will have committed the transaction before the master returns to the session that performed the transaction. The drawback of this is that there might be a lot of delay to complete a transaction.

即 master 服务器提交事务时,在 master 服务器返回到执行该事务的会话之前,所有 slave 服务器也将提交该事务。这样做的缺点是完成事务可能会有很多延迟。

说白了就是:主库提交一个事物,需要等待所有从库先提交才能返回结果,执行这个事物。这样会造成一个事物延时。

4.1.3 半同步复制(Semisynchronous replication)

官方解释如下:

falls between asynchronous and fully synchronous replication. The master waits only until at least one slave has received and logged the events. It does not wait for all slaves to acknowledge receipt, and it requires only receipt, not that the events have been fully executed and committed on the slave side.

即介于异步复制和全同步复制之间。master 服务器只等待至少一个 slave 服务器接收并记录事件。它不等待所有从服务器确认接收,它只需要接收,而不需要在从服务器端完全执行和提交事件。

说白了就是:介于异步复制和全复制之间,主库仅仅只要等待至少一个从库收到和记录 events。它不需要等待所有的从库告诉它收到events,也不需要从库执行和提交事物,从库只是收到 events 就会告诉主库,这样主库就可以提前提交事物了。

4.2 GTID 与 Binary Log

1、GTID

MySQL GTID(Global Transaction ID)是一种用于在复制环境中唯一标识事务的机制。GTID 能够在复制拓扑中帮助识别和跟踪每个事务的状态,从而更方便的进行数据同步和故障恢复。在 MySQL 5.6 版本及以上,可以使用 GTID 进行复制。

2、Binary Log

binlog(Binary Log)是 MySQL 中的一种日志文件,用于记录对 MySQL 数据库进行的更改操作。它记录了所有的数据更改操作,包括对表的插入、更新和删除等操作。binlog 日志可以用于数据恢复、复制和备份等操作。

3、两者区别

  • 功能不同:GTID 用于唯一标识复制环境中的事务,而 binlog 用于记录数据库的更改操作。
  • 数据结构不同:GTID 是由服务器生成的唯一标识符,用于标识每个事务。而 binlog 是一种二进制格式的日志文件,记录了每个事务的更改操作。
  • 使用方式不同:GTID 用于在复制拓扑中标识和跟踪每个事务的状态,从而更方便地进行数据同步和故障恢复。而 binlog 可以用于数据恢复、复制和备份等操作。

需要注意的是:使用 GTID 进行复制需要 MySQL 5.6 及以上版本的支持。在 MySQL 5.5 及以下版本中,只能使用 binlog 进行数据复制和备份。本次使用的是基于 GTID 的主从复制。

FAQ

MySQL 5.1.7 + 已经不支持 “master-host” 类似的参数。

image-20230503195146922

因此 docker-compose 中就无法实现启动时主从同步(如下图 command 部分):

image-20230503195256475

所以,通过 docker-compose 运行主从时,需进入从库进行配置!

—END <点击跳转至开头>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云计算-Security

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

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

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

打赏作者

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

抵扣说明:

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

余额充值