OBServer 启动失败,错误代码 4070

问题描述

observer 进程启动失败,错误信息如下。

[admin@hostname oceanbase]$ ./bin/observer [2019-06-03 22:00:27.989583] ERROR [SHARE] load_config (ob_config_manager.cpp:94) [1899][Y0-0000000000000000] [lt=130] Deserialize server config failed(path=“etc/observer.config.bin”, ret=-4070) BACKTRACE:0x30fab39 0x3088b57 0x5867d5 0x1bb281e 0x12d300d 0x12d8238 0x40e96d 0x7f6b82983445 0x42e0b5 [2019-06-03 22:00:27.994936] WARN [SHARE] strict_check_special (ob_server_config.cpp:171) [1899][Y0-0000000000000000] [lt=4] invalid cluster id(ret=-4147, cluster_id.str()=“0”) [2019-06-03 22:00:27.994948] ERROR [SERVER] init_config (ob_server.cpp:585) [1899][Y0-0000000000000000] [lt=9] some config setting is not valid(ret=-4147) BACKTRACE:0x30fab39 0x3088b57 0x431b49 0x12d3790 0x12d8238 0x40e96d 0x7f6b82983445 0x42e0b5 [2019-06-03 22:00:27.994970] ERROR [SERVER] init (ob_server.cpp:105) [1899][Y0-0000000000000000] [lt=21] init config fail(ret=-4147) BACKTRACE:0x30fab39 0x3088b57 0x431b49 0x12d8754 0x40e96d 0x7f6b82983445 0x42e0b5 [2019-06-03 22:00:27.994986] WARN [SERVER] destroy (ob_server.cpp:200) [1899][Y0-0000000000000000] [lt=13] destroy observer begin

可能原因

可以通过如下步骤排查错误原因:

  1. 通过错误信息第一行给出的信息,判断是 observer 进程在读取配置文件时发生了错误,因此使用以下命令查看配置文件。

[admin@hostname ~]$ cat /home/admin/oceanbase/etc/observer.config.bin

  1. 发现执行 cat命令返回为空,使用 vim编辑器打开文件时显示乱码,说明导致 observer 进程启动失败的原因是由于配置文件损坏。

背景信息

observer.config.bin 文件存放在 /home/admin/oceanbase/etc目录中。在 OBServer 启动时,该文件用于获取之前的参数设置。如果该文件不存在或文件不可用,OBServer 会使用默认参数启动,而对于实际应用场景,默认参数往往不能满足启动要求,例如 zone 的名称、rootservice_list 等参数都需要根据实际情况指定。该文件的更新动作是随时发生的,任何系统参数的更改都会记录在这个文件中。对于该文件中没有的参数,系统会使用默认值。

observer.config.bin.history文件是 observer.config.bin文件的备份。在这两个文件没有损坏的前提下,每次重启 observer 进程,OBServer 都将进行以下操作:

  1. 将 observer.config.bin.history文件删除。

  2. 将 observer.config.bin文件重新命名为 observer.config.bin.history文件。

  3. 新生成一个 observer.config.bin文件,并且在当前 observer 进程的生命周期中,根据用户更改系统参数的情况,记录和更新这个最新生成observer.config.bin文件。

如果 observer.config.bin文件损坏,将导致启动 observer 进程失败。造成文件损坏的原因有很多,比较常见的原因是机器意外重启或者断电。

解决方法

对于 2-2-2 及以上集群,可以将同一个 Zone 中另一台 OBServer 上的 observer.config.bin复制到故障 OBServer 上。

说明

对于 2-2-2 集群,相同 Zone 中的配置文件 observer.config.bin在同一个 Zone 内的节点上基本相同(仅节点级配置会有区别),不会影响文件的 checksum 校验。

步骤如下:

  1. 登录同一个 Zone 的另一台 OBServer,执行远程复制命令,将该 OBServer 的 observer.config.bin文件复制到故障的 OBServer 上。

其中 observer_ip 表示故障 OBServer 的 IP 地址。

[root@hostname /]# scp /home/admin/oceanbase/etc/observer.config.bin root@<observer_ip>:/home/admin/oceanbase/etc/

  1. 启动故障的 OBServer。

[root@hostname /]# su admin [admin@hostname /]$ cd /home/admin/oceanbase && ./bin/observer

对于 1-1-1 集群,该文件在每个节点的配置会存在不同,手动修改将导致头部的 checksum 校验失败,因此不能简单复制其他正常节点的 observer.config.bin到已经发生问题的节点上。

可以通过以下步骤来解决问题。

  1. 删除损坏的 observer.config.bin文件。

[admin@hostname ~]$ rm -rf /home/admin/oceanbase/etc/observer.config.bin

  1. 手动启动 observer 进程。

使用 -z参数指定副本的 zone 名称,使用 -o参数指定 rootservice_list。如果有其他参数,可以追加到 -o参数指定的字符串中,各参数间通过逗号(",") 分隔。

例如,要启动的 OBServer 副本的 zone 名称为 ZONE_3,rootservice_list 参数为xxx.xxx.xx.xxa:2882:2881;xxx.xxx.xx.xxb:2882:2881;xxx.xxx.xx.xxc:2882:2881,并需要添加额外参数memory_limit_percentage=90来配置租户的内存使用率,则启动命令为:

[admin@hostname ~]$ cd oceanbase [admin@hostname oceanbase]$ ./bin/observer -z ZONE_3 -o “rootservice_list=xxx.xxx.xx.xxa:2882:2881;xxx.xxx.xx.xxb:2882:2881;xxx.xxx.xx.xxc:2882:2881,memory_limit_percentage=90”

说明

如果忘记了之前的参数值,同时 observer.config.bin文件损坏导致无法读取,可以通过读取其他正常节点的 observer.config.bin文件获取参数值。方法为:strings /home/admin/oceanbase/etc/observer.config.bin也可以读取本地的 observer.config.bin.history,方法为:strings /home/admin/oceanbase/etc/observer.config.bin.history

  1. 启动后,检查 __all_server系统表,通过以下 SQL 查看各副本状态是否均为 ‘active’,并且start_service_time的值不为 0。如果返回了所有的节点信息,则表示 OBServer 能够正常启动。

obclient> SELECT * FROM __all_server WHERE start_service_time <> 0 AND status=‘active’;

  1. 通过以下命令确认 observer.config.bin文件存在并可读。

如果返回结果为各配置项的详细信息,则说明问题已经解决。

[admin@hostname oceanbase]$ strings /home/admin/oceanbase/etc/observer.config.bin

1 个赞