OceanBase 集群简介 
===================================



OceanBase 集群通常由运维人员管理，OceanBase 数据库集群将多个机器资源聚合成一个大的资源池之后再分配给不同租户（也称为实例）。OceanBase 不同租户之间彼此资源隔离，数据访问也是完全隔离的。

相关概念 
-------------

* OceanBase 集群的多副本架构

  OceanBase 集群通常是三副本架构，少数场景可能会使用五副本。在三副本架构下，OceanBase 集群的节点数通常是三的倍数，集群节点会分为三个区域( Zone )。每个 Zone 的节点数通常保持相等，可以有1或多个节点。每个租户的数据也会分布在这三个 Zone 里，但不一定用尽每个 Zone 的所有节点，这取决于租户资源池属性的设置，由运维人员确定。
  




<!-- -->

* OceanBase 集群的高可用能力

  在三副本架构的 OceanBase 集群里，默认每份数据也有三份，分布在三个 Zone 中。这个数据表示的最小粒度叫分区。分区是表的子集，有关表的详细介绍请参见"创建表"章节 。OceanBase 集群的高可用的粒度就是分区，故障切换时的切换粒度也是分区。所以 OceanBase 节点故障时，应用可能是部分数据访问中断，并且会自动恢复访问。当故障节点内部分区非常多的时候，不同数据的恢复时间可能有细微的区别。
  




<!-- -->

* OceanBase 的参数设置

  OceanBase 支持通过参数（parameters）来影响集群和租户的功能、性能等。集群参数通常是在sys租户里设置，影响范围是整个集群，也包括集群里的租户。同时 OceanBase 针对租户也支持用变量（variables）来设置，影响范围是当前租户。

  有关 OceanBase 常用的参数和变量请参考附录"OceanBase常用参数变量"。
  




<!-- -->

* OceanBase 的写特点

  当第一次向 OceanBase 的表中修改一笔数据时，OceanBase 会将该记录所在的块读入到内存中的一块只读区域中，然后在另外一块内存区域记录一笔修改记录。前者称为基线数据（SSTable），后者称为增量数据（MemTable），对应的内存称为增量内存。无论是插入、更新还是删除，OceanBase 都不会对 SSTable 进行修改，而是在原来的增量基础上追加（append）新的增量。这种设计使得 OceanBase 的写产生的 IO 非常少，性能很好。增量会一直在内存中不落盘，直到增量内存使用率超过一定阈值后触发冻结事件（Minor freeze），此时会生成新的 MemTable 供后续写入。老的增量 MemTable 会直接转储到磁盘上，或者直接跟磁盘里的 SSTable 进行合并（Major freeze）。
  



**说明**



默认设置下，OceanBase 的增量和基线数据合并操作会在凌晨2点进行。由于 OceanBase 的内存写这个特点，开发和运维都需要关注自己的业务对数据库内存的消耗速度。如果增量内存写入速度远快于增量转储或合并释放内存的速度，增量内存有可能会消耗完导致后续写入报错。此时需要在应用或数据库端做内存写入速度限流操作，或者对数据库实例内存进行扩容。

