玩转数据库
2022 年11 月 21 日 15:50
#1
【 使用环境 】测试环境
【 OB or 其他组件 】OCP
【 使用版本 】4.0 社区版
【问题描述】
ocp meta db 初始化失败
【复现路径】
步骤如下:
下载ocp 4.0的安装包
– 给下载页面提个建议: 给出md5, sha256等哈希校验的校验码,以方便用户下载后进行比对, 以便确认安装包下载无误。
解压安装包
– 发现一个奇怪的问题,解压后的两个文件 似乎 不是gz格式的文件,因为执行 tar ztvf 总是出错
执行ocp_installer.sh 打印可选的参数
执行ocp_installer.sh launch 会 做以下事情:
4.1 下载ocp_installer的docker 镜像;
4.2 安装nodejs的组件 serv, 作用是启动一个web server, 服务端口为3000;
日志输出如下:
打开浏览器,登录到测试主机的3000端口 以web方式安装ocp;
5.1 首页选择"Install"
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
【问题现象及影响】
任务执行失败, 从浏览器中 检查日志,确认最后一条执行的命令为:
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
手工执行此命令,出错:
mysql.connector.errors.ProgrammingError: 1045 (42000):
Access denied for user ‘meta’@‘xxx.xxx.xxx.xxx’ (using password: YES)
尝试修复此错误:
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 还是出错
截图如下:
【附件】
玩转数据库
2022 年11 月 21 日 16:25
#3
继续debug, 更奇怪的事情发生了:
ocp_monitor_task 这个表其实已经创建成功了;
删除此表,然后重建此表 都成功。
那么问题来了,为什么python脚本会执行失败 ?
玩转数据库
2022 年11 月 21 日 16:46
#4
手工执行 ocp_metadb_ddl.sql 也成功了。
玩转数据库
2022 年11 月 21 日 16:58
#5
继续 重试 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
玩转数据库
2022 年11 月 21 日 18:07
#6
通过查看python源码,meta db 和monitor db的初始化流程基本梳理清楚了:
meta db的表结构初始化 相对简单,只需要执行 ocp_metadb_ddl.sql;
monitor db的表结构更新(ddl语句)跟版本有关,即使在全新环境,例如4.0版本
的meta db 初始化 也必须 一次性执行 monitordb_ddl_<版本号>.sql,因为有些
表的创建是在 ob 2.5或者3.X 版本执行的。
最后还有一个post sql 的执行,主要是相关监控数据的更新, 因为是全新安装,此脚本可以忽略,但是如果是升级安装,此脚本必须要执行。
玩转数据库
2022 年11 月 21 日 18:44
#7
现在依然存在的问题是:
ocp_installer.sh install 还是会失败
玩转数据库
2022 年11 月 22 日 11:11
#8
按照官网 部署ocp的文档 重新试了一遍,还是会出错。
官网文档:
https://www.oceanbase.com/docs/community-ocp-cn-10000000000866614
出错的脚本还是create_metadb.py,MysqlConnector 抛出的各种无法连接到Mysql Server的错误,但实际上使用obclient 连接(-P 2883,使用obproxy的监听端口)数据库 是正常的。
玩转数据库
2022 年11 月 23 日 11:16
#10
重新创建了集群(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" 出现了
这是什么鬼,执行个grant 操作 也会出这种错 ?
玩转数据库
2022 年11 月 23 日 11:18
#11
基于这两天的OCP 安装部署体验, 感觉这个产品 压根 就没有好好测试过,
否则不会出现这么多乱七八糟的错误。 官网文档也是写的很粗糙,对一些
"特殊"的使用场景下的注意事项 压根就没提到。
如果使用创建新集群的方式是会包含创建租户和用户的流程的,如果是选择了已有的数据库,其实是默认了已有相应的租户,如果选择的database不存在,是会自动去创建的。
玩转数据库
2022 年11 月 23 日 11:45
#13
请仔细看下 我的测试步骤和错误截图。
如果使用现有集群, create_metadb.py这个脚本确实会去尝试创建metadb 和
monitor db的,但是因为权限的问题,脚本会执行失败。
使用的 metadb ob 集群版本是什么,主要问题是出在 Lost connection to MySQL server during query 这里,可以尝试用全新创建 metadb 集群的方式来部署一次
玩转数据库
2022 年11 月 23 日 11:47
#15
至于需要哪些数据库层面的权限,按理说 官网文档应该列出来的,但是,很遗憾,
官网文档没有列出来,或者说根本就没考虑这种场景的存在。
玩转数据库
2022 年11 月 23 日 12:38
#18
我测试用的虚拟机内存不够, 不能支持2个集群同时运行(meta cluster 和已有的cluster),
所以我才使用"现有集群"这种方式来安装部署ocp。
玩转数据库
2022 年11 月 23 日 17:17
#19
试了一下 新建metadb cluster, 结果pre-check 失败了:
磁盘根分区剩余空间 至少需要84G , 通过扩容解决了;
剩余内存必须8G, 7.9G都不行,这个有点过分。。。
玩转数据库
2022 年11 月 23 日 18:47
#20
把 虚拟机的内存 加到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
而且每次重新运行安装脚本前还要清掉 :
meta cluster的安装目录
ocp的数据和日志目录
还要杀掉已经运行中的obproxyd, obproxy, observer 进程,如果这些进程存在,
会报错 [ERROR] Some of the servers in the cluster have been started
非常糟糕的安装体验,我已经放弃了。。。
xuyu
2022 年11 月 23 日 19:17
#21
非常感谢你的反馈,这个帖子会专门转给这套流程的开发同学,帮助后面提高流程优化和用户体验,