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

news2024/9/24 11:23:57

ms-mysql


目录

    • 一、规划
      • 1.1 基础环境
      • 1.2 应用架构
      • 1.3 路径规划
    • 二、部署
      • 2.1 服务部署
      • 2.2 主从配置
        • 2.2.1 主从同步配置
        • 2.2.2 主主同步配置
      • 2.3 主从验证
        • 2.3.1 主从同步验证
        • 2.3.2 主主同步验证
      • 2.4 客户端连接
        • 2.4.1 控制台
        • 2.4.2 图形化
    • 三、压测
      • 3.1 安装 sysbench
      • 3.2 sysbench 压测
        • 3.2.1 读性能
        • 3.2.2 写性能
        • 3.2.3 读写性能
        • 3.2.4 主从复制延迟
    • 四、扩展
      • 4.1 主从复制方式
        • 4.1.1 异步复制(Asynchronous replication)
        • 4.1.2 全同步复制(Fully synchronous replication)
        • 4.1.3 半同步复制(Semisynchronous replication)
      • 4.2 GTID 与 Binary Log
    • FAQ


一、规划

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 <点击跳转至开头>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩具蛇+正则问题(JAVA解法)

玩具蛇&#xff1a;用户登录 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一条玩具蛇&#xff0c;一共有 16 节&#xff0c;上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或…

5 个冷门且实用的 Kubectl 使用技巧

kubectl 是 K8s 官方附带的命令行工具&#xff0c;可以方便的操作 K8s 集群。这篇文章主要介绍一些 kubectl 的别样用法&#xff0c;希望读者有一定基础的 K8s 使用经验。 有一篇文章也介绍了一些技巧&#xff0c;写博客的时候正好搜到了&#xff0c;正好也分享出来吧。 Ready…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_8.7p1(亲测无问题,建议收藏❤)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 文章声明前述安装一些必要的命令&…

细讲shell中的循环语句--for、while、until

目录 一:何为循环 1.循环概述 2.使用循环的好处 二&#xff1a;for循环语句 1.for语句的用法 ​2. 语法结构 &#xff08;1&#xff09;一般格式 &#xff08;2&#xff09;类C语言格式 &#xff08;3&#xff09;死循环 3.事例 ​4.常用转义符 ​5.制作九九乘法表 …

Winform从入门到精通(39)——ToolStrip(史上最全)更新中

1、Name获取控件对象 2、AllowDrop 3、AllowItemReorder 4、AllowMerge 5、Anchor 设置ToolStrip如何锚定父控件 6、AutoSize 设置ToolStrip的尺寸大小是否根据Font属性的变化而变化 7、BackColor 设置ToolStrip的背景色 8、BackgroundImage 设置背景图像 9、Back…

精炼计算机网络——序章(二)

文章目录 前言1.4 计算机网络在我国的发展1.5 计算机网络的类别1.5.1计算机网络的定义1.5.2 几种不同类别的计算机网络 1.6 计算机网络的性能1.6.1 计算机网络的性能指标1.6.2 计算机网络的非性能特征 1.7 计算机网络体系结构1.7.1 计算机网络体系结构的形成1.7.2 协议与划分层…

ChatExcel?

大家好&#xff0c;我是章北海mlpy 最近在浅学LangChain&#xff0c;在大模型时代&#xff0c;感觉这玩意很有前途。 LangChain是一个开源的应用开发框架&#xff0c;目前支持Python和TypeScript两种编程语言。 它赋予LLM两大核心能力&#xff1a;数据感知&#xff0c;将语言模…

5月1日起正式实施!图解《关键信息基础设施安全保护要求》

2023年5月1日&#xff0c;GB/T 39204-2022《信息安全技术 关键信息基础设施安全保护要求》将正式实施。作为我国第一项关键信息基础设施安全保护的国家标准&#xff0c;对于我国关键信息基础设施安全保护有着极为重要的指导意义。 《信息安全技术 关键信息基础设施安全保护要求…

Swift 技术 监听电话中断,音乐(用于恢复播放音乐)(源码)

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

【高烧39°考研上岸】23上交819考研经验分享

笔者来自通信考研小马哥23上交819全程班学员 一&#xff0c;基本情况介绍和考研经历 大家好&#xff0c;首先介绍一下我的基本情况。我本科毕业于东南大学&#xff0c;报考的是上海交通大学电子系电子与通信工程专业&#xff08;专业学位&#xff09;。我二战上岸&#xff0c…

