开发小知识-mysql主从复制

MYSQL数据库主从复制

1 读写分离架构

1.1 介绍

为了减轻数据库的压力,我们脑海里出现最基本的两种方案分别是

  • 在应用程序与数据库之间架构一层缓存层,将常用的数据存放在缓存中,应用读取数据时,先到缓存中取,未命中时,才到数据库中取数据。

  • 部署两台数据一致的数据库,一台用于写操作【主数据库】,一台用于读操作【从数据库】,实现数据的读写分离。

现在要介绍的是针对读写分离的方案【mysql主从复制】

开发小知识-mysql主从复制

? 为此,我们要需要达到如下几个要求

  1. 主从数据库数据必须一致

    可采用数据库主从复制机制实现数据的同步

  2. 写数据操作的是主数据库

    在应用程序使用动态数据源将写数据请求对接到主数据库

  3. 读数据操作的是从数据库

    在应用程序使用动态数据源将读数据请求对接到主数据库

2 mysql主从复制部署

2.1 说明

主从复制的原理:

开发小知识-mysql主从复制

  1. 主库db的更新事件(update、insert、delete)被写到binlog
  2. 主库创建一个binlog dump thread,把binlog的内容发送到从库
  3. 从库启动并发起连接,连接到主库
  4. 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
  5. 从库启动之后,创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db 本次mysql主从复制使用docker容器来实现,需要具备一定的docker操作能力。

? 上述主从复制原理摘抄自【https://blog.csdn.net/zai_xia/article/details/90379016

2.2 部署主数据库

  1. 下载percona 5.7.23 镜像
docker pull percona:5.7.23
  1. 查看镜像

    docker images

    开发小知识-mysql主从复制

  2. 创建宿主机mysql数据卷

    mkdir -p /data/mysql/master //自行定义数据卷存放目录,要与启动docker容器宿主机的数据卷一致
    cd /data/mysql/master //进入数据卷目录
    mkdir conf data //创建两个目录,conf 用于存放mysql的配置文件,data用于存放mysql的数据
    chmod 777 * -R //给目录授权
  3. 创建msyql配置文件

    cd /data/mysql/master/conf //进入mysql存放配置文件目录
    vim my.cnf //创建mysql配置文件

    配置文件【my.conf】的内容

    [mysqld] 
    log-bin=mysql-bin #开启二进制日志 
    server-id=1 #服务id,在集群内不允许重复
    sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION‘ #解决mysql5.7 版本以上出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误
  4. 创建mysql主数据库容器

    docker create --name percona-master -v /data/mysql/master/data:/var/lib/mysql -v /data/mysql/master/conf:/etc/my.cnf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23//创建主数据库容器
    docker ps -a //查看是否创建成功
    

    -v 指定宿主机【/data/mysql/master/data】映射容器的【/var/lib/mysql】,【/data/mysql/master/conf】映射容器【/etc/my.cnf.d】
    开发小知识-mysql主从复制

  5. 启动容器并查看是否启动成功

    docker start percona-master //启动mysql-master容器
    docker logs -f percona-master //查看mysql-master容器日志

开发小知识-mysql主从复制

  1. 使用mysql客户端授权从数据库复制

    采用navicat连接主数据库【工具可自行选择】

]开发小知识-mysql主从复制

执行创建用户及授权SQL语句

   create user ‘pango‘@‘%‘ identified by ‘pango‘;//创建用户
   grant replication slave on *.* to ‘pango‘@‘%‘; //授权复制权限给用户
   flush privileges;//刷新权限

查看主数据库状态

   show master status;

开发小知识-mysql主从复制

文件mysql-bin.000003 及位置741,从数据库同步主数据库需要用到

查看二进制文件的信息

   show global variables like ‘binlog%‘;

开发小知识-mysql主从复制

2.3 部署从数据库

创建从数据库容器的步骤与创建主数据库容器的步骤大体一样,这里就不做过多的备注

  1. 创建从数据库在宿主机的数据卷目录

    mkdir /data/mysql/slave 
    cd /data/mysql/slave 
    mkdir conf data 
    chmod 777 * -R
  2. 创建配置文件

    cd /data/mysql/slave/conf
    vim my.cnf

    配置文件【my.cnf】内容:

    [mysqld] 
    log-bin=mysql-bin #开启二进制日志 
    server-id=2 #服务id,在集群内不允许重复
    sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION‘ #解决mysql5.7 版本以上出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误
  3. 创建从数据库容器

    docker create --name percona-slave -v /data/mysql/slave/data:/var/lib/mysql -v /data/mysql/slave/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
  4. 启动容器

    docker start percona-slave //启动mysql-slave
    docker logs -f percona-slave //查看mysql-slave
  5. 使用客户端执行设置主数据库配置sql语句

    CHANGE MASTER TO master_host=‘localhost‘, master_user=‘pango‘, master_password=‘pango‘, master_port=3306, master_log_file=‘mysql-bin.000003‘, master_log_pos=741;
  6. 启动从数据库同步

    start slave;
  7. 查看从数据库状态

    show slave status
  8. 测试

    从主数据库中新建库或表,查看从数据库是否存在同样的表和库,如存在,则表示主从复制部署成功

开发小知识-mysql主从复制

上一篇:题解 CF1437G Death DBMS


下一篇:MYSQL执行SQL出现错误:Error Code:1054.Unknown column "字段名" in 'order clause'如何解决