RootService(简称RS)即总控服务,RS不是独立的进程,是启动于一号表__all_core_table(只有一个分区)的Leader所在的OBServer上的一组服务,当此Leader变为Follower时,会停止其上的RS模块,保证全局只有一个RS在工作。__all_core_table是整个集群启动时生成的第一张表,存储了RS启动需要的一些信息,通过__all_core_table可以逐级索引到所有其他分区。RS以系统租户作为载体,系统租户包含全部系统表及各种后台服务。RS承担元数据管理、集群资源管理、版本合并管理、执行管理命令等功能。
(1)元数据管理
RS通过心跳机制监控集群中各个OBServer的存活状态,并同步更新系统表,以及进行异常处理。同时也通过心跳向其他OBServer传输配置变更、模式变化等多种信息。__all_root_table存放所有系统表的分区信息,__all_tenant_meta_table存放所有用户表的分区信息,这些信息也由RS统一管理,其他OBServer执行请求时可以通过RS服务获取这些信息来定位要操纵的数据。RS通过RP C主动获取及定时任务维护元数据的准确性,通过位置缓存(Location Cache)模块对内部其他模块及外部OBProxy提供位置信息及副本级元信息的查询服务。为了避免队列线程池模型造成多个OBServer出现循环依赖问题,为每一级系统表使用单独队列,例如__all_core_table、__all_root_table、普通系统表、用户表分别有各自独立队列及工作线程。
(2)集群资源管理
集群资源管理包括Leader管理、分区负载均衡、资源单元(Resource Unit)负载均衡等任务。Leader管理包括将分区组中所有分区的Leader切到一起、将Leader切到主可用区(Primary Zone)、轮转合并及隔离切主等场景。分区负载均衡是指在租户的多个资源单元内调整分区组的分布,使得单元的负载比较均衡。资源单元负载均衡是指在多个OBServer间调度资源单元,使得OBServer的负载比较均衡。
(3)版本合并管理
不同于小版本冻结(转储)由各个OBServer自行处理,大版本冻结(合并)由RS协调发起,是一个由RS和所有分区Leader组成的两阶段分布式事务。某个分区无主会导致大版本冻结失败。合并可以由业务写入(转储达到一定的次数,由全局参数控制)触发,也可以定时触发(例如每日合并,一般设置于业务低峰期)或手动触发。RS还可以控制轮转合并,从而减少合并对业务的影响。
(4)执行管理命令
RS是管理命令执行的入口,包括BOOTSTRAP命令、ALTER SYSTEM命令和其他DDL命令。BOOTSTRAP是系统的自举过程,主要用于创建系统表、初始化系统配置等。DDL是指创建表、创建索引、删除表等动作,DDL不会被优化器处理,而是作为命令直接发送到RS,DDL产生的模式变更保存于系统表并更新到内存,然后产生新的版本号通知所有在线的OBServer,OBServer再刷新获得新版本的模式。
虽然有多副本机制保证RS可以容忍少数OBServer故障,但RS看起来依然是OceanBase集群中的一个单点,不过由于用户的查询和DML执行并不依赖于RS,因此即使RS短暂下线也不会影响用户的工作。此外,OceanBase采用了多项措施来保证RS的健壮性,RS异常后也能有副本来接替其工作,因此不会影响OceanBase集群的可用性。
OceanBase支持了一套检测机制,通过该机制发现RS的异常,并通过运维命令强制切换RS来恢复。RS异常包括RS无主、RS上任失败、RS线程卡住、快照点回收异常、配置项异常、工作线程满、DDL线程满等,主要分为两类:一类是RS可以正常服务请求;另一类是RS不可服务。前一类可以通过停服的方式隔离异常RS并将RS切到其他机器来解决;后一类包括RS上任失败、队列满等异常,可以通过外部工具来强制切换RS服务,新RS上任后再隔离原来的异常机器。
RS承担了命令入口的功能,从而可以采集系统状态,并执行运维命令和应急命令,但RS异常后会导致该通道失效。为此OceanBase支持了诊断租户的功能,诊断租户是一个独立的租户,预留专用资源,包括登录线程、工作线程和内存,保障异常情况下可以查询监控及简单运维SQL的执行,从而规避系统租户和用户租户线程异常及内存异常。