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

继续 重试 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:

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

如果安装了一次之后,需要调用uninstall命令来删除已经部署的进程和数据这些,再重新部署

这个不是问题的重点,问题的重点是 内存检测这块,明明机器的剩余
内存超过4G, 但是自检还是报错。。。难道是强制要求 必须有连续的
内存块 ? :triumph:

基于打印出来的日志中的这两条命令,基本定位了出错原因:

2022-11-24 16:00:04 - 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-24 16:00:09 - 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

meta租户和monitor租户创建时 要求的最小内存和最大内存是一样的,都是4G。同时创建这两个租户,ob需要一次性锁定8G的内存,因为系统剩余内存不到8G, 所以出错了。

但是,打印的错误信息却是
[ERROR] resource not enough: memory (Avail: 1.6G, Need: 4.0G)

在此之前 create meta tenant 命令应该是创建成功了(4G 内存已被锁定,不能分配给其他的应用程序), create monitor tenant 命令执行时 检测剩余内存,不够4G, 所以报错了。

因此,基于以上的分析,如果创建每个租户时确实需要最少4G的内存,而主机没有足够的剩余内存时,打印更加易于理解的报错信息。

内存的配置在config.yaml文件, 可以尝试 减小内存配置。