• mysql--主从复制


    前戏

    当我们的网站部署到生产环境之后,如果只有一个数据库,当这个数据库宕机之后,用户就访问不了我们的网站了,这会给公司带来很大的损失。那我们想,可不可以有两个或多个数据库,里面的数据都是一样的,当一个数据库宕机之后,人工切换到备份数据库,这样就不会大大的减少公司的损失。

    MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。

    MySQL数据库支持单向、双向、链式级联等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(slave),当接收来自master上binlog文件的日志内容,解析出SQL语句。重新更新到slave,使得主从服务器数据达到一致。

    主从复制的逻辑有以下几种

    一主一从,单向主从同步模式,只能在master端写入数据。

    一主多从

    双主主复制逻辑架构,此架构可以在Master1或Master2进行数据写入,或者两端同事写入(特殊设置)

     在生产环境中,MySQL主从复制都是异步的复制方式,既不是严格的实时复制,但是给用户的体验都是实时的。MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。

    利用复制功能当Master服务器出现问题时,我们可以人工的切换到从服务器继续提供服务,此时服务器的数据和宕机时的数据几乎完全一致。

    复制功能也可用做数据备份,但是如果人为的执行drop,delete等语句删除,那么从库的备份功能也就失效了。

    主从复制实现原理

     上图可以分为以下步骤

    • master是主库,用户可以往这里读写数据。
    • master将变动的数据,写入到一个binlog中,记录数据库的sql变化
    • slave服务器,指定和谁同步,然后slave开启一个线程,去读主库的binlog中的sql变动记录
    • 从服务器将那些sql变动写入到自己的中继日志中,然后在将这些sql在slave本机在执行一次

    master主库配置

    环境准备:

    准备两台服务器,安装两个mariadb

    1.开启binlog功能,修改/etc/my.cnf
    vim /etc/my.cnf #写入

    [mysqld]
    server-id=1   #指明主库的身份id为1
    log-bin=mysqls14-bin   #指明binlog的日志名
    server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin,可以自己定义

    2.修改了配置文件,重启mariadb,使得binlog生效

    systemctl restart mariadb 

    3.登录mysql,检查主库的状态

    show master status;

    4.创建一个用户,用于进行主从同步

    create user 'kangchen'@'%' identified by 'kangchen666';

    5.授予账号权限,授予一个从库的身份权限

    grant replication slave on *.* to 'kangchen'@'%';

    6.锁定mysql的表,防止数据写入

    flush table with read lock;

    7.主从同步,将从库与主库的数据,保持一致后,它俩都在同一个起跑线,然后解除锁表,一同写入数据,保证数据一致性

    # 1.导出当前的数据,用于slave机器导入数据,保证在一个起始点
    mysqldump -u root -p --all-databases > /data/db.dump
    
    # 2.将此db.dump文件远程传输给 slave机器,用于导入
    scp /data/db.dump  root@192.168.12.87:/tmp/
    
    # 3.登录slave从库,导入主库的数据信息
    mysql >  source /tmp/db.dump 
    
    # 4.查看主库和从库的信息,是否一致
    show databases;

    8.查看主库的状态信息,binlog信息

    show master status; 

    File是二进制日志文件名,Position 是日志开始的位置。后面从库会用到 后面从库会用到 后面从库会用到!!!!!!

    9.解锁表,开始主从同步

    unlock tables;

    到此为止,主库已经设置完成了,接下来我们设置从库

    slave从库配置

    数据库的server-id在主从复制体系内是唯一的,Slave的server-id要与主库和其他从库不同,并且注释掉Slave的binlog参数。

    1.在/etc/my.cnf当中写入server-id ,并注释掉binlog参数

    vim /etc/my.cnf

    [mysqld]
    server-id=3

    2.重启myariadb

    systemctl restart mariadb

    3.查看slave机器的身份信息

    show variables like 'server_id';
    show variables like 'log_bin';

    4.通过命令,开启主从同步技术

    change master to master_host='192.168.12.96',
    master_user='kangchen',
    master_password='kangchen666',
    master_log_file='mysqls14-bin.000001',
    master_log_pos=671;

    5.开启slave

    start slave;

    6.检查slave状态,检查两条参数,如果都是yes,即主从ok

    show slave statusG;   # 执行这行代码查看下面两行信息
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes

    此时可以在主库中写入数据,查看从库中是否生成了记录

    注意此处还未配置从库的只读模式,只需在slave服务器上配置/etc/my.cnf,加上以下配置,并且在slave上创建普通用户,使用普通用户主从同步即可达到只读的效果

    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    log-error=/var/log/mysqld.log
    server-id=3
    read-only=true
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8

    如果用root用户,无法达到readonly。

  • 相关阅读:
    支付清结算之基本概念和入门
    支付清结算之账户和账务处理
    支付系统设计:支付系统的账户模型(一)
    Docker架构和原理
    Docker容器的原理、特征、基本架构、与应用场景
    Docker的用途与原理
    Random函数的安全性问题与SecureRandom
    nginx配置https
    CentOS Docker 安装
    Nginx能做什么
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/11620921.html
Copyright © 2020-2023  润新知