最近开始试用 OB 的各种周边工具,这里记录一下安装及试用 ODC(OceanBase Developer Center) 的过程。
背景
ODC 官方文档的功能特性的数据生命周期管理部分说:“ODC 提供了数据生命周期管理能力来为您提供数据处理解决方案。ODC 的数据处理能力包括数据清理、数据归档和分区计划。通过数据清理,您可以定期清理掉业务表中的过期数据,实现在线库的瘦身。通过数据归档,您可以配置灵活的归档条件,实现冷热数据分离。通过分区计划,您可以按需求定期新增和删除分区,实现 RANGE 分区自动维护”。
其中 ODC 的数据归档能力,可以成为 OceanBase 历史库(或者叫归档库)解决方案的一个重要部分。这篇博客就简单记录一下安装 ODC 和试用 ODC 数据归档功能的过程。
桌面版
安装
我先在 mac 上安装了一个桌面版的 ODC,安装步骤详见:https://www.oceanbase.com/docs/common-odc-1000000000091089。桌面版的安装十分简单,根据文档里的安装步骤就成功了,这里没有遇到什么问题。
安装完成之后然后通过复制黏贴数据库的连接串,并点击智能解析就可以创建新的数据源了,信息在智能解析之后会替你自动填写好。点一下测试连接看看密码啥的有没有填错,测试成功就 OK 了。
试用
在图形化界面下,折腾各种功能都很方便,基本不需要阅读官方文档上的步骤。
原本想试用一下创建定期任务进行数据归档,构建一个类似于历史库的冷热数据分离系统。这时候发现桌面版 ODC 相比 web 版更加轻量,不支持项目协同管理、数据生命周期管理(数据归档功能就在这里)以及数据脱敏与审计功能,类似于 navicat,更适合个人开发者。
我需要用数据归档功能,那就再安装并试用一下 web 版。
web 版
安装
根据官方文档安装 web 版,安装步骤详见:https://www.oceanbase.com/docs/common-odc-1000000000091088。安装 ODC web 版前需要先装一下 docker。
根据部署文档,我在 OCP 的已有集群上创建了一个叫 odc_cluster 的租户(可能叫 odc_tenant 更好),文档上要求这个租户的规格是 2c8g,因为只是测试用,我实际上只给了 1.5c5g。
登录这个租户之后再创建用户 odc_metadb 和库 odc_metadb,启动 ODC 的时候需要用到。
[xiaofeng.lby@obvos-dev-d3 /home/xiaofeng.lby]
$obclient -h 11.124.9.58 -u root@odc_cluster -P2881 -Dtest
obclient [test]> CREATE USER 'odc_metadb' IDENTIFIED BY 'AAaa11__';
Query OK, 0 rows affected (0.152 sec)
obclient [test]> CREATE DATABASE odc_metadb;
Query OK, 1 row affected (0.080 sec)
obclient [test]> grant ALL PRIVILEGES on *.* to odc_metadb;
Query OK, 0 rows affected (0.063 sec)
这里直接找了一台已经装过 docker 的测试机去启 odc 了。
[xiaofeng.lby@sqaob011124009058.sa128 /home/xiaofeng.lby]
$hostname -i
11.124.9.58
[xiaofeng.lby@sqaob011124009058.sa128 /home/xiaofeng.lby]
# 这一步是启动 docker
nohup dockerd --data-root /opt/docker/data -H unix:///var/run/docker.sock --bip 192.168.1.5/24 > /data/docker/dockerd.log &
[xiaofeng.lby@sqaob011124009058.sa128 /home/xiaofeng.lby]
# 这一步复制黏贴的官网命令启动 odc
$sudo gunzip -c obodc4.2.0.tar.gz | sudo docker load
5e24d842811b: Loading layer [==================================================>] 354.9MB/354.9MB
3ea483b76c11: Loading layer [==================================================>] 2.56kB/2.56kB
5f70bf18a086: Loading layer [==================================================>] 1.024kB/1.024kB
43fc9a9a7a30: Loading layer [==================================================>] 298.9MB/298.9MB
b0a0bb745dde: Loading layer [==================================================>] 23.04kB/23.04kB
c9decb69c835: Loading layer [==================================================>] 405MB/405MB
Loaded image: reg.docker.alibaba-inc.com/oceanbase/odc-server:4.2.0-20230818
参照官网上的步骤启动 odc。
启动的时候出现了一个问题,等了一两分钟之后,在浏览器上输入 http://11.124.9.58:8989/(端口号默认是 8989),结果访问不了 web 页面。
如果启动失败,需要 cd /var/log/odc,再通过看 odc.log 中的日志进行问题的排查。我这里在日志末尾看到报了 Access denied for user xxx 这个错,看上去是上面填写的连接串中的信息哪里有问题,大概率是 username 那部分写错了。
检查了一下,原因是我写的端口不是 proxy 的端口,而是 observer 的端口,相当于直连,这时 database_username 中不能加集群名称,需要把 odc_metadb@odc_cluster#column_store 改成 odc_metadb@odc_cluster。诣舟说只有在通过 proxy 连接时才需要写集群名(因为一个 proxy 可以同时服务多个集群),直连 observer 时就不能再加集群名了。是否需要提供集群名称可以直接根据使用的连接串上是否有集群名决定。
如果在启动时遇到这种用户名、集群名填错的问题导致的启动失败,stop 并 rm obodc,然后再重新启动一遍就 OK 了。
我给的租户资源比较少,1.5c-5g,odc 启动大概需要一分半钟。
可以通过 cd /var/log/odc 后 tail -F odc.log 观察初始化的过程。过程中可以看到 localIpAddress=11.124.9.58, listenPort=8989,后面需要用这个 ip 和 port(默认 8989)去在网页上登录 http://11.124.9.58:8989/,我理解最后看到 Started OdcServer in 96.934 seconds 就是初始化成功了。
在浏览器上输入 http://11.124.9.58:8989/,然后使用用户名 admin 和上面配置的 ODC_ADMIN_INITIAL_PASSWORD 当做账户和密码登录即可。到此为止算是安装成功网页版的 ODC 了。
试用
安装完成之后,我在个人空间里通过复制黏贴数据库的连接串,并点击智能解析就可以创建新的数据源了,信息在智能解析之后会替你自动填写好。这里还有几个要注意的点:
- 本地安装的 OB 集群,类型要选择 OceanBase MySQL,不要选择 MySQL Cloud。如果 OB 集群是本地安装的,却选择了 MySQL Cloud,也是可以成功创建数据源的,但是会默认连到 sys 租户上。
- 记得要点一下测试连接看看用户名、密码啥的有没有填错。
- 要勾选上使用 sys 租户账号查询租户视图,否则用不了完整功能,例如我们后面要测试的数据归档。
还有就是最好提前看一下你要使用的功能有没有什么限制,如果有的话,要在创建新数据源时准备好。例如数据归档要有 proxy,并且在配置数据源的时候需要通过 proxy 连接(用 proxy 连接的连接串进行智能解析)。
接下来试用一下数据归档的功能。因为上面的功能限制说 ODC 的数据归档功能暂时还不支持 4.x 版本(诣舟说 4.x 的数据归档功能会在 2023 年 10 月底发布的版本中支持),所以我就又起了一个 3.1.5 opensource 版本的集群并创建了数据源并进行数据归档测试。
上面的限制说数据归档功能需要用 proxy,我这里先故意用直连 observer 的方式去创建数据源并测试一下数据归档。预期是会失败的,趁此机会可以拉着诣舟来指导一下 ODC 的问题排查方法。
ODC 执行任务失败的排查方法
诣舟说任务失败之后的问题排查要先 cd 到 /var/log/odc 里去 grep odc.log 文件中这个任务名称 3.1-opensource-direct.test 的关键字,然后得到一个类似于 trace id 的东西 JU9PFYPC2MISGIEIEQED8,再在 odc.log 里 grep 这个 trace id,然后一般就能获得错误的原因了。
[xiaofeng.lby@sqaob011124009058.sa128 /var/log/odc]
cd /var/log/odc
[xiaofeng.lby@sqaob011124009058.sa128 /var/log/odc]
$grep 3.1-opensource-direct.test odc.log
[2023-10-09 16:55:20.551][http-nio-8989-exec-9][6bbd7b35e8c2413a,,JU9PFYPC2MISGIEIEQED8][INFO][com.oceanbase.odc.service.flow.FlowInstanceService][636]: Start creating flow instance, flowInstanceReq=CreateFlowInstanceReq(databaseId=47, taskType=ALTER_SCHEDULE, executionStrategy=AUTO, executionTime=null, parentFlowInstanceId=4, description=【${com.oceanbase.odc.builtin-resource.collaboration.environment.sit.name}】3.1-opensource-direct.test , parameters=AlterScheduleParameters(taskId=4, type=DATA_ARCHIVE, operationType=CREATE, scheduleTaskParameters=DataArchiveParameters(name=null, sourceDatabaseId=47, targetDataBaseId=45, sourceDatabaseName=test, targetDatabaseName=mysql, sourceDataSourceName=3.1-opensource-direct, targetDataSourceName=3.1-opensource-direct, variables=[OffsetConfig(name=, pattern=|null)], tables=[DataArchiveTableConfig(tableName=t1, conditionExpression=null)], deleteAfterMigration=true, migrationInsertAction=INSERT_IGNORE, limiterConfig=null), triggerConfig=TriggerConfig(triggerStrategy=START_NOW, days=null, hours=null, cronExpression=null, startAt=null), allowConcurrent=false, misfireStrategy=MISFIRE_INSTRUCTION_DO_NOTHING, description=null), projectId=null, projectName=null, databaseName=test, connectionId=6, connectionName=3.1-opensource-direct, environmentId=6, environmentName=${com.oceanbase.odc.builtin-resource.collaboration.environment.sit.name})
[xiaofeng.lby@sqaob011124009058.sa128 /var/log/odc]
$grep JU9PFYPC2MISGIEIEQED8 odc.log
如果还是获得不了错误原因,那就再在 odc.log 中搜一下这个任务的任务编号关键字,我这个任务的任务编号是 4,那就搜一下 taskId=4,再最后一次出现 taskId=4 的地方附近就可以看到任务失败的原因了。
我这里打开 odc.log 之后在 log 文件里 grep 了下 taskId=4 odc.log,可以看到日志里 taskId=4 下面有一些 connect without proxy 的报错。官方文档上说了数据归档这个功能需要用 proxy,所以我上面故意用直连 observer 的方式去创建数据源是行不通的。
最后改成用 proxy 连接的方式创建数据源,并创建归档任务,然后再测试数据归档的功能就可以成功了。
数据归档任务支持归档范围和归档周期等配置,也可以啥都不配置,就做一次性归档。
其他功能
我根据官方文档,把 ODC 的其他功能特性都逐个试用了一遍,其中一个叫 “SQL 计划任务” 的功能支持定时周期性执行用户创建的 SQL 脚本、存储过程等操作,用户可能会比较常用。
ODC 有图形化界面,每个功能在使用上也都比较便捷,基本自己简单摸索一下就都能搞定,我在试用过程中暂时还没有遇到什么问题。这些功能的使用步骤在官方文档上都有详细说明,所以其他功能的试用过程就不再这篇博客里再赘述了。