DB主从同步设计

59 阅读3分钟

主从同步

  1. Master 服务器将数据的改变记录二进制Binlog日志,当Master上的数据发生改变时,则将其改变写入二进制日志中;
  2. Slave服务器会在一定时间间隔内对Master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求Master二进制事件
  3. 同时主节点为每个I/O线程启动一个Dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThreadSQLThread将进入睡眠状态,等待下一次被唤醒。

异步

半同步

上图中当slave通过I/O thread写入relaylog后会有一个sql_thread读取relay log中的sql然后执行

```

在备库上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。 在备库上执行start slave命令,这时候备库会启动两个线程,就是图中的io_thread和sqlthread。其中io-thread负责与主库建立连接。 主库校验完用户名、密码后,开始按照备库传过来的位置,从本地读取binlog,发给备库 备库拿到binlog后,写到本地文件,称为中转日志(relay log) sql-thread读取中转日志,解析出日志里的命令,并执行。 上图中当slave通过I/O thread写入relaylog后会有一个sql_thread读取relay log中的sql然后执行


1.  #### 一次DELETE过多数据

1.  #### 大事务

    1.  大事务这种情况很好理解。因为主库上必须等事务执行完成才会写入binlog,再传给备库。
    1.  所以,如果一个主库上的语句执行10分钟,那这个事务很可能就会导致从库延迟10分钟。

1.  #### 大表的DDL

### 数据一致性

1.  #### 强制走主库

    1.  对于必须要拿到最新结果的请求,强制将其发到主库上。比如,在一个交易平台上,卖家发布商品以后,马上要返回主页面,看商品是否发布成功。那么,这个请求需要拿到最新的结果,就必须走主库。
    1.  对于可以读到旧数据的请求,才将其发到从库上。在这个交易平台上,买家来逛商铺页面,就算晚几秒看到最新发布的商品,也是可以接受的。那么,这类请求就可以走从库。

1.  #### sleep方案

    1.  等一会再读

1.  #### 判断延迟方案

    1.  查询读库的延迟时间

1.  ##### 从库不读主库

    1.  如果从库不存在再读下主库,这种方案无法兼容数据删除&修改的场景

1.  ##### 增加缓存一致性