OB4.0社区版管理工具初体验- ocp meta db 初始化失败

【 使用环境 】测试环境
【 OB or 其他组件 】OCP
【 使用版本 】4.0 社区版
【问题描述】
ocp meta db 初始化失败
【复现路径】
步骤如下:

  1. 下载ocp 4.0的安装包
    – 给下载页面提个建议: 给出md5, sha256等哈希校验的校验码,以方便用户下载后进行比对, 以便确认安装包下载无误。

  2. 解压安装包
    – 发现一个奇怪的问题,解压后的两个文件 似乎 不是gz格式的文件,因为执行 tar ztvf 总是出错

  3. 执行ocp_installer.sh 打印可选的参数

  4. 执行ocp_installer.sh launch 会 做以下事情:
    4.1 下载ocp_installer的docker 镜像;
    4.2 安装nodejs的组件 serv, 作用是启动一个web server, 服务端口为3000;

日志输出如下:

  1. 打开浏览器,登录到测试主机的3000端口 以web方式安装ocp;
    5.1 首页选择"Install"
    ocp_web_ui_home_page

5.2 使用本机安装ocp
username root
port <ssh_port>
auth method Password
password ******
Host <local_host_ip>

5.3 选择 “use existing obcluster”, 因为只有这么一台测试主机,此机器
已经安装并启动了测试集群(obd cluster start demo方式启动的)

5.4 输入或者选择以下信息
[Basic info]
address: <server_local_ip>
port: 2883
meta user meta
meta password ••••••••
meta database meta

monitor user dbmon
monitor password ••••••••
monitor database dbmon

[OCP Deployment]
servers 10.x.x.xx
name ocp
port 8383
cpu count 2
memory 4GB
log path /tmp/ocp/log
user vip off
share usage data off

【问题现象及影响】

  1. 任务执行失败, 从浏览器中 检查日志,确认最后一条执行的命令为:
    sudo docker run --rm --net=host --workdir=/home/admin/ocp-init/src/ocp-init --entrypoint=python -e PYTHONUNBUFFERED=1 -e TABLEGROUP_NAME=meta reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:v4.0.0-ce create_metadb.py
    xx.xx.xx.xx 2883 meta Meta@123 meta dbmon Dbmon@123 dbmon

  2. 手工执行此命令,出错:
    mysql.connector.errors.ProgrammingError: 1045 (42000):
    Access denied for user ‘meta’@‘xxx.xxx.xxx.xxx’ (using password: YES)

  3. 尝试修复此错误:
    3.1 登录到数据库,发现不存在用户meta, dbmon, 对应的数据库meta, dbmon
    也不存在;
    3.2 执行以下sql语句 创建用户meta, dbmon, 同时创建数据库meta和dbmon,
    赋予用户meta和dbmon必要的权限:

create user meta;
alter user ‘meta’@’%’ identified by ‘Meta@123’;
GRANT ALL PRIVILEGES ON oceanbase.* TO ‘meta’@’%’ WITH GRANT OPTION;

create database meta;
GRANT ALL PRIVILEGES ON meta.* TO ‘meta’@’%’ WITH GRANT OPTION;

create user dbmon;
alter user ‘dbmon’@’%’ identified by ‘Dbmon@123’;
GRANT ALL PRIVILEGES ON oceanbase.* TO ‘dbmon’@’%’ WITH GRANT OPTION;

create database Dbmon;
GRANT ALL PRIVILEGES ON dbmon.* TO ‘dbmon’@’%’ WITH GRANT OPTION;

3.3 重新执行
docker run --rm --net=host --workdir=/home/admin/ocp-init/src/ocp-init
–entrypoint=python -e PYTHONUNBUFFERED=1 -e TABLEGROUP_NAME=meta
reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:v4.0.0-ce create_metadb.py
xx.xx.xx.xx 2883 meta Meta@123 meta dbmon Dbmon@123 dbmon 还是出错

截图如下:

【附件】

对ocp安装程序的总印象:

  1. web安装界面做的过于粗糙,也没有联机帮助文件;
  2. 日志交互做的同样比较粗糙,比如在浏览器中提交任务,如果任务执行失败,
    无法显示具体的错误信息,必须手工执行命令才能看到错误信息。
  3. meta db的owner 以及monitor db的owner 应该由安装程序自动创建,而不是由
    用户先行创建(因为不知道需要给这两个用户赋予什么权限)。因此,安装界面需要
    增加输入项: root用户的密码, 安装程序使用此密码连接到现存的ob集群 创建
    meta db 的owner 和monitor db 的owner。

继续debug, 更奇怪的事情发生了:

  1. ocp_monitor_task 这个表其实已经创建成功了;
  2. 删除此表,然后重建此表 都成功。

