【问题标题】:Postgres "Materialized View" refresh as source of ElasticSearch document updates?Postgres“物化视图”刷新为 ElasticSearch 文档更新的来源?
【发布时间】:2019-10-11 07:59:05
【问题描述】:
我有一个标准化数据库,在 AWS RDS Postgres 数据库中有几个表,大约有一百万条记录。
我想编写一个物化视图,将其中几个表连接起来,为 ElasticSearch 文档生成一个记录结构。
刷新实体化视图时(我将使用并发选项),我希望将活动推送到 AWS ElasticSearch 作为相应的插入、更新或删除。
我只会每周修改基础表并刷新一次实体化视图。
这会起作用吗?具体来说,物化视图的刷新会被记录为 WAL 中的插入/更新/删除吗?
【问题讨论】:
标签:
postgresql
amazon-web-services
elasticsearch
materialized-views
【解决方案1】:
我在我正在从事的一个项目中这样做,到目前为止它运行良好,我使用 logstash 作为一个独立的应用程序,每次我想更新数据时,我都会刷新物化视图并使用 postgres 驱动程序运行 logstash (就我而言,我在服务器上有一份工作,每 2 小时执行一次)。
为此,您需要运行命令行:
path/to/logstash/bin/logstash -f path/to/postgres2elasticsearch.conf
您应该在文件“postgres2elasticsearch.conf”中输入:
input {
jdbc {
jdbc_connection_string => "jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/${RDS_DB_NAME}"
jdbc_user => "${RDS_USERNAME}"
jdbc_password => "${RDS_PASSWORD}"
jdbc_driver_library => "${DRIVE_PATH}"
jdbc_driver_class => "org.postgresql.Driver"
statement => "SELECT * from ${MY_MATERIALIZED_VIEW} order by ${ID_FIELD}"
jdbc_paging_enabled => true
}
}
output {
elasticsearch {
index => "${ES_INDEX}"
hosts => ["${ES_DATA_HOST}:443"]
}
}
查询中的order by 子句很重要,因为logstash 会分批插入数据,如果您不对数据进行排序,则有可能一部分数据重复,而另一部分没有进入elasticsearch完全没有,所以我建议你在物化视图上有一个索引的唯一字段。您需要下载postgres jdbc driver 并将其放在 ${DRIVE_PATH}