docker-compose MySQL 8.0 GTID主从复制方式

发布时间:2021-11-28作者:laosun阅读(1003)

docker-compose

    准备环境

    # 使用docker pull mysql:latest 拉取下来的mysql版本是:8.0.27-1debian10
    
    # 准备2台机器
    192.168.0.121  (安装master)
    192.168.0.122  (安装slave)
    
    注意:mysql 是无法使用nfs共享区的。所以如果是使用docker,映射出来的卷最好在宿主机上,别在共享区。

    操作目录都是在 /usr/local/docker/mysql

    先分别在两台机器的这个目录下分别创建2个文件夹。

    mkdir data logs

    192.168.0.121 master 机器

    增加my.cnf ,这里我命名为master.cnf

    master.cnf

    [mysqld]
    max_connections = 2000
    default-time_zone='+8:00'
    
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    
    #gtid:
    server_id = 1                   #服务器id
    gtid_mode = on                  #开启gtid模式
    enforce_gtid_consistency = on   #强制gtid一致性,开启后对于特定create table不被支持
    
    #binlog
    log_bin = mysql-binlog
    log_slave_updates = on
    binlog_format = row             #强烈建议,其他格式可能造成数据不一致
    
    # 指定同步哪个数据库
    binlog-do-db=d_sun
    # 忽略以下数据库的同步
    binlog-ignore-db=mysql
    binlog-ignore-db=sys
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    
    #relay log
    skip_slave_start = 1
    
    default_authentication_plugin = 'mysql_native_password'  #更改加密方式

    增加 docker-compose.yaml

    version: "3.9"
    services:
      mysql:
        restart: always
        image: mysql:latest
        container_name: mysql
        ports:
          - 3306:3306
        command:
          --default-authentication-plugin=mysql_native_password
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
          --explicit_defaults_for_timestamp=true
          --lower_case_table_names=1
        environment:
          MYSQL_ROOT_PASSWORD: root
        volumes:
          - ${PWD}/data:/var/lib/mysql
          - ${PWD}/logs:/var/log/mysql
          - ${PWD}/master.cnf:/etc/my.cnf

    master机器下创建完成后,如下所示:

    1.png

    192.168.0.122 slave 机器

    增加my.cnf ,这里我命名为slave.cnf

    slave.cnf

    [mysqld]
    max_connections = 2000
    default-time_zone = '+8:00'
    
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    
    #GTID:
    server_id = 2                  #服务器id(注意这里的servier_id不能master一样,另外每启动一台slave,都需要改动)
    gtid_mode = on                 #开启gtid模式
    enforce_gtid_consistency = on  #强制gtid一致性,开启后对于特定create table不被支持
    
    #binlog
    log_bin =mysql-binlog
    log_slave_updates = on
    binlog_format = row            #强烈建议,其他格式可能造成数据不一致
    
    # 以下为多余配置,slave机器不需要配置,否则会导致mysql服务无法启动
    # 指定同步哪个数据库
    # binlog-do-db=d_sun
    # 忽略以下数据库的同步
    # binlog-ignore-db=mysql
    # binlog-ignore-db=sys
    # binlog-ignore-db=information_schema
    # binlog-ignore-db=performance_schema
    
    #relay log
    skip_slave_start = 1
    default_authentication_plugin = 'mysql_native_password'  #更改加密方式
    
    read_only = on                   #设置只读
    super_read_only = on    # 设置超级管理员也只允许读,不允许写
    
    # mysql8.0以上版本,binlog保存时间 以秒为单位;默认2592000 30天
    # mysql8.0以下版本,使用expire_logs_days,以天为单位
    binlog_expire_logs_seconds=604800

    增加 docker-compose.yaml

    version: "3.9"
    services:
      mysql:
        restart: always
        image: mysql:latest
        container_name: mysql
        ports:
          - 3306:3306
        command:
          --default-authentication-plugin=mysql_native_password
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
          --explicit_defaults_for_timestamp=true
          --lower_case_table_names=1
        environment:
          MYSQL_ROOT_PASSWORD: root
        volumes:
          - ${PWD}/data:/var/lib/mysql
          - ${PWD}/logs:/var/log/mysql
          - ${PWD}/slave.cnf:/etc/my.cnf

    slave 机器下创建完成后,如下所示:

    2.png

    启动

    分别使用以下指令启动两台mysql服务

    # 进入这个文件夹
    cd /usr/local/docker/mysql
    # 启动mysql服务
    docker-compose up -d

    3.png

    初始化配置,从master上创建专用于同步的账户

    # 登录192.168.0.121这台master服务
    
    # 进入docker 容器
    docker exec -it mysql bash
    
    # 登录mysql
    mysql -u root -proot
    
    # 查看server_id是否生效
    show variables like '%server_id%';
    
    # 如果打印以下内容表示生效
    +----------------+-------+
    | Variable_name  | Value |
    +----------------+-------+
    | server_id      | 1     |
    | server_id_bits | 32    |
    +----------------+-------+
    2 rows in set (0.00 sec)

    4.png

    可以使用 show master status; 查看master状态

    5.png

    # 创建一个专用的账户用户bin log的同步
    # 账号为:slave 密码为:000000
    CREATE USER 'slave'@'%' IDENTIFIED BY '000000'; 
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
    flush privileges;

    6.png

    初始化配置, slave 服务(配置master指向)

    # 启动mysql服务
    docker-compose up -d
    
    # 进入docker 容器
    docker exec -it mysql bash
    
    # 登录mysql
    mysql -u root -proot
    
    # 查看server_id是否生效
    show variables like '%server_id%';
    
    # 如果打印以下内容表示生效
    +----------------+-------+
    | Variable_name  | Value |
    +----------------+-------+
    | server_id      | 2     |
    | server_id_bits | 32    |
    +----------------+-------+
    2 rows in set (0.00 sec)

    7.png

    # 查看MASTER状态
    show slave status\G;
    
    # 输出Empty set, 1 warning (0.01 sec)

    从节点使用备份账户连接主节点,开启备份

    # 执行指令,连接主节点,开启备份
    change master to
          master_host='192.168.0.121',
          master_port=3306,
          master_user='slave',
          master_password='000000',
          master_auto_position=1;
          
    # 启动同步
    start slave;
    
    # 如果出现异常:ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
    # 则可以执行重置,然后再 start slave;
    reset slave;

    8.png

    可以使用 show slave status\G; 查看状态。

    如果下边的标红加粗部分(Slave_IO_Running、Slave_SQL_Running)都显示为Yes,表示主从复制一切正常。

    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for source to send event
                      Master_Host: 192.168.0.121
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-binlog.000003
              Read_Master_Log_Pos: 868
                   Relay_Log_File: 6f4258c72724-relay-bin.000004
                    Relay_Log_Pos: 1089
            Relay_Master_Log_File: mysql-binlog.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table:
      Replicate_Wild_Ignore_Table:
                       Last_Errno: 0
                       Last_Error:
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 868
                  Relay_Log_Space: 3118370
                  Until_Condition: None
                   Until_Log_File:
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File:
               Master_SSL_CA_Path:
                  Master_SSL_Cert:
                Master_SSL_Cipher:
                   Master_SSL_Key:
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error:
                   Last_SQL_Errno: 0
                   Last_SQL_Error:
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 1
                      Master_UUID: 6a4b9321-3c9d-11ec-a45e-0242c0a84002
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind:
          Last_IO_Error_Timestamp:
         Last_SQL_Error_Timestamp:
                   Master_SSL_Crl:
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set: 6a4b9321-3c9d-11ec-a45e-0242c0a84002:1-8
                Executed_Gtid_Set: 452bf0c3-3c9e-11ec-9fb3-0242c0a85002:1-5,
    6a4b9321-3c9d-11ec-a45e-0242c0a84002:1-8
                    Auto_Position: 1
             Replicate_Rewrite_DB:
                     Channel_Name:
               Master_TLS_Version:
           Master_public_key_path:
            Get_master_public_key: 0
                Network_Namespace:
    1 row in set, 1 warning (0.01 sec)
    
    ERROR:
    No query specified

    测试

    # 登录192.168.0.121 master 机器
    # 查看目前所有的数据库
    show databases;
    # 创建一个新的数据库
    CREATE DATABASE `d_sun` CHARACTER SET 'utf8mb4';
    
    # 登录192.168.0.122 slave机器
    # 查看目前所有的数据库,可以看到d_sun这个数据库已经同步过来了。
    show databases;
    
    
    # 剩下的表数据同步这里就不进行测试了。

    记得从机器使用超级管理员账户是可以进行修改的,不要进行改动,以免影响主从复制。

0 +1

版权声明

 数据库  mysql  docker  docker-compose

 请文明留言

0 条评论