那么问题来了,为什么python脚本会执行失败 ? :rage:

手工执行 ocp_metadb_ddl.sql 也成功了。

继续 重试 create_metadb.py, 输出信息的最后一句很诡异, 明明 meta数据库已经存在,
但是显示 database]meta] not exists.

[root@ob-single ocp-init]# docker run --rm --net=host --workdir=/home/admin/ocp-init/src/ocp-init --entrypoint=python -e PYTHONUNBUFFERED=1 -e TABLEGROUP_NAME=meta reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:v4.0.0-ce create_metadb.py 10.6.7.89 2883 meta Meta@123 meta dbmon Dbmon@123 dbmon
Generated yml file: 

OcpInitParameter:
  METADB:
    ip: &metadb_ip 10.6.7.89
    username: &metadb_username meta
    password: &metadb_password 'Meta@123'
    port: &metadb_port 2883
    dbname: &metadb_dbname meta
  MONITORDB:
    ip: &monitordb_ip 10.6.7.89
    username: &monitordb_username dbmon
    password: &monitordb_password 'Dbmon@123'
    port: &monitordb_port 2883
    dbname: &monitordb_dbname dbmon
  CONFIGURATION:
    ocp.monitordb.host: *monitordb_ip
    ocp.monitordb.port: *monitordb_port
    ocp.monitordb.username: *monitordb_username
    ocp.monitordb.password: *monitordb_password
    ocp.monitordb.database: *monitordb_dbname
    ocp.iam.auth: local
    backup.dbname.prefix: &backup_dbname_prefix backup

create_metadb.py:20: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(file)
start create database meta
table ocp2_sys_property exists
No handlers could be found for logger "root"
/home/admin/ocp-init/src/ocp-init/generate/gen_dynamic_config_properties.py:14: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(file)
generate ../../sqls/dynamic_config_properties.sql success
/home/admin/ocp-init/src/ocp-init/generate/yml_to_table.py:69: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(file)
generate ../../sqls/generate/iam_role.sql success
generate ../../sqls/generate/ob_parameter_info.sql success
generate ../../sqls/generate/obproxy_parameter_info.sql success
generate ../../sqls/generate/ob_system_variable_info.sql success
generate ../../sqls/generate/config_properties.sql success
generate ../../sqls/generate/config_properties_deleted.sql success
generate ../../sqls/generate/ob_cluster_event_info.sql success
/home/admin/ocp-init/src/ocp-init/generate/gen_monitor_metric_ob_collect_config.py:47: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(file)
generate ../../sqls/generate/monitor_metric_ob_collect_config.sql success
generate ../../sqls/generate/audit_event_meta.sql success
generate ../../sqls/generate/ocp2_alarm_metric_meta.sql success
generate ../../sqls/generate/ocp2_alarm_metric_meta_deleted.sql success
generate ../../sqls/generate/ocp2_alarm_rule.sql success
generate ../../sqls/generate/ocp2_alarm_rule_deleted.sql success
generate ../../sqls/generate/ocp_alarm_detect_rule.sql success
generate ../../sqls/generate/ocp_alarm_detect_rule_deleted.sql success
generate ../../sqls/generate/ocp_alarm_group.sql success
generate ../../sqls/generate/ocp_alarm_group_alarm_type.sql success
generate ../../sqls/generate/ocp2_template_variable_meta.sql success
generate ../../sqls/generate/mc_ocp_cluster_config.sql success
generate ../../sqls/generate/ob_error_code.sql success
generate ../../sqls/generate/metric_expression.sql success
generate ../../sqls/generate/metric_expression_deleted.sql success
generate ../../sqls/generate/metric_class.sql success
generate ../../sqls/generate/metric_group.sql success
generate ../../sqls/generate/metric_meta.sql success
generate ../../sqls/generate/metric_diagram_deleted.sql success
database[meta] not exists

通过查看python源码,meta db 和monitor db的初始化流程基本梳理清楚了:

  1. meta db的表结构初始化 相对简单,只需要执行 ocp_metadb_ddl.sql;

  2. monitor db的表结构更新(ddl语句)跟版本有关,即使在全新环境,例如4.0版本
    的meta db 初始化 也必须 一次性执行 monitordb_ddl_<版本号>.sql,因为有些
    表的创建是在 ob 2.5或者3.X 版本执行的。

  3. 最后还有一个post sql 的执行,主要是相关监控数据的更新, 因为是全新安装,此脚本可以忽略,但是如果是升级安装,此脚本必须要执行。

现在依然存在的问题是:
ocp_installer.sh install 还是会失败

按照官网 部署ocp的文档 重新试了一遍,还是会出错。

官网文档:
https://www.oceanbase.com/docs/community-ocp-cn-10000000000866614

