zoukankan      html  css  js  c++  java
  • 从无到有实现主从复制

    读写分离的实现需要两个步骤:

    第一:读写操作分别指向不同服务器。

    第二:不同服务器的数据保持同步。

    这里面的知识含量非常的大,我要做的是将流程尽量简化进行博客记录,方便日后更加直接高效的部署数据库。

    读写操作部分对于开发者来说最常用的方式是在项目中根据sql类型进行选择不同的数据库地址,如insert update 走主库  select走从库,还有一种方式是使用第三方开发的中间件服务。

    这篇博客主要记录主从复制。

    在网上找了一张图,虽然丑了点,但意思就是这样

    如图所示,完成主从复制的整个流程需要三个进程:

    (为了思路清晰,我特意按照顺序进行阐述)

    前提:开启二进制日志记录后,主库每次提交事务完成数据更新前,会将数据更新的事件记录到二进制日志中,然后才会进行事务提交。

    1.从库I/O线程:此线程会跟主库建立一个客户端连接,连接建立完成后,主库上会启动一个二进制转储线程。

    2.主库二进制转储线程:负责读取主库上的二进制日志中的事件,读取到后,从库I/O线程会将事件记录到从库的中继日志中。

    3.从库的SQL线程:该线程从中继日志中读取事件并在从库中执行,从而实现数据更新。

    接下来,我将根据标准流程部署主从复制。

    我这里开了两台虚拟机,centos1为主库,centos2为从库。

    创建复制账号:
    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO qq000@'192.168.31.%' IDENTIFIED BY 'ZZZxxx/123456'
    此sql主从都需执行一遍,至于主从都赋予这两个权限是因为从库需要有随时变成主库的准备。

    主库配置:
    vim /etc/my.cnf

    log_bin = mysql-bin
    server_id = 1

    (log_bin为二进制日志指定名称可自定义,server_id需要唯一,我的centos1设为1,centos2设为2)

    配置好后重启MySQL: 

    systemctl restart mysqld

    在MySQL中执行:

    show master status;

    会看到MySQL已经创建了二进制日志文件

    从库配置:
    vim /etc/my.cnf

    log_bin = mysql-bin
    server_id = 2
    relay_log = /var/lib/mysql/mysql-relay-bin
    log_slave_updates = 1
    read_only = 1

    (

    relay_id指定中继日志的路径,

    log_slave_update允许从库将其重放的事件也记录到自身的二进制日志中,

    read_only是设置从库只读状态 但不会影响slave同步复制的功能。

    )

    重启MySQL:

    systemctl restart mysqld

    在从库中执行sql进行复制目标的配置:

    CHANGE MASTER TO 
    MASTER_HOST='192.168.31.244',
    MASTER_USER='qq000',
    MASTER_PASSWORD='ZZZxxx/123456',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=0;

    开始复制:

    START SLAVE

    查看状态:

    SHOW SLAVE STATUS

    接下来很大几率就是解决各种报错的问题了

    这两个字段 必须为yes

    如果不对,那么下面这个字段会有报错信息:

    或者配置信息有误,或者防火墙不通(firewalld selinux),或者从库本身的数据和主库有比较大的差异。

    如果出现表存在库存在的错误 可以用如下两条三条sql搞定:

    stop slave;
    set global sql_slave_skip_counter=1;
    start slave;

    错误处理完成后 在主库创建一张表test_a

    从库自动同步

  • 相关阅读:
    PHP处理字符中的emoji表情
    CentOS 7 安装 PHP7.2 (LNMP环境搭建第二步)
    php 二维数组按某个字段排序
    JavaScript返回到上一页的方法
    常用正则表达式—手机号码
    JS实现斐波那契列数的三种方法
    常用正则表达式--金额
    PHP中三种设置脚本最大执行时间的方法
    生成指定长度随机字符串
    API常用签名验证方法(PHP实现)
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/8045274.html
Copyright © 2011-2022 走看看