读写分离

写请求处理

所有写请求都只会发往主节点,如果没有主节点则当前复制组不可处理写请求。

读请求处理

读请求会按照会话(连接)随机选择组内任意一个节点(对外透明),或按照当前会话(连接)配置的优先实例策略选取相应复制组的数据节点。在一次会话中如果上一次查询(包括 query 和 fetch)返回成功,则下一次查询不会重选节点;如果上一次查询发生失败,则下一次查询将重选节点。如果没有可用节点则返回失败。一次查询中不会重选节点。

实例

  • 复制组实例

    复制组中的每个数据节点都存储该复制组的一份完整数据,因此也称复制组中的每个节点为复制组实例。复制组实例可根据节点在复制组中的状态或者实例标识配置,分为 “主”,”备” 或 “1 - 255” 标识。

  • 数据库实例

    所有复制组中相同位置的复制组实例共同构成数据库实例,因此数据库实例也可以分为 “主”,”备” 或 “1 - 255” 标识。

Note:

实例的标识可以通过 SequoiaDB 的 instanceid 参数进行配置,范围是 1 - 255。请参考 数据库配置

设置会话读请求的策略请参考 Sdb.setSessionAttr()

最终一致性策略

为了提升数据的可靠性和实现数据的读写分离,SequoiaDB中,对于复制组间的数据采用“最终一致性”策略,在读写分离时读取的数据某一个时期内可能不是最新的,但最终是一致的。

  • 名词解释:

    W :副本写入个数 R :副本读取个数 N :副本个数

    在 SequoiaDB 中,设置 R 的值为1,且不可配置。

  • 默认情况下,复制组中的主节点在处理完一个写请求后会立即返回,即 W = 1。数据同步会在后台异步完成,并达到最终一致。此时外部的读请求获得的数据可能不是最新的。在对数据一致性要求不高的场景中,这种方式可以提供最优的写入性能。请参考 数据复制

  • 当我们创建集合时,可以通过 ReplSize 属性指定集合的 W 值。

    • 默认情况下 W = 1。
    • 当 ReplSize 等于0时,W 的个数会根据当前复制组的 N变化而变化。即,如果开始组内有三个节点,则 W 等于3。当新增加一个入节点时,W 会自动变为4。
    • 当手动指定 W 的个数时,不能超出当前复制组内节点个数。

    增大 W 可以有效提高数据的一致性和可靠性。当 W = N 并且写请求处理成功后,后续读到的数据一定是当前组内最新的。但是这样会降低复制组的写入性能。值得注意的是,虽然我们可以将W 设为 N,但这并不代表 SequoiaDB 中的数据拥有强一致性。当某个副本写入失败(如磁盘满)时,复制组内可能存在多个版本的数据。此时既可能读到新的数据,也可能读到旧的数据。当失败副本恢复正常后,会继续从主节点上同步最新的数据并达到最终一致。