undefined

一、高性能数据库集群:读写分离

基本原理是将数据库读写操作分散到不同的节点上。例如数据库主机负责读写操作,从机负责读操作。
引入了两个问题:主从复制延迟分配机制

1. 主从复制延迟

以 MySQL 为例,主从复制延迟可能达到 1 秒,如果有大量数据同步,延迟 1 分钟也有可能。会导致从主机读取的数据和从机读取的数据不一致。

解决办法:

  • 写操作后的读操作指定发给主服务器。缺点:和业务强绑定,对业务的侵入和影响较大,新来的程序员可能会写出bug
  • 读从机失败后再读一次主机。二次读取,无需和业务绑定,但是如果有很多二次读取,会增加主机的读压力。
  • 关键业务读写操作全部指向主机,非关键业务采用读写分离。

2. 分配机制

需要解决访问那台机器的问题,将读写操作区分开来,然后访问不同的数据库服务器,一般有两种方式:程序代码封装中间件封装

  • 程序代码封装。在代码中抽象一个数据访问层,实现读写操作分离和数据库服务器连接的管理。
    但是需要解决故障情况下,如果主从发生切换,则可能需要所有系统都修改配置并重启。且每个语言都需要实现。
    阿里的 TDDL 是一个通用的数据访问层,所有功能封装在 jar 包,具有主备、读写分离、动态数据库配置等功能
  • 中间件封装。将作为数据库集群和业务之间的中间人。
    难点:1. 所有的数据库操作请求都要经过中间件,对性能要求高。2. 中间件需要探测数据库服务器的主从状态。3. 需要支持完整的 SQL 语法和数据库服务器的协议,实现复杂
    MySQL 官方提供了 MySQL Router,主要功能有读写分离、故障自动切换、负载均衡、连接池等