为了数据安全和提供高可用的数据服务,每个分区数据在物理上存储多份,每一份叫做分区的一个副本。每个副本,包括存储在磁盘上的静态数据(SSTable)、存储在内存的增量数据(MemTable)、以及记录事务的日志三类主要的数据。根据存储数据种类的不同,副本有几种不同的类型,以支持不同业务在在数据安全、性能伸缩性、可用性、成本等之间的选择。
全能型副本:也就是目前支持的普通副本,拥有事务日志、MemTable 和 SSTable 等全部完整的数据和功能。它可以随时快速切换为 leader 对外提供服务。
日志型副本:只包含日志的副本,没有 MemTable 和 SSTable。它参与日志投票并对外提供日志服务,可以参与其他副本的恢复,但自己不能变为主提供数据库服务。
只读型副本:包含完整的日志、MemTable 和 SSTable等,但是它的日志比较特殊。它不作为paxos成员参与日志的投票,而是作为一个观察者实时追赶 paxos 成员的日志,并在本地回放。这种副本可以在业务对读取数据的一致性要求不高的时候提供只读服务。因其不加入 paxos 成员组,又不会造成投票成员增加导致事务提交延时的增加。
三种副本的具体差异如下表所示。
类型 | LOG | MemTable | SSTable | 数据安全 | 恢复为leader时间 | 资源成本 | 服务 | 名称(简写) |
全能型 | 有,参与投票(SYNC_CLOG) | 有(WITH_MEMSTORE) | 有(WITH_SSSTORE) | 高 | 快 | 高 | leader提供读写,follower可非一致性读 | FULL(F) |
日志型 | 有,参与投票(SYNC_CLOG) | 无(WITHOUT_MEMSTORE) | 无(WITHOUT_SSSTORE) | 低 | 不支持 | 低 | 不可读写 | LOGONLY(L) |
只读型 | 有,异步日志,但不属于paxos组,只是listener (ASYNC_CLOG) | 有(WITH_MEMSTORE) | 有(WITH_SSSTORE) | 中 | 不支持 | 高 | 可非一致性读 | READONLY(R) |
副本根据负载和特定的策略,由系统自动调度分散在多个 Server上。副本支持迁移、复制、增删、类型转换等管理操作。
副本的分布情况称为 Locality,这里的副本分布情况指各 Zone 内包含的副本数量以及副本类型,不同租户在同一个集群内可以配置不同的 Locality,并且彼此之间相互独立不受影响。Locality 是 OceanBase 赖于进行副本管理、负载均衡等的基础信息。