IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    mysql主从复制 ( docker-compose )

    John Doe发表于 2024-04-02 02:43:38
    love 0

    mysql主从复制

    MySQL 主从复制是一种基于日志的复制机制,用于将主服务器(Master)上的数据实时复制到一个或多个从服务器(Slave)。主从复制的原理如下:

    1. 主服务器将所有修改操作记录在二进制日志(Binary Log)中。这些修改可以是插入、更新或删除数据的操作。
    2. 从服务器连接到主服务器,并发送一个请求,请求成为主服务器的从服务器。主服务器收到请求后,将记录从服务器的信息,并开始与从服务器建立复制连接。
    3. 主服务器将二进制日志中的内容发送给从服务器。从服务器接收并执行这些日志中的操作,将数据修改操作反映到自己的数据库上。
    4. 从服务器还会定期向主服务器发送心跳信息以维持连接。如果主服务器长时间没有收到从服务器的心跳信息,就认为从服务器宕机,不再向其发送日志。
    5. 如果主服务器发生故障,导致无法提供服务,可以将一个从服务器提升为新的主服务器,以继续提供服务。此时,其他从服务器将切换到新的主服务器上进行复制。
    6. 通过主从复制,可以实现数据的实时复制和分布式读取,提高数据库的可用性和读取性能。此外,主从复制还可以用于备份数据,当主服务器发生故障时,可以快速切换到从服务器,减少服务停机时间。
    7. 需要注意的是,主从复制是异步的,从服务器的数据可能稍有延迟。而且主从复制只复制数据修改操作,不复制表结构的变更。如果需要同步表结构的变更,可以使用主从复制搭配其他工具,如 GTID(Global Transaction Identifier)或者基于触发器的解决方案。

    创建对应的文件夹

      mkdir -p /home/mysql/{cnf,logs,mysql}  mkdir -p /home/mysql-slave/{cnf,logs,mysql}

    在cnf文件夹下创建my.cnf文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #写入下面配置
    [mysqld]
    pid-file= /var/run/mysqld/mysqld.pid
    socket= /var/run/mysqld/mysqld.sock
    datadir= /var/lib/mysql

    default-time_zone='+8:00'
    skip-name-resolve

    log-bin=mysql-bin
    binlog-format=ROW
    # 每个服务不一样
    server_id=1

    symbolic-links=0
    expire_logs_days=7

    max_connections = 2000
    max_user_connections = 1900
    max_connect_errors = 100000
    max_allowed_packet = 50M
    lower_case_table_names=0
    sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'


    编写docker-compose.yml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    version: '3.5'
    networks:
    mysql-network:
    driver: bridge
    ipam:
    config:
    - subnet: 10.1.20.0/24

    services:
    mysql-master:
    image: mysql:8.0.32
    container_name: mysql-3124
    privileged: true
    restart: always
    ports:
    - 3124:3306
    environment:
    - TZ=Asia/Shanghai
    - MYSQL_ROOT_PASSWORD=L3z5uLD@rB1y
    - character-set-server=utf8mb4
    - collation-server=utf8mb4_general_ci
    #目录挂载
    volumes:
    - /home/mysql/cnf:/etc/mysql/conf.d
    - /home/mysql/logs:/logs
    - /home/mysql/mysql:/var/lib/mysql
    networks:
    mysql-network:
    ipv4_address: 10.1.20.2

    mysql-slave:
    image: mysql:8.0.32
    container_name: mysql-3125
    privileged: true
    restart: always
    ports:
    - 3125:3306
    environment:
    - TZ=Asia/Shanghai
    - MYSQL_ROOT_PASSWORD=L3z5uLD@rB1y
    - character-set-server=utf8mb4
    - collation-server=utf8mb4_general_ci
    #目录挂载
    volumes:
    - /home/mysql-slave/cnf:/etc/mysql/conf.d
    - /home/mysql-slave/logs:/logs
    - /home/mysql-slave/mysql:/var/lib/mysql
    networks:
    mysql-network:
    ipv4_address: 10.1.20.3


沪ICP备19023445号-2号
友情链接