本文是基于OceanBase V2.2.77版本 官方文档 做的学习记录,主要是目的是进行OBCP 考试,通过学习文档,希望了解OceanBase知识,最终考过OBCP。go!
本文内容大部分都是OceanBase 官网资料,做了一些比较显著的标志。
数据副本与服务
为了数据安全和提供高可用的数据服务,每个分区数据在物理上存储多份,每一份就是分区的一个副本。
副本:包括存储在磁盘上的静态数据(SSTable)、存储在内存的增量数据(MEMTable)、以及记录事务的日志三类主要的数据。
根据存储数据种类的不同,副本有几种不同的类型,以支持不同业务在在数据安全、性能伸缩性、可用性、成本等之间的选择。
全能型副本
目前支持的普通副本,拥有事务日志、MEMTable 和 SSTable 等全部完整的数据和功能。它可以随时快速切换为 Leader 对外提供服务。
日志型副本
只包含日志的副本,没有 MEMTable 和 SSTable。它参与日志投票并对外提供日志服务,可以参与其他副本的恢复,但自己不能变为主提供数据库服务。
加密投票型副本
包含加密日志的副本,没有 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) |
加密投票型 | 有,参与投票(STNC_CLOG) | 无(WITHOUT_MEMSTORE) | 无(WITHOUT_MEMSTORE) | 高 | 不支持 | 低 | 不可读写 | EncryptVote(E) |
只读型 | 有,异步日志,但不属于 Paxos 组,只是 Listener (ASYNC_CLOG) | 有(WITH_MEMSTORE) | 有(WITH_SSSTORE) | 中 | 不支持 | 高 | 可非一致性读 | READONLY(R) |
分区副本的个数和分布方式是由租户的资源单元决定的。
一个分区在每个 Zone 内有且只有一个副本
一个分区的在多个副本中有一个副本会被选举成主副本,主副本负责数据库服务,提供读写能力,数据的修改以 Redo 日志的形式通过 Paxos 一致性协议在多个副本间同步,其他备副本通过回放同步到 Redo 日志,保持与主副本的一致。
primary_zone
租户primary_zone 属性决定 分区主副本的选择策略,在创建租户的命令中可以指定 primary_zone 属性,也可以用 ALTER 语句来修改。
创建租户并指定 primary_zone语句
下面的语句创建了一个 Primary Zone 在 zone1 的租户。primary_zone='zone1' 表示租户 local_warehouse 创建的分区中所有的主都选在 zone1 上,只有当 zone1 出现故障时,分区的主才会选到其他的 Zone 上。
语句如下:
obclient> CREATE TENANT local_warehouse replica_num = 1, primary_zone='zone1', resource_pool_list=('pool_large1');
primay_zone 还可以指定多个 Zone,而且可以指定优先级。
primary_zone='zone1,zone2' 表示主在 zone1、zone2 两个 Zone 上均匀分布。
primary_zone='zone1;zone2;zone3' 表示主在 zone1 上,如果 zone1 出现故障,那么主选到 zone2 上。
primary_zone 配置:逗号 表示 Zone 为同等优先级; 分号表示前后的 Zone 是先后的优先级,分号前的优先级高
逗号和分号可以混用,primary_zone='zone1,zone2;zone3,zone4;zone5' 表示的是主选在 zone1 和 zone2 上均匀分布,如果 zone1 出现故障,那么主会选在 zone2 上,如果 zone1、zone2 出现故障,那么主会选在 zone3、zone4 上均匀分布。




