当前位置: 首页 > 科技观察

数据库主从不一致,如何解决?_0

时间:2023-03-18 11:59:07 科技观察

在说数据库和缓存一致性之前,先说说数据库主从的一致性。Q:常见的数据库集群架构是怎样的?答:一主多从,主从同步,读写分离。如上图所示:一个主库提供写服务,多个从库提供读服务,可以增加从库的读性能。主从之间的数据同步。表现。问:为什么会出现不一致?答:主从同步有延迟。在这个延迟期间,可能会从从库读取到不一致的数据。如上图所示:服务发起写请求,服务发起读请求。这个时候同步还没有完成,读到了一个不一致的脏数据。数据库主从同步***在画外音之前完成:任何数据冗余都必然导致一致性问题。Q:如何避免这种主从延迟造成的不一致?答:有几种常见的方法。解决方案一:无视任何脱离业务的架构设计就是耍流氓。大多数业务,如:百度搜索、淘宝订单、QQ新闻、58贴等,都允许短期不一致。画外音:如果业务可以接受,最推荐这种方式。如果业务可以接受,就不要把系统架构搞得太复杂。方案二:强制读master如上图所示:使用一个高可用的master库提供数据库服务读写都落在master库上使用缓存提高系统读性能这是一种很常见的微服务架构,可以避免数据库主从一致性问题。方案三:SelectiveReadMasterForcedReadMaster太粗糙了。毕竟写请求的数量很少,短时间内可能会读到脏数据。是不是可以意识到只有这段时间,可能从从库读取脏数据的读请求是从master读取的,但通常是从slave读取的?您可以使用缓存来记录必须从master读取的数据。如上图所示,当写请求发生时:写主库将哪个库,哪个表,哪个主键三个信息组装成一个key,设置到缓存中。这条记录的超时时间设置为“主从同步延时”画外音:key的格式为“db:table:PK”。假设主从延迟为1s,那么这个key的缓存超时时间也是1s。如上图所示,当一个读请求发生时:要读取哪个库,哪个表,哪个主键数据,这三个信息组合成一个键,在缓存中进行查询。如果该key存在于缓存中,说明1秒内刚刚发生了写请求,数据库主从同步可能还没有完成。这时候应该去master数据库查看缓存中没有这个key,说明最近没有发生写请求。这个时候可以去从库里查一下这个。确保你读到的不是不一致的脏数据。综上所述,主库和从库不一致。常见的优化方案有几种:业务尚可,系统未优化强制master读,主库高可用,使用缓存提高读性能。记录缓存中哪些记录有写请求,来路由读主或读从文很短,不能解决所有问题,但希望能给大家一些启发。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文

猜你喜欢