最近,我在学习和体验oceanbase数据库的过程中,对该数据库有了较初步的认识。其中有几个概念,与其它数据库有所区别,因此我从官方文档中整理了出来,方便大家归纳总结。
一、OceanBase的副本类型
OceanBase 数据库中支持多种副本类型,包含:
1)全能型副本 FULL( F )
目前支持的普通副本,拥有事务日志、MEMTable 和 SSTable 等全部完整的数据和功能。它可以随时快速切换为 Leader 以对外提供服务。
2)日志型副本 LOGONLY( L )
只包含日志的副本,没有 MEMTable 和 SSTable。它参与日志投票并对外提供日志服务,可以参与其他副本的恢复,但自己不能变为 Leader 提供数据库服务。
3)加密投票型副本 EncryptVote( E )
包含加密日志的副本,没有 MEMTable 和 SSTable。它参与日志投票并对外提供日志服务,可以参与其他副本的恢复,但自己不能变为 Leader 提供数据库服务。
加密投票型副本仅支持部署在加密 Zone 上,不支持部署在常规读写 Zone上。有关加密 Zone 的详细信息,参见 增加或删除加密 Zone。
4)只读型副本 READONLY( R )
包含完整的日志、MEMTable 和 SSTable 等。但是它的日志比较特殊,它不作为 Paxos 成员参与日志的投票,而是作为一个观察者实时追赶 Paxos 成员的日志,并在本地回放。这种副本可以在业务对读取数据的一致性要求不高的时候提供只读服务。因其不加入 Paxos 成员组,又不会造成投票成员增加导致事务提交延时的增加。
一个分区在一个 Zone 中最多有一个全功能或日志型副本(这些类型的副本是 Paxos 复制组的成员),一个分区的只读型副本在同一个 Zone 中可以有多个。
二、OceanBase的Zone
1)一个 OceanBase 集群由若干个 Zone 组成。Zone 是可用区(Availability Zone)的简写。Zone 本身是一个逻辑概念,是对物理机进行管理的容器,一般是同一机房的一组机器的组合。从物理层面来讲,一个 Zone 通常等价于一个机房、一个数据中心或一个 IDC。为交付高级别的数据安全性和服务可用性能力,一个 OceanBase 集群通常会分布在同城的 3 个机房中,同一份数据的三个副本分别分布在 3 个机房中(即 3 个 Zone 中)。
OceanBase 数据库支持数据跨地域(Region)部署,且不同 Region 的距离通常较远,从而满足地域级容灾的需求(如两地三中心或三地五中心)。一个 Region 可以包含一个或者多个 Zone。而在tidb数据库中,Region代表分片,类似于OB中的表分区。
Region 并不是一个 OceanBase 数据库的对象定义,而是 Zone 的关键属性之一。对于租户、数据库、数据分区(表和索引等)不同级别均有主可用区(Primary Zone)的属性配置,可用于支持高可用和负载均衡能力。Primary Zone 表示 Leader 副本的偏好位置。指定 Primary Zone 实际上是指定了 Leader 更趋向于被调度到哪个 Zone 上。
2)通过 SQL 语句增加或删除普通 Zone
使用 root 用户登录数据库的 sys 租户,然后执行:
ALTER SYSTEM {ADD|DELETE} ZONE zone_name;
3)增加或删除加密 Zone:
加密 Zone 和加密投票型副本的使用有一定限制,具体限制如下:
a, 加密 Zone 上仅支持部署加密投票型副本,不支持部署其他类型的副本,例如全功能型副本、只读型副本、普通日志型副本等均不能部署在加密 Zone 上。
b, 加密投票型副本仅支持部署在加密 Zone 上,不支持部署在读写 Zone上。
使用 root 用户登录数据库的 sys 租户,依次执行以下语句,设置加密模式并生成主密钥:
obclient> ALTER SYSTEM set tde_method = ‘internal’;
obclient>ALTER INSTANCE ROTATE INNODB MASTER KEY;
执行以下语句,检查上一步中生成的主密钥是否生效:
obclient> SELECT min(max_active_version) FROM oceanbase.__all_virtual_master_key_version_info WHERE tenant_id = 1;
查询结果中min(max_active_version)大于 0 时,则表示主密钥已生效。
执行以下命令,添加加密 Zone:
obclient> ALTER SYSTEM ADD Zone ‘z3’ zone_type = ‘encryption’;
obclient> CREATE RESOURCE POOL sys_pool2 unit_num = 1, resource_pool_list=(‘z3’), unit=‘sys_unit_config’;
obclient> ALTER TENANT sys resource_pool_list = (‘sys_pool’,‘sys_pool2’);
obclient> ALTER TENANT sys LOCALITY = ‘F@z1,F@z2,E@z3’;
如果需要删除加密 Zone:
obclient> ALTER SYSTEM DELETE ZONE ‘z3’;
4)修改 Zone 的 SQL 语句如下:
ALTER SYSTEM {ALTER|CHANGE|MODIFY} ZONE zone_name SET [zone_option_list]
例:
obclient> ALTER SYSTEM ALTER ZONE zone1 SET REGION=‘HANGZHOU’,IDC=‘HZ1’;
5)启动或停止 Zone 的 SQL 语句如下:
ALTER SYSTEM {START|STOP|FORCE STOP} ZONE zone_name;
6)隔离故障 Zone
当 Zone 故障后,您可以通过隔离操作将故障 Zone 上的 Leader 切换到其他机器上,以此尝试恢复用户的写服务和集群内的日志同步。待集群恢复正常后,尝试通过先 Stop Zone 后再重启故障机器的方式来解决问题。
隔离故障 Zone 的 SQL 语句如下:
obclient> ALTER SYSTEM ISOLATE ZONE ‘zone_name’;
该语句仅支持在 sys 租户中执行。
obclient> SELECT * FROM oceanbase.__all_zone WHERE zone= ‘zone1’ and name=‘status’; --status 字段为 stopped,表示该 Zone 处于 stopped状态。
隔离故障的 Zone 后,如果需要解除隔离状态,可以通过执行 ALTER SYSTEM START ZONE ‘zone1’ 命令来完成。
三、关于observer
每一个 OceanBase 数据库的进程 observer 由 IP 和端口作为唯一标识。通常一台物理或者虚拟服务器运行一个 observer 进程。observer 进程作为 OceanBase 数据库最核心的进程负责几乎所有数据库内核功能,包括 SQL 引擎、存储引擎和事务引擎。分布式的功能也同样在这个进程中,包括 RPC 通信、负载均衡和分区管理等。
通过命令向集群中添加 OBServer 节点
通过命令添加 OBServer 节点前,需要提前准备好对应版本的 OceanBase 数据库 RPM 包。有关 OceanBase 数据库 RPM 包的获取方式,请联系 OceanBase 技术支持人员。
通过 root 用户登录到 OceanBase 数据库的 sys 租户。
(可选)依次执行以下语句,添加 Zone,并设置 Zone 的区域与 IDC 属性。
说明
如果是向已有的 Zone 中添加 OBServer 节点,则该步骤可省略。如果需要新增 Zone 并向其中添加 OBServer 节点,则需要执行该步骤。
例如要添加 Zone 为 zone4,且 REGION=‘HANGZHOU’,IDC=‘HZ1’ 为例:
obclient> ALTER SYSTEM ADD ZONE zone4 REGION HANGZHOU;
obclient> ALTER SYSTEM START ZONE zone4;
obclient> ALTER SYSTEM ALTER ZONE zone4 SET REGION=‘HANGZHOU’,IDC=‘HZ1’;
通过 ssh 登录到待添加的 OBServer,进行安装前检查。
进入工具所在的目录。
[root@hostname /]# cd /root/t-oceanbase-antman/clonescripts
执行以下命令,开始检查:
[root@hostname clonescripts]# sh precheck.sh -m ob
执行以下命令,检查时钟同步情况,保证所有节点的时钟偏差在 100 ms 以内。
其中,$IP 表示集群中其他 OBServer 的 IP 地址。
[root@hostname /]# ntpdate $IP
安装 OceanBase 数据库的 RPM 包。
其中,rpm_dir 表示存放 RPM 包的目录;$rpm_name 表示 RPM 包的名称。
[root@hostname /]# cd $rpm_dir
[root@hostname $rpm_dir]# rpm -i --prefix=/home/admin/oceanbase $rpm_name
启动 OBServer,并将 OBServer 注册到集群:
–设置 admin 用户的 ulimit
[admin@hostname oceanbase]$ ulimit -s 10240; ulimit -c unlimited
配置环境变量:
[admin@hostname oceanbase]$ export LD_LIBRARY_PATH=/home/admin/oceanbase/lib:$LD_LIBRARY_PATH LD_PRELOAD=’’
启动 OBServer:
语句如下:
[admin@hostname oceanbase]$ /home/admin/oceanbase/bin/observer -i eth0 -P XXXX -p YYYY -z zone1 -d /home/admin/oceanbase/store/obdemo -r ‘xxx.xxx.xxx.xxx:xxxx:xxx.xxx.xxx.xxx:xxxx xxx.xxx.xxx.xxx:xxxx:yyyy’ -c 20190716 -n obdemo -o “memory_limit_percentage=90,memstore_limit_percentage=60,datafile_disk_percentage=80,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2”
其中:
-P大写 参数用于指定 RPC 端口号。
-p小写 参数用于指定直连端口号。
-z 参数用于指定待加入的 Zone。
-d 参数用于指定数据的存储目录。
-r 参数用于指定待添加的 OBServer 的 IP 地址列表。
-c 参数用于指定集群 ID。
-n 参数用于指定集群名。
-o 参数用于指定启动配置项。
注意
1)在启动 OBServer 时,请务必指定正确的 Zone 名称和初始化参数值。
2)再次通过 root 用户登录到 OceanBase 数据库的 sys 租户,向集群中添加 OBServer 节点。
其中,IP 表示待添加的 OBServer 的 IP 地址;PORT 表示 OBServer 的 RPC 端口号,默认为 2882。
3)obclient> ALTER SYSTEM ADD SERVER ‘PORT’ ZONE ‘zone4’;
该操作会将 OBServer 加入到服务列表,只有服务列表中的 OBServer 才可以提供服务。
4)添加后,可以执行以下语句,确认列表中是否有刚才添加的 OBServer,如果有,则表示添加成功。
obclient> SELECT * FROM oceanbase.__all_server;
写在最后:
另外,oceanbase的存储引擎,同时兼容mysql和oracle数据库,并且为了避免大量的随机写放大和checkpoint操作,使用了内存+LSM-Tree的写入方式,避免了随机写,让数据有序存储在磁盘上,也是很有实际意义的地方。
评论

