订阅 OceanBase CLog 日志(Java程序)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 简介: 随着 OceanBase 数据库的开源,越来越多的企业开始使用 OceanBase,也有很多个人、机构开始学习 OceanBase,我也是其中之一。后续计划将自己的学习经验陆续总结出来,欢迎大家一起讨论。考虑到数据库是一个博大精深的领域,如有写的不对的地方欢迎指正。 本文主要通过 OceanBase-Mini 版本、LogProxy、已经 Java 程序,实现实时订阅 OB CLog 日志,仅限学习场景使用,不适合生产。

主要有 3 个步骤:

  • 部署 OB-Mini 版本
  • 部署 LogProxy
  • 编写、部署订阅程序

1 部署 OB-Mini 版本

OB 提供了 Mini 版,我们可以直接通过 Docker 进行部署。

  • 资源要求
  • CPU:2 核
  • 内存:10GB
  • 工具准备:
  • docker
  • 执行命令
docker run -p2881:2881 --name obce-mini -d oceanbase/obce-mini
  • 结果验证
  • 命令:
  • docker  ps
  • mysql -uroot   -h127.1 -P2881

2 部署 LogProxy

配置 Yum 源:

yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo

安装LogProxy,默认安装目录:/usr/local/oblogproxy 

yum install -y oblogproxy

修改系统租户密码:

SET PASSWORD FOR 'root'= PASSWORD('asdfgh')

配置系统租户信息:

生成账密:

[root@1fa1e2d1b8c8 bin]# ./logproxy  -x rootB13EE2C14A1FBCDCC0ECABFB1DF9A7C7
[root@1fa1e2d1b8c8 bin]# ./logproxy  -x asdfgh7CC8D321325019926AC51DA863C1CB0E

配置到conf 文件中:

"ob_sys_username": "B13EE2C14A1FBCDCC0ECABFB1DF9A7C7",

"ob_sys_password": "7CC8D321325019926AC51DA863C1CB0E",

[root@1fa1e2d1b8c8 oblogproxy]# cat conf/conf.json{
"service_port": 2983,
"encode_threadpool_size": 8,
"encode_queue_size": 20000,
"max_packet_bytes": 8388608,
"record_queue_size": 1024,
"read_timeout_us": 2000000,
"read_fail_interval_us": 1000000,
"read_wait_num": 20000,
"send_timeout_us": 2000000,
"send_fail_interval_us": 1000000,
"command_timeout_s": 10,
"log_quota_size_mb": 5120,
"log_quota_day": 30,
"log_gc_interval_s": 43200,
"oblogreader_path_retain_hour": 168,
"oblogreader_lease_s": 300,
"oblogreader_path": "./run",
"allow_all_tenant": true,
"auth_user": true,
"auth_use_rs": false,
"auth_allow_sys_user": true,
"ob_sys_username": "B13EE2C14A1FBCDCC0ECABFB1DF9A7C7",
"ob_sys_password": "7CC8D321325019926AC51DA863C1CB0E",
"counter_interval_s": 2,
"metric_interval_s": 120,
"debug": false,
"verbose": false,
"verbose_packet": false,
"readonly": false,
"count_record": false,
"channel_type": "plain",
"tls_ca_cert_file": "",
"tls_cert_file": "",
"tls_key_file": "",
"tls_verify_peer": true,
"liboblog_tls": false,
"liboblog_tls_cert_path": ""}

启动LogProxy:

[root@1fa1e2d1b8c8 oblogproxy]# bash ./run.sh startwork path : /usr/local/oblogproxy
is_running : (600)/usr/local/oblogproxy logproxy is running !
logproxy started!

3 订阅程序

  • 引入 mvn 依赖
<dependency><groupId>com.oceanbase.logclient</groupId><artifactId>logproxy-client</artifactId><version>1.0.1</version></dependency>
  • 代码
