前言

“我正在参与「启航计划」”

作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“鄙陋”方法解决繁琐问题,让杂乱的问题变得通俗易懂。

支持作者: 点赞、重视、留言~

之前咱们说过,大聪明新加入了一个才智运送渠道建造的项目组,在项目组中学习到了许多之前没有触摸过的东西。这不,大聪明又发现渠道的建造进程中使用了两套 MySQL 数据库,也便是咱们常说的主从库,这时分大聪明有了一个新的疑问:“这个主库和从库是怎样确保数据一致的呢?”。这个新的问题又激起了大聪明的求知欲,接下来咱们一同看看大聪明的求知历程✍

MySQL 主从库

其实在建立一些小的应用软件时,使用一套数据库就够了,那咱们先来一同看一下为什么会用到主从库

使用主从库的主要原因有两点:

1、在杂乱的事务系统中,假如有一句 sql 句子需求锁表,那么就会导致咱们暂时不能使用这张表的读服务,这也就有或许影响到正常运转中的事务。假如此刻咱们使用主从库,让主库担任写,从库担任读,这样即便主库出现了锁表的情形,经过读从库也能够确保事务的正常运作。

2、架构的扩展,事务量越来越大,单机无法满意高频率的I/O拜访,此刻做多库的存储,能够下降单个磁盘I/O拜访的频率,从而提高效率。

已然咱们使用到了主从库,那么咱们就需求确保主从库的数据是一致的,这样无论系统读取哪一套 MySQL 的数据都能够确保结果是正确的,此刻咱们就需求用到主从仿制了。

MySQL 主从仿制

主从仿制的概念很简单,他指的是数据能够从一个 MySQL 数据库服务器主节点仿制到一个或多个从节点,说白了便是 CTRL+C、CTRL+V 。

MySQL主从仿制是一个异步的仿制进程,底层是基于 MySQL 数据库自带的二进制日志功用(也便是 Binlog)。便是一台或多台 MySQL 数据库从另一台 MySQL 数据库进行日志的仿制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致(主从仿制是 MySQL 数据库自带功用,咱们无需凭借第三方东西)。

接下来咱们一同看看主从仿制的原理

① master 服务器将数据的改动记载二进制 binlog 日志,当 master 上的数据产生改动时,则将其改动写入二进制日志中。

② slave 服务器会在必定时间间隔内对 master 服务器的二进制日志进行探测,判断其是否产生改动,假如产生改动,则开始一个 I/O Thread 请求 master 二进制文件内容。一起传送过来的信息,会记载到 master.info 中。

③ 一起主节点为每个 I/O 线程发动一个 dump 线程,用于向其发送二进制文件,并保存至从节点本地的中继日志(即Relaylog)中,接下来从节点发动 SQL 线程从中继日志中读取二进制日志并在本地重放,而且把应用过的内容记载到 relay-log.info 中,使得其数据和主节点的保持一致,最终 I/O Thread 和 SQL Thread 将进入睡眠状况,等待下一次被唤醒。

大聪明教你学Java | 带你了解 Binlog 实现 MySQL 主从同步的原理及实现方式

MySQL 主从同步时,能够选择的 Binlog 形式有3种,分别是 statement、row、mixed。

  • statement: 会将对数据库操作的 sql 句子写入到 Binlog 中
  • row: 会将每一条数据的变化写入到 Binlog 中
  • mixed: statement 与 row 的混合。MySQL 决定什么时分写 statement 格局的,什么时分写 row 格局的 Binlog。

依据现在的实际情况来说,主张将 Binlog 形式设置为 ROW。因为现在随着固态硬盘的遍及,磁盘 I/O 的性能得到大幅提高,在SSD加持下, I/O 成为瓶颈的或许性比较小,而且 ROW 形式的 Binlog 记载了完好的变更信息,在康复数据上面将会很简单。即便我不音讯误删了一行记载,我也能够经过 Binlog 捞回本来的一切字段信息,然后转变成 insert 进行插入;假如履行的是 update 句子,因为 ROW 形式的 Binlog 会完好记载修正前和修正后的整行数据,所以也能够很简单的进行康复。句子如下

— 是将 mysql-bin.000001 文件中 position 在1000到1200字节之间的内容解析出来,放到 MySQL 中履行 mysqlbinlog /var/log/mysql/mysql-bin.000001 –start-position=1000 –stop-position=1200 | mysql -h127.0.0.1 -P3306 -uuser−p user -p pwd;

MySQL 主从装备步骤

主机装备 修正装备文件: vi /etc/my.cnf

#主服务器仅有ID server-id=1 #启用二进制日志 log-bin=mysql-bin #设置不要仿制的数据库(可设置多个) binlog-ignore-db=mysql binlog-ignore-db=information_schema #设置需求仿制的数据库 binlog-do-db=需求仿制的主数据库名字 #设置logbin格局 binlog_format=ROW

从机装备 修正装备文件: vi /etc/my.cnf

#从服务器仅有ID server-id=2 #启用中继日志 relay-log=mysql-relay

重启主、从 MySQL 服务,并关闭防火墙

service mysqld restart

systemctl status firewalld.service

在主机上建立帐户并授权 slave

#在主机MySQL里履行授权指令 GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’ IDENTIFIED BY ‘slave’;

#查询master的状况,输出的内容在装备从机时会用到 show master status;

在从机上装备需求仿制的主机

#仿制主机的指令 CHANGE MASTER TO MASTER_HOST=’主机的IP地址’, MASTER_USER=’slave’, MASTER_PASSWORD=’slave’, MASTER_LOG_FILE=’mysql-bin.xxxx’,MASTER_LOG_POS=xxx; ​ #发动从服务器仿制功用 start slave; ​ #查看从服务器状况(假如输出的 Slave_IO_Running、Slave_SQL_Running两个参数值都为YES,则说明咱们装备成功了) show slave status;

小结

自己经历有限,有些当地或许讲的没有特别到位,假如您在阅读的时分想到了什么问题,欢迎在谈论区留言,咱们后续再一一探讨‍

期望各位小伙伴动动自己可爱的小手,来一波点赞+重视 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)

假如文章中有错误,欢迎大家留言纠正;若您有更好、更独到的了解,欢迎您在留言区留下您的名贵主意。

爱你所爱 行你所行 遵从你心 无问东西