Selenium:HTML测试报告

自动化测试过程中&#xff0c;获得用例的执行结果后&#xff0c;需要有具象化、简洁明了的测试结果&#xff0c;比如&#xff1a;用例执行时间、失败用例数、失败的原因等&#xff0c;这时候&#xff0c;就需要用到测试报告。 HTML测试报告是python语言自带的单元测试框架&…

等保各项费用支出明细

等保收费主要依据文件: 等保工作的定级指南文件_luozhonghua2000的博客-CSDN博客 Q7:做等级保护要多少钱? 答:开展等级保护工作主要包含:规划费用、建设或整改费用、运维费用、测评费用等,具体费用因各单位现状、保护对象承载业务功能、重要程度、所在地区等差异较大。 …

Input事件在应用中的传递(一)

Input事件在应用中的传递(一) hongxi.zhu 2023-4-25 前面我们已经梳理了input事件在native层的传递&#xff0c;这一篇我们接着探索input事件在应用中的传递与处理&#xff0c;我们将按键事件和触摸事件分开梳理&#xff0c;这一篇就只涉及按键事件。 一、事件的接收 从前面的…

Kubernetes(k8s)概念介绍

文章目录 1. k8s概述和特性2. k8s架构组件3. k8s核心概念 1. k8s概述和特性 K8s是一个开源的用于管理云平台中多个主机上的容器化的应用&#xff0c;k8s的目标是让部署容器化的应用简单并且高效&#xff0c;k8s提供了应用部署&#xff0c;规划&#xff0c;更新&#xff0c;维护…

R语言 | 程序的流程控制

目录 一、if语句 1.1 if语句的基本操作 1.2 if...else语句 1.3 if语句也可有返回值 1.4 if...else if...else if...else 1.5 嵌套式if语句 二、递归式函数的设计 三、向量化的逻辑表达式 3.1 处理向量数据if...else的错误 3.2 ifelse()函数 四、switch语句 五、for循…

塔望3W消费战略全案丨窄赛道,高增长 普麦尔知己精酿,掘金中国啤酒利基市场

普麦尔 知己精酿 客户&#xff1a;上海麦仕醇啤酒有限公司 品牌&#xff1a;普麦尔 purmalz beer 服务&#xff1a;3W消费战略 品牌全案 掘金中国啤酒利基市场 精酿啤酒(Craft Beer)的概念最早起源于美国。通常与传统的工业啤酒形成较大的反差&#xff0c;精酿最早的称呼 …

C learning_10 (函数的嵌套调用和链式访问、函数的声明和定义、函数递归)

目录 函数的嵌套调用和链式访问 嵌套调用 函数可以嵌套调用&#xff0c;可以嵌套定义吗&#xff1f; 链式访问 函数的声明和定义 声明 定义 函数递归 递归的两个必要条件 函数的嵌套调用和链式访问 嵌套调用 函数嵌套调用指的是在一个函数中调用另外一个函数&#xf…

OpenSSH升级版本

项目被扫出openssh有严重漏洞&#xff0c;因此要升级openssh到最新版本 1、为防止安装失败&#xff0c;无法用ssh做远程连接&#xff0c;因此先安装telnet防一手 yum -y install telnet*systemctl enable telnet.socketsystemctl start telnet.socket注&#xff1a;安全文件关…

【星戈瑞】脂溶性CY5.5马来酰亚胺Cyanine5.5 maleimide

脂溶性CY5.5马来酰亚胺是一种荧光染料&#xff0c;其分子中含有马来酰亚胺结构&#xff0c;结构中的共轭体系赋予其良好的光学性质。该染料在红外区域有较强的吸收峰&#xff0c;具有较高的荧光量子产率和较长的荧光寿命&#xff0c;因此被应用于细胞和生物分子的荧光标记和成像…

cleanmymac正式版mac电脑清理软件

电脑清理软件在我们的电脑使用过程中是非常实用便捷的清理软件.当电脑使用了一段时间内,电脑就会产生各种各样的垃圾文件,比如说残留的注册表或者无效的注册表,系统碎片以及毫无用处的文件等,这些的存在将会极大程度地拖慢电脑的运行速度,而你删除的话可能会删除本不能删除的文…