publicclassMain {
publicstaticvoidmain(String[] args) {
ObReaderConfigconfig=newObReaderConfig();
// 设置OceanBase root server 地址列表,格式为(可以支持多个,用';'分隔):ip1:rpc_port1:sql_port1;ip2:rpc_port2:sql_port2config.setRsList("127.0.0.1:2882:2881");
// 设置用户名和密码(非系统租户)config.setUsername("root");
config.setPassword("asdfgh");
// 设置启动位点(UNIX时间戳,单位s), 0表示从当前时间启动。config.setStartTimestamp(0L);
// 设置订阅表白名单,格式为:tenant.db.table, '*'表示通配.config.setTableWhiteList("sys.*.*");
// 指定oblogproxy服务地址,创建实例.LogProxyClientclient=newLogProxyClient("127.0.0.1", 2983, config);
// 添加 RecordListenerclient.addListener(newRecordListener() {
@Overridepublicvoidnotify(LogMessagemessage) {
System.out.println("--->msg:"+JSON.toJSONString(message));
System.out.println(String.format("--->dbType=%s,dbName=%s,tableName=%s,str=%s",
message.getDbType(),
message.getDbName(),
message.getTableName(),
message.getEncodingStr()));
            }
@OverridepublicvoidonException(LogProxyClientExceptione) {
// 处理错误if (e.needStop()) {
// 不可恢复异常,需要停止Clientclient.stop();
                }
            }
        });
// 启动client.start();
client.join();
    }
}
  • 启动执行:
[root@1fa1e2d1b8c8 ~]# java -jar my-project-name-jar-with-dependencies.jar15:27:29.503 [Thread-0] WARN com.oceanbase.clogproxy.client.connection.ClientStream -start to reconnect...
15:27:29.568 [Thread-0] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
15:27:29.573 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 --Dio.netty.noUnsafe: false15:27:29.574 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 815:27:29.576 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
15:27:29.579 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
15:27:29.580 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
15:27:29.581 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: available
15:27:29.584 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: available, true15:27:29.585 [Thread-0] DEBUG io.netty.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable prior to Java9

小结

通过 OceanBase 开源的组件可以容易的实现简单的订阅功能,后续将使用数据同步中间件将数据写入到 kafka、flink 中。欢迎交流。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
13天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
75 4
|
17天前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
246 98
|
2月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
|
1月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
7月前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
120 4
|
7月前
|
Java 编译器
课时7:Java程序基本概念(注释)
课时7介绍了Java程序中的注释。编程语言有其语法和语义,注释有助于理解代码需求,防止断档。Java支持三类注释:单行(//)、多行(/* */)和文档注释(/** */)。注释不会被编译器编译。范例中展示了如何在代码中使用注释,并强调了注释对项目文档管理的重要性。
124 3
|
9月前
|
传感器 安全 算法
消防救援支队消防员单兵装备智能养护舱电机驱动java版程序(二)
本文探讨消防救援中智能养护舱电机驱动的Java程序设计,作为系列文章第二部分。通过自动化和智能化手段,智能养护舱提升了装备维护效率与准确性。文章详细介绍了电机驱动模块的设计与实现,包括硬件选型、PID控制策略、安全保护机制及Java程序架构,确保电机精确控制、稳定性和安全性。未来将优化功能并引入智能算法和物联网技术,进一步提升装备维护智能化水平。
|
7月前
|
存储 Java 数据库连接
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
|
7月前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
268 0
|
7月前
|
Java 开发工具
课时5:第一个Java程序
课时5介绍了编写第一个Java程序的步骤,包括创建Hello.java文件、编写“Hello World”代码、编译和运行程序。主要内容有:1) 新建并编辑Hello.java;2) 编译Java源文件生成.class文件;3) 通过命令行解释执行Java程序;4) 解释主方法的作用及信息输出操作。本课强调了类定义、文件命名规则和基本程序结构的重要性,并建议初学者使用记事本编写代码以熟悉基础语法。
123 0

推荐镜像

更多