大家都知道,
MySQL
主从复制时使用的
binlog
日志,它记录了所有的
DDL
和
DML
语句(除了数据查询语
句
select
、
show
等),以事件形式记录,还包含语句所执行的消耗时间。
MySQL
主从复制有以下几个步骤:
1. master
(主库)在每次准备提交事务完成数据更新前,将改变记录到二进制日志
(binary log)
中;
2. slave
(从库)发起连接,连接到
master
,请求获取指定位置的
binlog
文件;
3. master
创建
dump
线程,推送
binlog
的
slave
;
4. slave
启动一个
I/O
线程来读取主库上
binary log
中的事件,并记录到
slave
自己的中继日志
(relay log)
中;
5. slave
还会起动一个
SQL
线程,该线程从
relay log
中读取事件并在备库执行,完成数据同步;
6. slave
记录自己的
binlog
。
通过上述步骤完成主从同步,需要将
binlog
推送到从库,然后再读取到
relay log
,从库在启动
SQL
进行进
行
sql
语句的执行,时间太漫长; 有没有什么方法可以减少这种同步时间,或者如果
redis
、
hive
想从
MySQL
主库同步数据,该如何加快同步速度?
binlog
记录了
Mysql
数据的实时变化,是数据同步的基础,服务需要做的就是遵守
Mysql
的协议,将自己
伪装成
Mysql
的
slave
来监听业务主库
binlog
,完成数据实时同步。
问:伪装成
Mysql
的
slave
来监听业务主库
binlog
,完成数据实时同步,有啥好处?
答:可实时更新缓存
业务查询类服务往往会在
mysql
之上架设一个缓存,减少对底层数据库的访问;当
mysql
库数据变化时,
如果缓存还没有过期那么就会拿到过期的数据,业务期望能够实时更新缓存。
利用
binlog
服务,根据策略实时将数据同步到
redis
中,这样就能够保证了缓存中数据有效性,减少了对
数据库的调用,从而提高整体性能。
如下图所示:
评论