Druid Real-time Node

Druid的Real-time节点负责实时数据索引的创建,通过不断接收数据流并将其索引化,然后定期将索引持久化到磁盘。这些持久化的索引会被合并成Segment并上传到深度存储系统中,确保数据的高可用性和查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Druid的Real-time 节点,主要负责实时数据索引的创建。源源不断的数据流已增量的方式填充到JVM的heap中,写到堆中的索引是可以直接被查询的。为防止堆溢出,Real-time节点会定期或在达到一定大小限制时,将JVM堆中的索引持久化到磁盘上,每个被持久化的索引是不可变的,并且Real-time节点会将持久化的索引加载到堆外的内存中来保证继续被查询到。

Real-time节点的流程图如下:

Real-time节点在内存(in-memory)中缓存事件(event)索引,然后定期持久化到磁盘,然后定期的将已持久化的索引合并为数据块(segment),然后这些segment会被加载到一个off-heap 内存(off-heap memory)中。在查询时,会同时向in-memory和off-memory发送请求。

 

对于定期持久化的方式,Real-time节点会启动一个后台任务,来定期扫描已持久化到本地的索引,然后按已定的时间段分组,合并(merge)为若干个数据块(block),称之为Segment。待合并结束,Real-time节点会将这些Segment上传到分布式文件系统中,做备份,通常是S3、HDFS,这一过程,称之为Deep Storage(深度存储)。

从数据的摄取(ingest)、持久化(persist)、合并(merge)、上传(upload)等这些步骤都是流式的,整个过程不会有数据丢失。

Real-time节点是一个数据消费者,需要一个或多个生产者提供源源不断的流数据。通常,会在生产者和Real-time节点之间创建一个消息总线(message bus),生产者向消息总线推送数据,Real-time节点从消息总线中消费数据。

消息总线通常选用的是Kafka,一方面用作消息缓冲,另一方面扮演一个终端(endpoint),多个Real-time节点可以从中读取数据,这样多个Real-time节点可以分别读取流(Stream)的部分数据(Kafka的partition 特性),也利于Real-time节点的扩展(每个节点读取部分数据)。

 

 

 

### Druid 连接 Oracle 出现 ORA-01013 的解决方案 ORA-01013 错误通常表示客户端请求取消当前操作,可能的原因包括长时间等待数据库响应、行级锁或其他阻塞因素。针对 Druid 数据库连接池配置中的此问题,以下是详细的分析与解决方法。 #### 1. 验证 SQL 查询语句 Druid 连接池通过 `validationQuery` 字段来验证数据库连接的有效性。如果该字段的 SQL 语法不正确或者不符合目标数据库的要求,则可能导致 ORA-01013 错误。对于 Oracle 数据库,推荐使用的验证查询语句如下: ```yaml validationQuery: select 1 from dual ``` 确保在 `application.yml` 或其他配置文件中设置了正确的 `validationQuery` 值[^3]。 #### 2. 调整超时参数 如果数据库存在高延迟或网络不稳定的情况,可能会触发 ORA-01013 错误。可以通过调整以下参数优化连接行为: - **connectionTimeout**: 设置建立新连接的最大等待时间(单位毫秒)。默认值为 30 秒。 - **socketTimeout**: 定义读取数据时允许的最大等待时间(单位毫秒)。 示例配置如下: ```yaml spring: datasource: druid: connection-timeout: 60000 # 单位毫秒,默认30秒可适当增加至60秒 socket-timeout: 30000 # 单位毫秒,建议设置合理的读取超时时间 ``` 这些参数应根据实际业务需求和网络状况进行调整。 #### 3. 检查并解除潜在锁定 当 Oracle 表被锁定时也可能引发 ORA-01013 错误。可以使用以下 SQL 查询定位锁定会话,并手动终止相关进程以释放资源: ```sql SELECT DISTINCT SESS.SID, SESS.SERIAL#, LO.ORACLE_USERNAME AS "用户", LO.OS_USER_NAME AS "机器", AO.OBJECT_NAME AS "锁对象名", LO.LOCKED_MODE AS "锁模式", SESS.LOGON_TIME AS "登录时间", 'ALTER SYSTEM KILL SESSION ''' || SESS.SID || ',' || SESS.SERIAL# || ''' IMMEDIATE;' AS "执行SQL命令" FROM GV$LOCKED_OBJECT LO JOIN DBA_OBJECTS AO ON AO.OBJECT_ID = LO.OBJECT_ID JOIN GV$SESSION SESS ON LO.SESSION_ID = SESS.SID; ``` 执行返回结果中的 `"执行SQL命令"` 来清除锁定会话[^4]。 #### 4. 日志排查与性能监控 启用 Druid 和 JDBC 的调试日志功能可以帮助进一步诊断问题根源。例如,在 Spring Boot 中可通过以下方式开启日志记录: ```properties logging.level.com.alibaba.druid=DEBUG logging.level.jdbc.sqlonly=DEBUG ``` 通过查看日志文件确认是否有异常堆栈信息或特定条件下的失败场景。 --- ### 总结 综合考虑上述几个方面——修正 `validationQuery` 参数、调节超时选项、清理死锁以及利用日志工具深入剖析问题成因,能够有效应对 Druid 连接 Oracle 抛出 ORA-01013 的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值