zoukankan      html  css  js  c++  java
  • mysql主从复制实战

    为什么需要主从复制?

    1. 在实际生产中,数据的重要性不言而喻
    2. 如果我们的数据库只有一台服务器,那么很容易产生单点故障的问题,比如这台服务器访问压力过大而没有响应或者崩溃,那么服务就不可用了,再比如这台服务器的硬盘坏了,那么整个数据库的数据就全部丢失了,这是重大的安全事故;
    3. 为了避免服务的不可用以及保障数据的安全可靠性,我们至少需要部署两台或两台以上服务器来存储数据库数据,也就是我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障了,其他服务器依然可以继续提供服务。

    主从复制是什么?

    1. MySQL提供了主从复制功能以提高服务的可用性与数据的安全可靠性
    2. 主从复制是指服务器分为主服务器和从服务器,主服务器负责读和写,从服务器只负责读,主从复制也叫master/slave, master 是主,slave 是从
    3. 主从复制可以实现对数据库备份和读写分离。

    主从复制架构

    主从复制流程解析

    1. 当master主服务器上的数据库发生改变时,则将其改变写入二进制时间日志文件中
    2. salve从服务器会在一定时间间隔内对master 主服务器上的二进制日志进行探测,探测其是否发生过改变,如果探测到master主服务器的二进制时间日志发生了改变,则开始一个 I/O Thread 请求master 二进制事件日志;
    3. 同时master 主服务器为每个I /O thread 启动一个dump Thread, 用于向其发送二进制事件日志。
    4. slave 从服务器将接受到的二进制事件日志保存至自己本地的中继日志文件中;
    5. salve 从服务器将启动SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致
    6. 最后I/O Thread 和SQL Thread 将进入睡眠状态等待下一次被唤醒。

     

    主从复制配置文件介绍

    配置Master的my.cnf文件(关键性配置) /etc/my.cnf
    log-bin=mysql-bin   //  开启二进制日志功能(必填项)
    
    server-id   = 1   // masterID(必填项且不能和slave冲突)
    
    binlog-do-db=icinga  
    
    binlog-do-db=DB2     //如果备份多个数据库,重复设置这个选项即可
    
    binlog-do-db=DB3   //需要同步的数据库,如果没有本行,即表示同步所有的数据库
    
    binlog-ignore-db=mysql  //被忽略的数据库
    配置Slave的my.cnf文件(关键性的配置)/etc/my.cnf
    
    log-bin=mysql-bin
    
    server-id=2
    
    replicate-do-db=icinga
    
    replicate-do-db=DB2
    
    replicate-do-db=DB3   //需要同步的数据库,如果没有本行,即表示同步所有的数据库
    
    replicate-ignore-db=mysql   //被忽略的数据库

    搭建一主一从

      1. 分别登上主从服务器的MYSQL

      2. 在主从服务器上分别新建数据库sync

      3. 在主服务器上创建复制数据的账号并授权  

        create user 'username'@'host' identified by 'password'; 
    grant replication slave on 'databasename.tablename' to 'username'@'host' identified by 'password'; # 这是详细到表的权限
    grant replication slave on *.* to 'username'@'host' ; 所有的数据库

    4. 修改主备数据库的配置文件
      主服务器配置
        查找my.cnf文件位置 whereis my.cnf
      在文件中添加:
        log_bin = mysql-bin # 日志文件名字
        binlog-format=ROW # 日志文件的格式
        server-id = 17 # 服务器的id,一定要是唯一的, 必填
        binlog_do_db=ddm # 对应需要实现主从复制的数据库 选填,这个可以写多个
    5. systemctl restart mysqld 重启mysql
    6.重新登录mysql在主服务器上执行命令,查看主服务器状态: show master status
    可以看到file那一列变成了mysql-bin.000001,配置成功。

    7. 如果主服务状态不是初始状态,建议重置状态,执行命令:
      reset master
    
    8. 从服务器配置
    退出mysql, 找到并编辑my.cnf文件
    添加以下内容:
    log_bin = mysql-bin
    server_id = 22
    relay_log = /var/lib/mysql/mysql-realay-bin
    log_slave_updates = 1
    read_only = 1
    log_bin默认情况下会使用机器名命名,这里设成和主库相同的名称,当然也可以设置成其他名称。
    relay_log指定中继日志的位置和名字
    log_slave_updates允许备库将其重放事件记录到自身的二进制文件中
    read_only会阻止没有权限的线程修改数据
    这里其实只有server_id是必填项,其他都是选填的。

    9. 保存好配置文件后,重启mysql
      systemctl restart mysqld
    10. 重新进入MySQL,使用change master to命令开始复制
    change master to master_host=‘10.145.1.17’,
    master_user = ‘repl’,
    master_password = ‘Repl123!@#’,
    master_log_file = ‘mysql-bin.000001’,
    master_log_pos = 0;
      启动slave 的数据同步
      start slave
      停止slave的数据同步
      stop slave


    11. 输入命令show slave statusG;查看状态

       Slave_IO_Running: No
       Slave_SQL_Running: No
       表示当前备库还没有开始复制。

    12. 输入命令:start slave;开始复制

     13. 在主数据库上运行 show processlistG;
       显示了来自10.145.1.22的连接,并等待更多的更



    现在来验证一下 
    现在这个配置,从服务器是没有权限修改数据的,一旦修改会出现

     这就说明,你的配置是对的,但是如果你修改成功了,

     注意:read_only=1只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户(如超级管理员root用户)的数据修改操作。

    详细请看https://blog.csdn.net/zhanyd/article/details/104997254


  • 相关阅读:
    java中split函数参数特殊字符的处理(转义),如:"." 、"\"、"|"
    Javascript编程风格
    HTTP 错误 500.0的解决方法。
    在WCF中进行大数据量传输
    “您已使用临时配置文件登陆”的解决方法
    关于命令行执行Migrations
    转一篇关于部署的文章
    MSDeploy使用备忘
    不可征服
    git初始化项目
  • 原文地址:https://www.cnblogs.com/miss103/p/14369735.html
Copyright © 2011-2022 走看看