1.首先介绍几个概念
1.1 高可用
“高可用”(High Availability)通常用来描述一个系统经过专门的涉及,从而减少停工时间,从而保持其服务的高度可用性。
打个比方,就是说,我写了一个web应用,对外提供一个查询天气的服务,每天都有大量的用户登录我的应用查询天气,如果我把它只部署在一台服务器上,那么当我这台服务器发生故障时,我对外提供的服务也随之而停,这就不是高可用,而如果我用了两台服务器,通过nginx做了负载均衡,那么,当我一台服务器停掉之后,还有另一台服务器供用户使用,这就做到了高可用性。
2.mysql主从同步
同样的,我们使用的数据库也是这样,当我们只有一台服务器当作数据库时,如果读写数据量非常大,那么,这个数据库的压力也大,当它宕掉时,我们的整个服务都不能继续了。并且由于我们没有备份,还面临着用户数据丢失的危险。
所以为了高可用,为了分担数据库的压力,我们需要多台数据库,而多台数据库又怎么使用呢?
我们首先考虑到的是 数据库备份,因为数据真的非常重要,如果发生大量数据丢失的情况,是极其影响用户体验的。
首先,我们想到的是一台数据库用来供应用程序读写,另一台数据库做数据备份,我们暂且称被应用程序读写的数据库为主库(master),备份数据库为从库(slave),当我们的应用程序向Master中写数据时,我们的master 同时同步数据到 slave,这样,我们就实现了数据库数据的备份。但是,在应用程序写入数据的时候,数据库应该什么时候告诉应用程序已经写入成功呢。想一下,总共又三种方式。第一,当应用程序向Master数据库写入成功时,不管Slave有没有同步完毕数据,立即向应用程序返回成功,这种方式成为异步方式。第二,当有多台slave时,应用程序向Master数据库写入成功,这时,如果有一台slave同步数据成功,那么就向应用程序返回成功,这种方式成为半同步方式。第三,只有程序向Master和所有的slave写入成功时才返回,这种方式叫做半同步方式。
并且,Master又是怎么向Slave同步数据的呢?
Mysql经过深思熟虑,想出了一种比较好的同步数据的方案,也就是现在Mysql主从同步正在用的方案,
具体描述如下:
在主从同步过程中,主服务器(Master)有一个工作线程 I/O dump thread,从服务器(slave)有两个工作线程 I/O thread 和SQL thread.
当写入数据时,Master 把接收到的sql请求 记录到自己的 binlog日志中,Slave的 I/O thread 去请求Master 的binlog,然后binlog日志写入到 中继日志中,然后从库 的Sql thread执行sql语句,当然,Master 通过 I/O dump thread 给 Slave 的 I/O thread 传送 binlog日志。
综上,这就是mysql主从同步的原理。