近况

复习redis的时候有看到缓存一致性方面的知识,这部分很重要,我感觉我只是了解了一个大概,
回头看能不能水一波缓存同步的博客,今天尝试搭建了一下mysql主从复制,记录一下,以后忘记可以看看

docker-compose搭建Mysql主从复制步骤

  • 基本配置文件及目录

    mysql-master-slave/
    ├── docker-compose.yaml
    ├── master
    │   ├── conf
    │   │   └── my.cnf
    │   ├── data
    │   ├── Dockerfile
    │   ├── logs
    │   └── wanyi.sql
    └── slave
        ├── conf
        │   └── my.cnf
        ├── data
        ├── Dockerfile
        ├── logs
        └── wanyi.sql
    #master中除my.cnf有略微差别外,其他都与slave中配置文件一致
  • wanyi.sql

    create database wanyi;
    use wanyi;
    
    DROP TABLE IF EXISTS `wanyi`;
    CREATE TABLE `wanyi` (
      `id` int(11) NOT NULL COMMENT 'id',
      `name` varchar(32) NOT NULL COMMENT '姓名',
      PRIMARY KEY (`id`) USING BTREE
    )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='test for mysq-master-slave';
    
    INSERT INTO `wanyi` VALUES (1,"万一");
    INSERT INTO `wanyi` VALUES (2,"万二");
    INSERT INTO `wanyi` VALUES (3,"万三");
  • Dockerfile

    #设定初始镜像mysql版本
    FROM mysql
    #设定工作目录,用于处理初始化mysql的sql文件
    WORKDIR /docker-entrypoint-initdb.d
    #默认mysql无法输入中文,修改编码使其支持中文
    ENV LANG=C.UTF-8
    #加入需要初始化的sql文件
    ADD ./wanyi.sql .
  • My.cnf
    master中My.cnf

    [mysqld]
    ## server_id,一般设置为IP,注意要唯一
    server_id=1
    log_bin=mysql-bin
    ## 需要主从复制的数据库
    binlog-do-db=wanyi
    ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
    binlog-ignore-db=mysql
    ## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M
    ## 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
    binlog_format=mixed
    ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    binlog_expire_logs_seconds=3600
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062

    slave中My.cnf

    [mysqld]
    ## 设置server_id,一般设置为IP,注意要唯一
    server_id=2
    ## 需要主从复制的数据库
    replicate-do-db=wanyi
    ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
    binlog-ignore-db=mysql
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log_bin = mysql-bin
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=row
    ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    binlog_expire_logs_seconds=3600
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062
    ## relay_log配置中继日志
    relay_log=replicas-mysql-relay-bin
    ## log_slave_updates表示slave将复制事件写进自己的二进制日志
    log_slave_updates=1
    ## 防止改变数据(除了特殊的线程)
    read_only=1
  • docker-compose.yaml

    version: '3'
    services:
      mysql-master:
        build: ./master
        environment:
          - "MYSQL_ROOT_PASSWORD=root"
        ports:
          - "33065:3306"
        container_name: mysql-master
        volumes:
          - "./master/data/:/var/lib/mysql/"      #mysql数据目录
          - "./master/logs/:/var/log/mysql/"      #mysql的日志目录
          - "./master/conf/:/etc/mysql/conf.d/"   #mysql的配置目录
        command: [
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--lower_case_table_names=1'
              ]
        restart: always
        hostname: mysql-master
        links:
          - mysql-slave 
    
      mysql-slave:
        build: ./slave
        environment:
          - "MYSQL_ROOT_PASSWORD=root"
        ports:
          - "33066:3306"
        container_name: mysql-slave
        restart: always
        hostname: mysql-slave
        volumes:
          - "./slave/data/:/var/lib/mysql/"      #mysql数据目录
          - "./slave/logs/:/var/log/mysql/"      #mysql的日志目录
          - "./slave/conf/:/etc/mysql/conf.d/"   #mysql的配置目录
  • 配置mysql权限
    当我们启动两个mysql容器后,我们需要使用sqlyog或者Navicat连接这两个mysql,但是因为是mysql8版本
    我们并不能直接使用工具连接上,所以我们需要更改这两个mysql的root用户权限。

    进入这两个mysql容器的mysql中,执行下面两句命令:

    #用于更换MySQL root账户的密码和加密方式
    ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123765';
    #用于刷新权限
    FLUSH PRIVILEGES;
  • 在master容器的mysql中,查询出File和Position字段的值

  • 在slave容器的mysql中,执行下面语句

    CHANGE MASTER TO MASTER_HOST='47.98.138.53',MASTER_PORT=33065,
    MASTER_USER='root',MASTER_PASSWORD='root',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=2797;
    # MASTER_LOG_FILE的值就是master中File字段的值,
    # MASTER_LOG_POS的值就是master中Position字段的值,这是在确定slave从哪里开始复制
    
    #重新启动slave,使配置生效
    stop slave
    start slave

    执行上面语句,相当于slave容器的mysql作为了master容器mysql的从机,
    我们可以通过命令查看从机状态:show slave status
    如果出现下面Slave_SQL_ Running和Slave_IO_Running字段的值都为YES,
    Slave_IO_Status值为:Waiting for source to send event,则表示部署成功,从机可以从主机中拷贝数据

  • 文章及资料