其实数据库的主从同步,就是为了要保证多个数据库之间的数据保持一致。最简
单的方式就是使用数据库的导入导出工具,定时将主库的数据导出,再导入到从库
当中。这是一种很常见,也很简单易行的数据库集群方式。也有很多的工具帮助我
们来做这些事情。但是这种方式进行数据同步的实时性比较差。
而如果要保证数据能够实时同步,对于MySQL,通常就要用到他自身提供的一套
通过Binlog日志在多个MySQL服务之间进行同步的集群方案。基于这种集群方案,
一方面可以提高数据的安全性,另外也可以以此为基础,提供读写分离、故障转移
等其他高级的功能。
即在主库上打开Binlog日志,记录对数据的每一步操作。然后在从库上打开
RelayLog日志,用来记录跟主库一样的Binlog日志,并将RelayLog中的操作日志在
自己数据库中进行重演。这样就能够更加实时的保证主库与从库的数据一致。
MySQL的Binlog默认是不打开的。
它的实现过程是在从库上启动一系列IO线程,负责与主库建立TCP连接,请求主
库在写入Binlog日志时,也往从库传输一份。这时,主库上会有一个IO Dump线
程,负责将Binlog日志通过这些TCP连接传输给从库的IO线程。而从库为了保证日
志接收的稳定性,并不会立即重演Binlog数据操作,而是先将接收到的Binlog日志
写入到自己的RelayLog日志当中。然后再异步的重演RelayLog中的数据操作。
MySQL的BinLog日志能够比较实时的记录主库上的所有日志操作,因此他也被
很多其他工具用来实时监控MySQL的数据变化。例如Canal框架,可以模拟一个
slave节点,同步MySQL的Binlog,然后将具体的数据操作按照定制的逻辑进行转
发。例如转发到Redis实现缓存一致,转发到Kafka实现数据实时流转等。而
ClickHouse也支持将自己模拟成一个MySQL的从节点,接收MySQL的Binlog日
志,实时同步MySQL的数据。