MySQL主从复制原理

什么是主从复制、读写分离以及为什么要使用

  • 主从复制:是一种数据备份的方案
    简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。
    
  • 读写分离:是一种让数据库更稳定的使用数据库的方法
    是在有从数据库的情况下使用,当主数据库进行对数据的增删改也就是写操作时,将查询的任务交给从数据库。
    
  • 为什么要使用主从复制和读写分离操作呢?
    主从复制:
    	1.当主数据库出现问题时,可以当从数据库代替主数据库,可以避免数据的丢失。
    	2.可以进行读写分离
    
    读写分离:
    	1.避免从数据库进行写操作而导致的主从数据库数据不一致的情况,因为当主从数据库数据不一致时,那么从数据库最主要的备份任务就没有意义了。
    	2.减轻主数据库的压力。因为进行写操作更耗时,所以如果不进行读写分离的话,写操作将会影响到读操作的效率。
    

MySQL主从复制原理

  • 1.主从复制原理图

    在这里插入图片描述

  • 2.主从复制工作(过程)原理
    1.从库执行change master to 命令(主库的连接信息+复制的起点)
    2.从库会将以上信息,记录到master.info文件
    3.从库执行 start slave 命令,立即开启IO_T和SQL_T
    4. 从库 IO_T,读取master.info文件中的信息,获取到IP,PORT,User,Pass,binlog的位置信息
    5. 从库IO_T请求连接主库,主库专门提供一个DUMP_T,负责和IO_T交互
    6. IO_T根据binlog的位置信息(mysql-bin.000002 , 448),请求主库新的binlog
    7. 主库通过DUMP_T将最新的binlog,通过网络传输给从库的IO_T
    8. IO_T接收到新的binlog日志,存储到TCP/IP缓存,立即返回ACK给主库,并更新master.info
    9. IO_T将TCP/IP缓存中数据转储到磁盘relaylog中.
    10. SQL_T读取relay.info中的信息,获取到上次已经应用过的relaylog的位置信息
    11. SQL_T会按照上次的位置点回放最新的relaylog,再次更新relay.info信息
    12. 从库会自动清理应用过的relay文件
    
    补充说明:
    一旦主从复制构建成功,主库当中发生了新的变化,都会通过dump_T发送信号给IO_T,增强了主从复制的实时性.
    

