zoukankan      html  css  js  c++  java
  • 如何保证数据库集群时候,主从库一致性的问题?

    转载:https://blog.csdn.net/xmh594603296/article/details/82461222

    前言:

      数据库集群,读写分离现在可以说是项目必备的了,但是我们如何保证其每个数据库的数据一致性?

     1 半同步复制

      简单的说就是: 主库发生增删改操作的时候,会等从库及时复制了并且通知了主库, 才会把这个操作叫做成功.

      优点:保证数据一致性

      缺点:就是会慢

    专业的讲:

      半同步复制,是等待其中一个从库也接收到Binlog事务并成功写入Relay Log之后,才返回Commit操作成功给客户端;如此半同步就保证了事务成功提交后至少有两份日志记录,一份在主库Binlog上,另一份在从库的Relay Log上,从而进一步保证数据完整性;半同步复制很大程度取决于主从网络RTT(往返时延),以插件 semisync_master/semisync_slave 形式存在。 

    2 数据库中间件

    如果有了数据库中间件,所有的数据库请求都走中间件,这个主从不一致的问题可以这么解决:

    所有的读写请求都走中间件,然后写的请求路由到主库,读的请求路由到从库

    但是我们中间件会记录写库的一个key,在设置一个允许同步时间,假设是1s

    当有一个写请求过来时候,生成一个key A ,马上路由写到主库,然后立马有一个读请求过来。 从库可能是旧数据,或者没有来得及同步。 如果时间是在1s内的,就对应的key继续路由到主库。如果在1s以后的,就路由到从库。

    说白了,中间件就是给个同步时间,给你同步,在同步时间内,所有的请求都落在主库

    3 缓存记录写key法

    1 将某个库上的某个key要发生写操作,记录在cache里,并设置“经验主从同步时间”的cache超时时间,例如1s

    2 修改数据库

    (1)先到cache里查看,对应库的对应key有没有相关数据
    (2)如果cache hit,有相关数据,说明这个key上刚发生过写操作,此时需要将请求路由到主库读最新的数据
    (3)如果cache miss,说明这个key上近期没有发生过写操作,此时将请求路由到从库,继续读写分离
    方案优点:相对数据库中间件,成本较低
    方案缺点:为了保证“一致性”,引入了一个cache组件,并且读写数据库时都多了一步cache操作

    总结:

    就是两个思路

    1  半同步复制 , 等从库复制成功才返回写成功

    2  设一个key记录着一次写的数据,然后设置一个同步时间,如果在这个时间内,有一个读请求,看看对应的key有没有相关数据,有的话,说明数据近期发生过写事件,这样key的数据就继续读主库,否则就读从库
    --------------------- 
    作者:X_Ming_H 
    来源:CSDN 
    原文:https://blog.csdn.net/xmh594603296/article/details/82461222 
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    用Photoshop设计网站的70个教程
    反射引发的错误“reflection Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.”
    机械键盘理解的几个误区和保养方法
    Asp.Net MVC中不指定View Name时如何返回ActionResult的
    [通告]Nuget服务宕机,出现 503 Server Unavailable 错误无法编译及解决方法
    MVC标签链接切换帮助类: TabLink
    [Centos 6.2] centos 6.2(64位)网络配置
    Linux(Ubuntu)设置环境变量(转载)
    COPYONWRITE 原理
    [Linux 技巧] linux screen 命令详解
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854488.html
Copyright © 2011-2022 走看看