OceanBase的系统运行日志
OceanBase的系统日志(syslog)类似mysql的errorlog,是排查数据库问题的必备手段。系统日志一般位于observer的运行日志目录下。系统日志分了三种类型:observer.log、election.log和rootservice.log。
observer.log是每个observer的启动和运行日志,也是排查问题使用最多的日志。election.log是选举日志,顾名思义,主要记录分布式集群中选主的运行日志。rootservice.log,rootservice是ob集群的总控服务,负责ob集群的资源管理、负载均衡等,一般rootservice运行在某个observer上。
OceanBase数据库日志划分了6个级别,由高到低:ERROR、USER_ERROR、WARN、INFO、TRACE、DEBUG。可以通过系统参数syslog_level调整日志打印级别,参数值默认为INFO,即打印INFO及其以上的日志。在日志的目录中,除了observer.log文件还可以看到observer.log.wf文件,observer.log.wf日志文件只打印WARN及其级别以上的日志。值得注意的是WARN及其级别以上的日志在observer.log中也会打印,observer.log.wf更多的是方便排查和定位问题。通过集群参数enable_syslog_wf 可以控制是否把 WARN 以上级别的系统日志打印到一个单独的日志文件中,默认是True。
在日志目录下,可以看到很多带了时间戳的日志文件,这就是ob的日志轮转。ob中单个日志文件不超过256M,当observer.log写入达到256M时,原日志文件会停止写入并追加一个时间戳进行归档,日志写入到新生成的observer.log文件中。并且发生日志轮转时,wf日志文件即使没到 256MB 也会一起轮转,xxx.log.wf文件和xxx.log文件总是一一对应的。
[root@observer1 log]# ll | grep observer | more -rw-r--r-- 1 admin admin 46086514 Jul 11 15:10 observer.log -rw-r--r-- 1 admin admin 268438518 Jul 11 02:18 observer.log.20230711021818 -rw-r--r-- 1 admin admin 268440731 Jul 11 02:18 observer.log.20230711021820 -rw-r--r-- 1 admin admin 268440219 Jul 11 02:18 observer.log.20230711021821 -rw-r--r-- 1 admin admin 268438515 Jul 11 02:18 observer.log.20230711021823
日志自动清理。集群参数enable_syslog_recycle默认为True,代表开启自动清理日志。清理的阈值以文件数来确认,集群参数max_syslog_file_count表示最大日志文件数量。生产环境中设置的是300,需要注意的是max_syslog_file_count是指某种类型的日志文件数量,observer.log和observer.log.wf文件数量的上限都是300,此外还有election.log、election.log.wf、rootservice.log、rootservice.log.wf。因此日志文件总数应该是1800左右。
日志格式,从observer.log.wf文件可以看出,ob的日志内容是十分详细的,并且给出了源码打印日志的代码和函数,非常方便debug。但是,ob的日志相对比较原始,可读性较差,内容比较繁重,从这方面看会不利于问题的排查。
[root@observer1 log]# tail -10f observer.log.wf.20230711161459 [2023-07-11 16:14:58.815577] WARN load_file_to_string (utility.h:579) [3700602][0][Y0-0000000000000000-0-0] [lt=10] [dc=0] read /sys/class/net/team0/speed failed, errno 22 [2023-07-11 16:14:58.815586] WARN get_ethernet_speed (utility.cpp:628) [3700602][0][Y0-0000000000000000-0-0] [lt=7] [dc=0] load file /sys/class/net/team0/speed failed, rc -4000 [2023-07-11 16:14:58.815591] WARN [SERVER] get_network_speed_from_sysfs (ob_server.cpp:1868) [3700602][0][Y0-0000000000000000-0-0] [lt=3] [dc=0] cannot get Ethernet speed, use default(tmp_ret=0, devname="team10")
OceanBase的系统日志十分详细且复杂,通常一套OB集群需要规划300G的空间来放系统日志,这放在其他数据库是难以想象的。MySQL的错误日志一般最大也就几个G,也不需要日志的自动清理机制,从MySQL部署开始所有的错误日志都可以回溯。OceanBase复杂的日志内容相对会不方便排查问题,个人认为精简易用是OceanBase系统日志后续需要优化的一个方向,毕竟有时候简单好用才能让更多的人上手,累积更多的用户。
热门相关:恭喜你被逮捕了 豪门情变,渣总裁滚远点! 本法官萌萌哒 不科学御兽 大妆