MySQL主从复制搭建步骤

  • 部署环境
    MASTER:192.168.1.11/24
    SLAVE1:192.168.1.13/24
    SLAVE2:192.168.1.14/24
    提前已经安装了MYSQLD
    
  • 搭建主从复制的前提
    (1) 2个或以上的数据库实例
    (2) 主库需要开启二进制日志功能
    (3) server_id要不同,区分不同的节点
    (4) 主库需要建立专用的复制用户 (replication slave)
    (5) 当从库为后建时,从库应该通过备份主库、恢复的方法进行"同步之前的数据"
    (6) 人为告诉从库一些复制信息(ip port user pass,二进制日志起点)
    (7) 从库应该开启专门的复制线程
    
  • 1.建立时间同步环境,在主节点上搭建时间同步服务器
    • 1.1 安装NTP(关闭防火墙/selinux)
      yum install -y ntp
      
    • 1.2 配置NTP
      vim /etc/ntp.conf
      server 127.127.1.0 #本地时间供给源
      fudge 127.127.1.0 stratum 8 #设置时区为+08区
      
    • 1.3 重启服务并设置为开机启动
      systemctl restart ntpd
      systemctl enable ntpd
      
  • 2.在从节点上进行时间同步(关闭防火墙/selinux)
    yum install -y ntpdate
    ntpdate 192.168.1.11
    
  • 3.主服务器配置:
    • 3.1 修改主服务器配置文件
      vim /etc/my.cnf
      server_id = 11 (增加)           //用于识别主从
      log_bin = master-bin(增加)         //开启二进制日志
      log_slave_updates = true(增加)    //允许从服务器拉取数据
      
    • 3.2 重启服务器
      systemctl restart mysqld
      
    • 3.3 登录mysql程序,给服务器授权
      mysql -u root
      mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.1.%' IDENTIFIED BY '123456';    //授予只能在192.168.1网段进行远程登录数据库的用户myslave复制权限(8.0以前,可以自动创建用户并授权【创建用户myslave,密码是123456】)
      mysql> FLUSH PRIVILEGES;
      mysql> show master status;    //查看当前数据库实例最新的二进制文件名称及节点编号
      

      在这里插入图片描述

      生成的二进制文件位置(/var/lib/mysql):

      在这里插入图片描述

      若遇到密码不符合,可进行修改

      在这里插入图片描述

  • 4.从服务器配置:
    • 4.1 修改从服务器主配置文件
      vim /etc/my.cnf
      server_id = 22 (修改)
      relay_log = relay-log-bin(增加)        //开启中继日志
      relay_log_index = slave-relay-bin.index(增加)   //添加索引,加快速度
      
    • 4.2 重启mysqld
      systemctl restart mysqld
      
    • 4.3 在从服务器上配置同步
      mysql -u root -p
      mysql> change master to master_host='192.168.1.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=602;
      启动同步:
      mysql> start slave;     //启动同步
      mysql> stop slave;      //关闭同步
      查看slave状态,确保以下两个值为yes
      mysql> show slave status\G;      //\G:竖着显示,默认是横向显示
      
      注意:
      怎么证明主从复制成功了?
      	IO线程、SQL线程都为yes的时候就表示主从复制成功了
      MariaDB [(none)]> show slave status\G;
      
      	 Slave_IO_Running: Yes
           Slave_SQL_Running: Yes
      

      在这里插入图片描述

      在这里插入图片描述

  • 5.验证
    • 在MASTER上创建测试数据库,搭建完成后,可以在主库show slave hosts查看有哪些从库节点
      mysql> show slave hosts;
      mysql> create database db_test;
      

      在这里插入图片描述

遇到过的错误

  • 错误1
    • 在这里插入图片描述

    • 解决方法:
      MariaDB [(none)]> stop slave;
      Query OK, 0 rows affected, 1 warning (0.00 sec)
      
      MariaDB [(none)]> reset slave;
      Query OK, 0 rows affected (0.00 sec)
      
      MariaDB [(none)]> change master to master_host='192.168.1.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1050;
      Query OK, 0 rows affected (0.00 sec)          //主数据库节点编号已修改为1050
      
      MariaDB [(none)]> start slave;
      Query OK, 0 rows affected (0.00 sec)
      
      
  • 错误2(从数据库配置文件错误)
    • 在这里插入图片描述

    • 在这里插入图片描述

    • 解决方法:
      • 在这里插入图片描述
  • 错误3(从数据库server_id未修改成功)
    • 在这里插入图片描述

    • 在这里插入图片描述

    • 解决方法:
      • 如同错误2
  • 错误4
    • 在这里插入图片描述

    • 解决方法:
      • 1.关闭slave(备库操作)

        MariaDB [(none)]> stop slave;
        Query OK, 0 rows affected (0.00 sec)
        
      • 2.查看master的binlog和pos值(在主库操作)

        mysql> show master status;
        +-------------------+----------+--------------+------------------+-------------------+
        | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
        +-------------------+----------+--------------+------------------+-------------------+
        | master-bin.000001 |     2549 |              |                  |                   |
        +-------------------+----------+--------------+------------------+-------------------+
        1 row in set (0.00 sec)
        
        
      • 3.修改slave的pos和binlog值(备库)

        MariaDB [(none)]> change master to master_host='192.168.1.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2549;
        Query OK, 0 rows affected (0.00 sec)
        
      • 4.启动slave(备库)

        MariaDB [(none)]> start slave;
        Query OK, 0 rows affected (0.00 sec)
        
      • 5.查看状态(备库)

        MariaDB [(none)]> show slave status\G;
        

uery OK, 0 rows affected (0.00 sec)
```

* 4.启动slave(备库)

  ```
  MariaDB [(none)]> start slave;
  Query OK, 0 rows affected (0.00 sec)
  ```

  

* 5.查看状态(备库)

  ```
  MariaDB [(none)]> show slave status\G;
  ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值