出错的脚本还是create_metadb.py,MysqlConnector 抛出的各种无法连接到Mysql Server的错误,但实际上使用obclient 连接(-P 2883,使用obproxy的监听端口)数据库 是正常的。

重新创建了集群(obd demo), 新建meta和dbmon用户,创建了对应的数据库,
赋予了权限,然后按照官网文档重新部署ocp, 还是失败。

这次错误不同了,提示"mysql.connector.errors.ProgrammingError: 1227 (42501): Access denied; you need (at least one of) the CREATE privilege(s) for this operation",

还有下面这个错误
run sql: create tablegroup if not exists meta; failed,

出错的sql脚本为
ocp_metadb_tablegroup.sql

看了一下这个sql脚本,就是一些create tablegroup的SQL语句,应该是
meta用户没有create tablegroup的权限导致的。

OK, 那就用root用户登录,授权吧,结果更加神奇的事情发生了,ob中经典的
错误"Lost connection to MySQL server during query" 出现了 :rage: :triumph: :yawning_face:

这是什么鬼,执行个grant 操作 也会出这种错 ?

基于这两天的OCP 安装部署体验, 感觉这个产品 压根 就没有好好测试过,
否则不会出现这么多乱七八糟的错误。 官网文档也是写的很粗糙,对一些
"特殊"的使用场景下的注意事项 压根就没提到。

如果使用创建新集群的方式是会包含创建租户和用户的流程的,如果是选择了已有的数据库,其实是默认了已有相应的租户,如果选择的database不存在,是会自动去创建的。

请仔细看下 我的测试步骤和错误截图。

如果使用现有集群, create_metadb.py这个脚本确实会去尝试创建metadb 和
monitor db的,但是因为权限的问题,脚本会执行失败。

使用的 metadb ob 集群版本是什么,主要问题是出在 Lost connection to MySQL server during query 这里,可以尝试用全新创建 metadb 集群的方式来部署一次

至于需要哪些数据库层面的权限,按理说 官网文档应该列出来的,但是,很遗憾,
官网文档没有列出来,或者说根本就没考虑这种场景的存在。

主要问题是权限的问题

4.0社区版

我测试用的虚拟机内存不够, 不能支持2个集群同时运行(meta cluster 和已有的cluster),
所以我才使用"现有集群"这种方式来安装部署ocp。

试了一下 新建metadb cluster, 结果pre-check 失败了:

  1. 磁盘根分区剩余空间 至少需要84G , 通过扩容解决了;
  2. 剩余内存必须8G, 7.9G都不行,这个有点过分。。。

把 虚拟机的内存 加到24G, 硬盘根分区加到250G, 终于进入创建租户的阶段,
结果内存检测这块还是出错,剩余内存超过4G, 还是报错了

2022-11-23 18:40:10 - INFO - 1 - [ob_install.py:71] - create meta tenant with command obd cluster tenant create meta -n meta_tenant --max-cpu 2 --min-cpu 2 --max-memory 4294967296 --min-memory 4294967296
2022-11-23 18:40:16 - INFO - 1 - [ob_install.py:76] - create monitor tenant with command obd cluster tenant create meta -n monitor_tenant --max-cpu 2 --min-cpu 2 --max-memory 4294967296 --min-memory 4294967296
2022-11-23 18:40:18 - ERROR - 1 - [ob_install.py:79] - create monitor tenant got result ret_code: 1, stdout: Get local repositories and plugins ok
Open ssh connection ok
Connect to observer ok
Create tenant monitor_tenant x
[ERROR] resource not enough: memory (Avail: 1.6G, Need: 4.0G)

See https://open.oceanbase.com/docs/obd-cn/V1.4.0/10000000000436999 .
, stderr: 
Traceback (most recent call last):
  File "pipeline/install_ocp.py", line 43, in <module>
    run(context)
  File "pipeline/install_ocp.py", line 33, in run
    install_ocp_pipeline.run()
  File "/root/installer/core/pipeline.py", line 10, in run
    task.run()
  File "/root/installer/task/ob_install.py", line 147, in run
    self.create_tenant()
  File "/root/installer/task/ob_install.py", line 80, in create_tenant
    raise Exception("create monitor tenant failed")
Exception: create monitor tenant failed

而且每次重新运行安装脚本前还要清掉 :

  1. meta cluster的安装目录
  2. ocp的数据和日志目录

还要杀掉已经运行中的obproxyd, obproxy, observer 进程,如果这些进程存在,
会报错 [ERROR] Some of the servers in the cluster have been started

非常糟糕的安装体验,我已经放弃了。。。 :rage:

非常感谢你的反馈,这个帖子会专门转给这套流程的开发同学,帮助后面提高流程优化和用户体验,