OBServer工作目录下通常有admin、bin、etc、etc2、etc3、lib、log、run、store这九个目录,但这九个目录并非都是必须安装的。在启动OBServer时必须要确保存在的是etc、log、run、store,同时store下应该有clog、ilog、slog、sstable这四个子目录。
bin和lib两个目录用于存放形成OBServer进程实例的可执行文件以及相关的依赖库文件。如果采用OBD部署,bin目录下的可执行文件observer实际上是一个指向OBD仓库中observer文件的符号链接。
etc、etc2、etc3三个目录都是配置文件目录。这三个目录里的内容是完全一致的,其中etc是所谓的“活跃”配置文件目录,只有在该目录下修改系统配置才会被OBServer读入并应用,etc2和etc3中的配置文件是etc中的两个完全相同的备份。当etc中的配置被修改并且被OBServer重新载入后,OBServer会把新的配置信息重新备份到etc2和etc3中。
每个配置文件目录中都有两个文件,其中observer.config.bin是配置文件,而observer.config.bin.history则是最近一次配置文件修改之前的旧版配置文件。虽然etc2和etc3中配置文件的内容和etc中一样,但配置文件的名称有所不同,etc2和etc3的配置文件名中不是“config”而是其缩写“conf”。
log目录是存放运行日志的目录,里面包含了OBServer日志、RootService日志和选举(Election)日志,节点运行过程中输出的各种过程记录都会分门别类地进入到上述几种日志中,例如系统启动、各种调试信息、执行的SQL语句等。
由于运行日志收集的信息庞杂且数量巨大,运行日志文件的膨胀速度会很快。为了更好地利用运行日志,OceanBase对运行日志采用分段管理,单个日志段文件大小为256M,每次切换到新的日志段时,会将上一个日志段文件重命名,在其文件名后加上切换的日期时间作为后缀。为了防止运行日志目录过度膨胀,OceanBase提供了enable_syslog_recycle和max_syslog_file_count两个配置参数用来回收运行日志所占用的存储空间。其中,enable_syslog_recycle用于控制运行日志的自动回收,而max_syslog_file_count用于设置每种运行日志的最大日志段文件数量。
run目录在系统处于运行状态时包含两个文件:mysql.sock和observer.pid,前者是OB Server监听MySQL协议端口时需要的套接字文件,后者存着OBServer的进程号(PID),系统关闭时通过这个PID向OBServer发出关闭信号。
store目录中保存着当前OBServer的数据文件,其中包含clog、ilog、slog、sstable这四个子目录。
(1)clog
clog子目录中包含事务日志CLog。OceanBase数据库的CLog日志类似于传统数据库的重做(Redo)日志。OceanBase数据库中的CLog日志记录的是对最小逻辑数据单元(行)的各种修改操作,对更大范围数据(例如表文件、分区等)修改的日志则不在CLog中记录。CLog日志起到两方面的作用:①分区的多个副本之间依靠clog日志进行同步,即Leader将CLog流传送给Follower们,Follower们在自己的数据上重放(Redo)收到的CLog日志完成对Leader上数据的追赶;②系统恢复时需要依靠CLog、CLog检查点等进行数据恢复。
(2)ilog
ilog子目录存储的是日志目录,全称是Index Log(ILog)。ILog中记录的是同一个分区中一个已经形成多数派的事务日志(对应于一个Log ID)的位置信息,因此ILog可以看成是CLog中日志记录的一个索引,用于优化事务日志的定位和读取。很明显,删除ILog中的数据乃至删除整个ILog文件都不会影响clog,当然也不会影响数据持久性,但可能会影响系统的恢复时间。
CLog和ILog都是多个分区混写的,即多个分区上的日志会按照产生的时间写入顺序日志文件中,但不同分区的日志有独立日志编号(Log ID)体系,每个分区的日志编号都是从1开始并连续递增。
CLog和ILog会尽量用满分给日志盘的磁盘空间,默认配置达到日志盘空间80%时开始复用(即覆盖)旧的日志文件。不过,旧的日志文件是否可复用还需要依赖其他的约束,例如日志所对应的数据是否已被归档,因此在某些场景下日志盘的空间占用会高于80%。
CLog和ILog的文件没有对应关系,由于ILog仅记录日志的位置,因此同样数量的事务日志在ILog中的空间占用会比CLog中小很多,自然一般情况下ILog的文件数目也比CLog文件数目少很多。
(3)slog
slog中存放的是存储日志SLog(Storage Log)。虽说SLog在名称上是与存储有关的日志,但正如前文对CLog的介绍,与行相关的日志并不属于SLog而是由CLog管理,SLog中管理的是除行操作之外的其他存储相关的日志,例如新增租户、分区创建和新增SSTable等。
一个OBServer只拥有一个全局的SLog,也就是说同一台OBServer上具有不同资源池的不同租户并不具有单独的SLog文件,所有租户的SLog写入请求最后都会汇入这个SLog文件中。
准确来说,只有把SLog和CLog结合在一起才算是完整的存储日志。
(4)sstable
sstable是基线数据目录。sstable目录下只有一个名为block_file的文件,这个文件在OBServer启动后就会被创建,文件的大小由配置参数datafile_size(绝对大小)或datafile_disk_percentage(占可用空间的百分比)控制,整个OBServer上所有的基线数据(不管是哪个表或者分区的数据)都保存在这个唯一的数据文件中。sstable中数据的具体组织见4.2.4节。