首页 > 数据库 >postgresql数据定时转存mongodb方案

postgresql数据定时转存mongodb方案

时间:2024-04-20 09:02:20浏览次数:29  
标签:postgresql mongodb 数据库 job 数据 转存

  • 案例背景

很多事件记录在最初一段时间读写比较频繁,存储在postgresql比较合适,后期数据量变大,且仅作为历史记录查询,更适合存储在mongodb中,可能需要定期将postgresql中的数据转存到mongodb。

  • 案例分析

postgresql数据定时转存mongodb,可以采用jdbc方式将postgresql读入内存,对每条数据进行解析,转成json格式,按mongodb的语法写入数据库。这种方法弊端是,需要对各表建立实体对象,依次解析,或者用更不优雅的方式拼接字符串,整个方案扩展性低,可维护性差。因此,我们采用kettle来完成数据的postgresql读取和mongodb插入脚本编写,并在java工程中进行kettle调用。

  • 实现方案

1****、transformation

采用transformation完成针对数据的基础转换,执行SQL和数据postgresql读取和mongodb插入等,job则设定定时任务调用transformation,完成对整个工作流程的控制。

1、表输入

表输入查询要转存到mongodb中的数据记录,提供数据源。

其中数据库连接,要编辑数据库连接类型、IP、端口、密码、数据库名等信息。

2、json输出

json输出中操作选择Output value,json条目名称输入json名称,输出值也选择Output value,字段中选择需要插入的字段。

3、插入mongodb

在Big Data中选择MongoDB Output插件,在Configure connection中输入连接信息。

在Output options中设置插入时的模式

Truncate:插入数据之前先把集合里的所有数据删除,此模式慎用,仅用于首次全量同步;

Update:更新数据,存在则修改,不存在不操作。

upsert:更新添加,找到匹配项则修改,找不到匹配项则添加。

如果设置了Update模式,在Mongo document fields中需要选择某一字段的Modifier operation设为N/A,其他字段设为$set,表示将该字段作为更新标准,当该字段值存在时,其他字段更新。

可以在Create/drop indexes中创建索引。

注:mongodb插件可能遇到报错:java.lang.NoClassDefFoundError: javax/crypto/spec/PBEKeySpec

在data-integration\system\karaf\etc\config.properties中org.osgi.framework.bootdelegation参数添加“,javax.crypto,javax.crypto.*”,保证能正常加载加解密相关类。

2****、job

在start中选择合适的时间间隔,以图为例10分钟执行一次。

将之前的transformation添加至转换中

3****、java工程调用

1、导入jar包

将kettle基础的jar包导入工程,另外将mongodb驱动mongo-java-driver-2.13.0.jar也导入工程中

2、导入插件

将\data-integration\system\karaf\system\pentaho 目录下的插件文件夹pentaho-mongo-utils和pentaho-mongodb-plugin导入工程根目录

3、传入kettle job脚本路径,如果有需要传入脚本中的参数,在params中设定入参:
   public static void main(String[] args) throws IOException {

String[] params = { "101", "content", "" };

runJob(params,"E:\\dict_data\pgToMongodb.kjb");

}

4、将需要的参数在job中设定,设置日志级别,ERROR错误日志,BASIC基础日志,ROWLEVEL行级日志,环境初始化并运行job:

public static boolean runJob(String[] params, String jobPath) {       try {          KettleEnvironment.init();          // jobPath是Job脚本的路径及名称                 JobMeta jobMeta = new JobMeta(jobPath, null);          Job job = new Job(null, jobMeta);          job.setLogLevel(LogLevel.ROWLEVEL);          job.start();          job.waitUntilFinished();          // 向Job 脚本传递参数,脚本中获取参数值:${参数名}          job.setLogLevel(LogLevel.ROWLEVEL);          job.start();          job.waitUntilFinished();          if (job.getErrors() > 0) {             return false;          } else {             return true;          }       } catch (Exception e) {          e.printStackTrace();       }       return false;    }

  • 结束语

1、 kettle中postgresql数据转存mongodb,单线程任务Truncate模式下每秒6000-11000条数据,Update模式下每秒600-1000条数据,相差10倍效率,初次全量同步时尽量采用Truncate模式。

2、要控制合理的同步时间间隔,避免过于频繁导致数据传输失败。

3、数据转存不能做到实时,没有数据库连接守护进程,只能重连一定次数,如果数据库连接可能断开,需要另外的补偿机制。

4、本文中完成了在同一表中查询,可以输入postgresql关系型数据库中联表查询的结果,保证适当的冗余,建立合适的索引。

标签:postgresql,mongodb,数据库,job,数据,转存
From: https://www.cnblogs.com/bigleft/p/18147155

相关文章

  • LightDB兼容扫描 - 事前SQL兼容迁移评估工具24.1支持MySQL --> TDSQL-PostgreSQL兼容
    兼容扫描工具下载地址:事前SQL兼容迁移评估工具使用说明:LightDB-事前SQL兼容迁移评估工具使用手册本次24.1版本新增了对MySQL迁移到TDSQL-pg的兼容性扫描。工具的具体使用方法请阅读使用说明文档,针对本次更新,涉及配置项targetDataBase改为MySQL-to-TDSQL-PostgreSQL。以下是......
  • 熟练运用MongoDB
    目录1.复制集与高可用性1.1.复制集的概念与组成1.2.创建与配置复制集1.3.复制集的自动故障转移与恢复2.分片集群与水平扩展2.1.分片集群的架构与原理2.2.分片键的选择与分片策略2.3.扩展集群规模与负载均衡2.4.创建分片集群3.MongoDB性能调优与监控3.1.监控Mong......
  • 在副本集和分片集群上构建 MongoDB 索引
    1.限制留有足够的内存来容纳工作集是非常重要的。不一定所有索引都要放在内存中。在v4.0之前,索引键的限制应小于1024字节。从v4.2版开始,这一限制被取消。索引名也是如此,在使用fcv4.0及以下版本的数据库中,索引名的最大长度为127字节。在dbv4.2和fcv4.2中,这一......
  • Ubuntu22.04安装PostgreSQL15
    Ubuntu22.04安装PostgreSQL15启用PostgreSQL包存储库sudosh-c'echo"debhttp://apt.postgresql.org/pub/repos/apt$(lsb_release-cs)-pgdgmain">/etc/apt/sources.list.d/pgdg.list'wget-qO-https://www.postgresql.org/media/keys/ACCC4CF8......
  • TapData 正式上线 MongoDB 生态合作伙伴专栏,提供更专业的企业级实时数据集成解决方案
    近日,MongoDB官方正式将TapData加入MongoDB生态合作伙伴名录专栏,该项目旨在帮助用户发现MongoDB合作伙伴提供的优质集成和解决方案,本次入选的100+名单便筛选自数千家合作企业。此次合作达成,标志着TapData在现代应用数据集成领域的产品能力和稳定性已获得行业的广泛认可......
  • 运行MongoDB 报错GLIBC_2.14 not found
    Linux环境下安装完mongodb,运行./mongod报错如下#./mongod./mongod:/lib64/libc.so.6:version`GLIBC_2.14'notfound(requiredby./mongod)使用rpm-qa|grep glibc查看系统当前的glibc版本为2.12使用如下命令查看系统glibc最高支持的版本为2.12#strings/lib64/libc.s......
  • mongodb启动失败问题解决
    解决办法sudochown-Rmongod:mongod/var/lib/mongochown-Rmongod:mongod/var/log/mongodb/chown-Rmongod:mongod/tmp/mongodb-27017.sock或者可以使用mongod--config/etc/mongod.conf参考:MongoDBloadsbutbreaks,returningstatus=14-AskUbuntumon......
  • MongoDB复制集
    MongoDB的复制集复制集及原理MongoDB复制集的主要意义在于实现服务高可用复制集的现实依赖于两个方面的功能:数据写入时将数据迅速复制到另一个独立节点上在接受写入的节点发生故障时自动选举出一个新的替代节点复制集在实现高可用的同时,还有以下作用:数据分发:将数据从......
  • PostgreSql: ERROR: value too long for type character varying(1) 定位字段方法
    报错原因设置的数据库字段长度为1,但实际的值超过规定字段,导致报错。解决方案首先,需要定位字段是哪个字段出现的报错,但可惜的是,并没有报出具体是哪个字段在报错,所以只能通过检查Schema,查看哪些字段是长度为1的,然后再进行值的比较,才能锁定位置。ERROR:valuetoolongfortype......
  • k8s快速创建MongoDB
    1.创建MongoDBpvc文件如果不需要持久存储可以忽略kind:PersistentVolumeClaimapiVersion:v1metadata:name:mongodb-datanamespace:t1-zdblspec:storageClassName:nfs-client#这里使用的存储类accessModes:-ReadWriteManyresources:reques......