什么是主从同步
主从同步使数据可以从一台数据库服务器复制到其他的服务器上,在复制数据时,一台服务器充当主服务器(master),其他的服务器充当从服务器(slave)。
因为复制是异步进行的,所以从服务器不需要一直和主服务器保持连接,它可以通过拨号的方式间断地连接主服务器。通过配置文件,可以指定复制所有的数据库还是某个数据库,甚至是某个数据库上的某个表。
主从同步的目的
- 可以提高数据的性能。在主服务器上执行写入和更新,在从服务器上向外提供读功能。通过动态地调整从服务器的数量,可以动态调整整个数据库的性能。
- 可以提高数据安全。数据复制到从服务器,从服务器可以选择终止复制进程,所以可以在从服务器上备份数据而不破坏主服务器的数据库结构和数据。
- 生成实时数据在主服务器上进行,分析数据在从服务器上进行,可以提高主服务器的性能。
- 数据备份,主从同步可以保证备份及时,而且多地备份,保证数据的安全。
主从复制的原理和过程
主从复制主要依赖三种线程:
binlog 线程:记录下所有改变了数据库数据的语句,并放入 master 上的 binlog 中。
I/O 线程:负责从主服务器上读取 binlog 内容,并写入到从服务器的中继日志(Relay log)。
SQL 线程:负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay )。
复制的具体过程:
- 主服务器在每个事务更新数据完成之前将该操作记录串行地写入到 binlog 文件中。
- 从服务器开启一个 I/O 线程,该线程会在主服务器上打开一个普通连接,主要是读取主服务器上的 binlog 内容,如果读取的进度已经跟上了主服务器,那么会进入睡眠状态并等待主服务器产生新的事件。最终目的是将 binlog 中内容写入到中继日志中。
- SQL 线程会读取中继日志,并顺序执行中继日志中的事件,保证从服务器和主服务器的数据一致。
主从复制的延迟解决
MySQL 中有两种同步机制,分别为:
- 半同步机制:也叫做 semi-sync 复制,主要用来解决主数据库的数据丢失问题。主库写入 binlog 之后,会立即强制将数据同步到从库,从库将事件写入到自己的 relay log 之后会返回一个 ack 给主库,主库接收到至少一个从库的 ack 才会认为写操作完成。
- 并行复制:主要用来解决主从复制的延迟问题。从库会开启多个线程并行读取 relay log 中不同库的内容,然后并行重放不同库的日志,为库级别的并行。
读写分离
基于主从复制的架构,主服务器处理写操作和实时性较高的读操作,而从服务器处理读操作,实现读写的分离。
读写分离能提高性能的原因在于:
- 主从服务器负责各自的读和写,很大程度上减少了锁的竞争。
- 从服务器可以使用 MylSAM,提升查询性能及节约系统的开销。
- 增加冗余,提高可用性。
读写分离常通过代理的方式实现,代理服务器接收到应用层发来的读写请求,然后决定转发到那个服务器。