mysql主从分离的原理
从库在连接主库的时候创建一个io线程,用于接收主库的binlog日志,并将其存储在relay log日志,而主库是创建一个log dump线程来发送binlog给从库,从库新开一个sql线程读取relay log的内容以做到数据的同步
主从分离的目的
1)将读写流量分离开,方便后续单独的扩展。
2)大部分系统读大于写,通过主从分离搭建一主多从架构,分担读的压力
主从分离的问题
存在数据延迟的问题
在发微博的过程中会有些同步的操作,像是更新数据库的操作,也有一些异步的操作,比如说将微博的信息同步给审核系统,所以我们在更新完主库之后,会将微博的 ID 写入消息队列,再由队列处理机依据 ID 在从库中获取微博信息再发送给审核系统。
此时如果主从数据库存在延迟,会导致在从库中获取不到微博信息,整个流程会出现异常。
解决方案
第一种方案是数据的冗余。你可以在发送消息队列时不仅仅发送微博 ID,而是发送队列处理机需要的所有微博信息,借此避免从数据库中重新查询数据。
第二种方案是使用缓存。我可以在同步写数据库的同时,也把微博的数据写入到 Memcached 缓存里面,这样队列处理机在获取微博信息的时候会优先查询缓存,这样也可以保证数据的一致性。
最后一种方案是查询主库。我可以在队列处理机中不查询从库而改为查询主库。不过,这种方式使用起来要慎重,要明确查询的量级不会很大,是在主库的可承受范围之内,否则会对主库造成比较大的压力。
访问数据库的方式改变
以前只需要使用一个数据库地址就好了,现在需要使用一个主库地址和多个从库地址,并且需要区分写入操作和查询操作
解决方案
mycat中间件方案,由中间件去控制,业务层无感知
业务层控制,代码逻辑调整,读sql连接从库,写sql连主库
下期预告:
白话说分库分表,讲为什么分库分表,它的目的,随之而来产生的问题又应该如何去规避。