功能原理
问题: SSTable、MemTable 工作原理,如何运维管理? 答: Oceanbase 中 DML 操作产生的数据修改会首先写入在 MemTable 中,当 MemTable 内存达到一定大小时通过转储将 MemTable 中的修改转化成对应的 SSTable,读取操作获取所有的 SSTable 和 MemTable,并逆序读取其中的修改合并出完整行。
系统租户管理员可以通过 alter system minor freeze 指令手动触发转储释放内存,通过 gv$memstore 查询租户内存使用情况,gv$memstore_info 查看 MemTable 信息。
问题: 数据存储、表空间管理方式,MVCC 实现原理。 答: Oceanbase 将磁盘存储空间切分为 2M 大小的宏块进行管理,通过元数据将宏块进一步组织成 SSTable。SSTable 和 MemTable 中保存了多版本数据,每行的数据修改按照版本号从新到旧组织在一起,读取数据时按照读取使用的版本号从最新数据逆序查找所需版本数据执行读取操作。
复制表
问题: 复制表是每个 zone 都存在一份,还是 zone 内对应的每台机器都存在一个?如果集群的副本配置为 2:2:2,是否比集群副本配置为 1:1:1 的数据量翻一倍?
答: 复制表本身只是一个事务同步的属性,数据量只取决于 locality 。如果集群副本配置为 2:2:2,假设副本属性为 3F + 3R,那数据量就翻倍。如果不需要每个机器上都有可读的复制表副本,那减少属性为 R 的副本数量,数据量也相应变化。
多租户
问题: 多租户资源隔离粒度。 答: OceanBase 的租户资源隔离粒度是 CPU 和内存级别,不同的租户可以配置不同的 CPU 和内存规格。
负载均衡
OceanBase 实现了动态负载均衡,租户间按照 CPU、内存和磁盘空间进行动态负载均衡;租户内部按照分区数、分区 Leader 分布以及磁盘空间来进行动态负载均衡。
选举
问题: OceanBase 数据库的故障切换时间最快能做到几秒?
答: 目前故障切换时间始终保证 RTO 在 30 秒内。故障切换不仅包括无主选举的时间,还有日志做 Paxos 恢复的时间,选主后新 Leader 汇报到 meta 表的时间,proxy 刷新 Location Cache 的时间。除选举以外的时 间都不好衡量,和数据量,分区数,机器数都有关系,因此 OceanBase 只对外承诺 30s。
备机读
问题: 如何查询备机读延时?
答: 通过 SQL 语句查询。
obclient > select table_id, partition_idx, usec_to_time(min_log_service_ts),min_log_service_ts,min_trans_service_ts,min_replay_engine_ts from __all_virtual_partition_info;
备机可读位点是取了如下三个时间戳(上述表中的三个列)的最小值: min(min_log_service_ts, min_trans_service_ts, min_replay_engine_ts)。
如果 min_trans_service_ts 和 min_replay_engine_ts 如果没有有效值,则表中查出的结果为 UINT64_MAX。
RS
问题: 执行 delete server 或减 zone 操作成功,但是一直无法结束。
答: 当 delete server 或减 zone 操作无法顺利结束时,首先需要确认操作的实际状态。可以通过以下 SQL 查询来查看任务的状态:
obclient> select job_status from oceanbase.__all_rootservice_job where job_type = "DELETE_SERVER";
- 结果为 INPROGRESS:操作仍在进行中,尚未结束。
- 结果转变为 SUCCESS:操作已成功结束。
减 zone 需要将 zone 上的所有 server 都移除即 delete server。而 delete server 操作需要将 server 上的所有 unit 都移除。移除 unit 方法,如果 unit 是没有被引用的,那么直接删除即可;如果 unit 被引用,则需要将 unit 迁移到同 zone 的其他 server 上。因此上述两个问题归根结底都是查看 server 上被引用的 unit 能否成功迁移,多数一直不能结束的原因也是因为 unit 不能迁移成功。
unit 无法迁移成功的原因如下:
zone 中只有一个 server,没有其他 server 能存放该 unit。
查看方法
select count(*) from __all_server where zone = '待减的zone';若结果为 1,则证明该 zone 上只有 1 个 server。
解决方法:
若是减zone操作:需要先将tenant(server上所有unit对应的所有tenant)的locality变更
alter tenant tenant_name locality='当前 locality 减去去掉 zone 的数量';若是delete server操作:该操作总不能成功。
有其他 server 但是那台 server 没有足够的资源来容纳该 unit
查看正在迁移的 unit 以及其目标端。
select migrate_from_svr_ip,migrate_from_svr_port from __all_unit;查看目标 server 资源是否足够。
副本少于多数派,不能进行副本迁移。
检查是否存在分区缺副本。
适用版本
OceanBase 数据库 V2.x、V3.x 版本。