php主从数据库主键一致 数据库 主从

数据库读写分离如何保证主从一致性当我们php主从数据库主键一致的数据库压力主键变大的时候,我们会尝试增加一些从节点来分摊主节点的查询压力 。而一般来说,我们是用一主多从的结构来作为读写分离的基本结构 。
而一般来说我们有两种常用的方法来实现读且分离架构:
客户端直接分离
这种方式是由客户端,或者我们的微服务直接进行数据库的读写选择 。将读库选择路由到主库上进行 , 将查询路由到从主库上进行 。
这种方式的优点在于因为是直连所以性能比较高,但是需要由业务团队php主从数据库主键一致了解数据库的实例细节,当数据库做调整的时候就需要业务侧同步改造 。
使用数据中间件代理
这种方式是由一层代理层对数据的读写做分发,业务层将所有的请求都通过代理来实现 。
这种方式的优点在于对于业务层不需要感知到数据库的存在,但问题在于数据中间件的性能要求较高 , 还需要专人来进行优化和维护,整体架构较为复杂 。
但是我们发现 , 尽管这两种方式各有优劣 。但核心都是通过数据的写入、查询请求的路由而实现的,那么这就会引发标题的问题:
主备同步存在延迟,所以在延迟时间内对插入的内容进行查询则无法查询到最新提交的事务 。
那么如何保证主从一致性的问题 , 其实就变成了如何处理主从延迟的问题 。
根据项目的大?。?团队的规模以及主机的部署模式 。我们处理问题的方法也有很多种 。
最简单强硬的就是强制读主库 。
一般情况下我们在不同的查询中会有不同程度的一致性要求 。我们可以将需要保证数据一致性的请求配置强制查询主库 , 而对于无强依赖的查询请求仍然查询备库 。
尽管这个方案不是很优雅,但是是最简单实现的方法,并且在Spring等框架的支持下一般只需要加一个注解就能实现 。但这个方法的问题也是显而易见的,如果存在大量的强一致性要求的查询语句,则相当于没有进行读写分离与扩展 。那么这种方法就会导致系统在数据库层面没有有效的扩展手段了 。
由于问题产生的来源是主从延迟,所以在下一次查询的时候进行一段时间的等待以弥补这种延迟即可 。
所以在进行主库的数据插入之后,让数据库数据连接或者对应的执行线程等待一段时间后返回 。通过等待时间来消化掉主从备份的延迟时间 。但是这个方法也有一些问题比如:这个等待时间一般是固定的 , 即便主从已经无延迟了也会继续等待到时间结束php主从数据库主键一致;如果在服务高峰时期,有可能数据在等待时间结束后仍然没有完成同步则仍然会存在一致性问题 。
但这种方法优雅的地方是可以配合业务来进行实现,举例来说当用户下单之后,通过下单送卷或者下单抽奖的方式从前端拖住用户,从而当用户在一次连续操作中再次查询自己订单的时候中间必然会间隔一定时间,也就让需要再次查询数据的时候保证了数据的一致性 。
上述两种方案看起来可能不那么“技术” , 感觉有点投机取巧 。那么下面咱们可以分两种情况来讨论用更高技术的方法如何实现一致性 。
对于主从复制来说,是当主库完成一个事务后,通知给从库,当从库接受到后,则主库完成返回客户端 。所以当主库完成事务后,仅能确保从库已经接受到了,但是不能保证从库执行完成,也就是导致了主从备份延迟 。
但是从库执行数据是有进度的 , 而这个进度是可以通过show slave status语句中的seconds_behind_master来进行描述 , 这个参数描述从库落后了主库数据多少秒,当这个参数为0时,我们可以认为从库和主库已经基本上没有延迟了,那么这时候就可以查询请求 。

推荐阅读