一 通过binlog的方式来同步
二 从库binlog入库的是单线程(5.6版本前)
从库从主库同步binlog日志,写入relay日志,然后写入数据库,是单线程的。
在5.6版本之后,可以配置多线程IO读取。但写都是单线程的。
三 主从会延迟
从库写要比主库慢一点,当主库1000次/秒的写速度时,从库要比主库慢 几十毫秒。
如果主库达到了 4000次/秒,可能快撑不住了,此时从库会慢上几秒。
四 数据丢失问题
- 现象:当数据写入binlog还没有同步到从库时,主库挂了,从库切换为主,则未同步的数据就会丢失。
- 处理方案:mysql半同步机制。mysql提供了 semi sync 设置,打开这个设置,则一个数据写入binlog,并且在从库中也写入了数据库后,才返回ack,提示数据写入完成。
四 数据同步延迟问题
- 现象:从库同步数据要比主库速度要慢一点点。
- 处理方案:mysql并行复制机制。从库会开启多个线程对relay日志进行不同库的读取,然后写入不同的从库中。并行读写,提高效率(意义不大,提升很小,因为是按照库级别而不是表级别)。
五 数据时效性问题
因为数据主从同步会出现延迟,可能10ms,20ms,30ms。那么对于时效性要求非常高的,比如一写入要求马上读取出来的数据,建议还是直接从主库上直接读取(数据库中间件可以设置直连主库),一般不建议这样操作。
1 从库读取binlog开启多线程IO写到relay日志
2 从库开启并行复制从relay日志分库加载数据
3 代码编写尽量不要一写入就立刻查询
4 如果真的非常需要马上一写入就查询,可以开启中间件直连主库读,但不建议,违背主从复制
5 进行分库分表,降低主库压力,提高同步效率
网友评论