跳转到主要内容

Singer tap for Postgres,使用Meltano SDK for Singer Targets构建。

项目描述

tap-postgres

Singer tap for Postgres。

使用Meltano Singer SDK构建。

功能

  • 目录
  • 状态
  • 发现
  • 关于
  • 流映射
  • 模式展平

设置

设置 必需 默认值 描述
host False None postgres实例的主机名。注意,如果设置了sqlalchemy_url,则此设置将被忽略。
port False 5432 postgres等待连接的端口。注意,如果设置了sqlalchemy_url,则此设置将被忽略。
user False None 用于身份验证的用户名。注意,如果设置了sqlalchemy_url,则此值将被忽略。
密码 False None 用于身份验证的密码。注意,如果设置了sqlalchemy_url,则此值将被忽略。
数据库 False None 数据库名。注意,如果设置了sqlalchemy_url,则此值将被忽略。
max_record_count False None 可选。在一个流中返回的最大记录数。
sqlalchemy_url False None 示例:postgresql://[用户名]:[密码]@[主机]:5432/[数据库名]
filter_schemas False None 如果提供了模式名称数组,则此连接器将仅处理指定的Postgres模式并忽略其他模式。如果留空,连接器将自动确定所有可用的Postgres模式。
dates_as_string False 0 默认为false,如果为true,日期和时间戳字段将是字符串。如果您看到 ValueError: 年份超出范围,请尝试将其设置为True。
ssh_tunnel False None SSH隧道配置,这是一个JSON对象
ssh_tunnel.enable False 0 启用SSH隧道(也称为堡垒服务器),有关其他ssh_tunnel.*属性的更多详细信息,请参阅
ssh_tunnel.host False None 堡垒服务器的主机,这是我们将通过ssh连接的主机
ssh_tunnel.username False None 连接到堡垒服务器的用户名
ssh_tunnel.port False 22 连接到堡垒服务器的端口
ssh_tunnel.private_key False None 用于对堡垒服务器进行身份验证的私钥
ssh_tunnel.private_key_password False None 私钥密码,如果未设置密码,则留空
ssl_enable False 0 是否使用ssl来验证服务器的身份。使用ssl_certificate_authority和ssl_mode进行进一步自定义。要使用客户端证书对服务器进行身份验证,请使用ssl_client_certificate_enable。注意,如果设置了sqlalchemy_url,则此值将被忽略。
ssl_client_certificate_enable False 0 是否提供客户端证书作为对服务器进行身份验证的方法。使用ssl_client_certificate和ssl_client_private_key进行进一步自定义。要使用SSL来验证服务器的身份,请使用ssl_enable。注意,如果设置了sqlalchemy_url,则此值将被忽略。
ssl_mode False verify-full SSL保护方法,有关更多信息,请参阅PostgreSQL文档。必须是disable、allow、prefer、require、verify-ca或verify-full之一。注意,如果设置了sqlalchemy_url,则此值将被忽略。
ssl_certificate_authority False ~/.postgresql/root.crl 用于验证服务器身份的证书颁发机构。可以是证书本身(在.env中)或证书的文件路径。注意,如果设置了sqlalchemy_url,则此值将被忽略。
ssl_client_certificate False ~/.postgresql/postgresql.crt 用于验证您的身份到服务器的证书。可以是证书本身(在.env中)或证书的文件路径。注意,如果设置了sqlalchemy_url,则此值将被忽略。
ssl_client_private_key False ~/.postgresql/postgresql.key 您提供的证书的私钥。可以是证书本身(在.env中)或证书的文件路径。注意,如果设置了sqlalchemy_url,则此值将被忽略。
ssl_storage_directory False .secrets 存储作为原始值提供的SSL证书的文件夹。当证书/密钥作为原始值而不是文件路径提供时,必须在将其用于之前将其写入文件。此配置选项确定文件创建的位置。
default_replication_method False FULL_TABLE 如果没有目录条目来覆盖此选择,则使用的复制方法。可以是FULL_TABLE、INCREMENTAL或LOG_BASED之一。
stream_maps False None 流映射功能的配置对象。有关更多信息,请参阅Stream Maps
stream_map_config False None 用于映射表达式中的用户定义配置值。
faker_config False None 为在映射表达式中使用的 Faker 实例变量 fake 的配置。仅当插件指定 faker 作为附加依赖项(通过 singer-sdk faker 额外或直接指定)时适用。
faker_config.seed False None 用于初始化 Faker 生成器的种子值以实现确定性输出:[https://faker.readthedocs.io/en/master/#seeding-the-generator](https://faker.readthedocs.io/en/master/#seeding-the-generator)
faker_config.locale False None 用于生成本地化输出的一个或多个 LCID 区域字符串:[https://faker.readthedocs.io/en/master/#localization](https://faker.readthedocs.io/en/master/#localization)
flattening_enabled False None 设置为 'True' 以启用架构平坦化并自动展开嵌套属性。
flattening_max_depth False None 扁平化架构的最大深度。
batch_config False None
batch_config.encoding False None 指定批量文件的格式和压缩方式。
batch_config.encoding.format False None 用于批量文件的格式。
batch_config.encoding.compression False None 用于批量文件的压缩格式。
batch_config.storage False None 定义写入批量文件时使用的存储层。
batch_config.storage.root False None 写入批量文件时使用的根路径。
batch_config.storage.prefix False None 写入批量文件时使用的前缀。

运行 tap-postgres --about 可以查看支持的所有设置和功能列表。

使用环境变量进行配置

如果提供了 --config=ENV,则此 Singer tap 会自动导入工作目录中 .env 文件内的任何环境变量,因此如果终端上下文或 .env 文件中设置了匹配的环境变量,则会考虑配置值。

安装

pipx install meltanolabs-tap-postgres

使用方法

您可以通过单独运行或使用 Meltano 管道来轻松运行 tap-postgres

直接执行 Tap

tap-postgres --version
tap-postgres --help
tap-postgres --config CONFIG --discover > ./catalog.json

开发资源

初始化开发环境

pipx install poetry pre-commit
poetry install
pre-commit install

设置 SSL 文件

我们已经将提供的密钥设置为在 .ssl 目录中有效多个世纪。然而,我们还在下面提供了创建所有必需文件以测试 SSL 的配置说明。

每个文件及其用途列表

  1. ca.crt:客户端证书的 CA(存储在服务器上)
  2. cert.crt:客户端证书(存储在客户端)
  3. pkey.key:客户端私钥(存储在客户端)
  4. public_pkey.key:客户端私钥,文件权限不正确(存储在客户端)
  5. root.crt:服务器证书的 CA(存储在客户端)
  6. server.crt:服务器证书(存储在服务器上)
  7. server.key:服务器私钥(存储在服务器上)

运行以下命令以生成所有相关 SSL 文件,证书有效期为两百年(73048 天)。

chmod 0600 ssl/*.key
openssl req -new -x509 -days 73048 -nodes -out ssl/server.crt -keyout ssl/server.key -subj "/CN=localhost" &&
openssl req -new -x509 -days 73048 -nodes -out ssl/cert.crt -keyout ssl/pkey.key -subj "/CN=postgres" &&
cp ssl/server.crt ssl/root.crt &&
cp ssl/cert.crt ssl/ca.crt &&
cp ssl/pkey.key ssl/public_pkey.key &&
chown 999:999 ssl/server.key &&
chmod 600 ssl/server.key &&
chmod 600 ssl/pkey.key &&
chmod 644 ssl/public_pkey.key

现在所有 SSL 文件都已设置,您可以准备使用 pytest 进行测试。

创建和运行测试

tap_postgres/tests 子目录中创建测试,然后运行

poetry run pytest

您还可以使用 poetry run 直接测试 tap-postgres CLI 接口

poetry run tap-postgres --help

使用 Meltano 进行测试

注意:此 tap 可在任何 Singer 环境中工作,且不需要 Meltano。这里提供的示例是为了方便和简化端到端编排场景。

您的项目已包含一个自定义的 meltano.yml 项目文件。

接下来,安装 Meltano(如果尚未安装)和任何需要的插件

# Install meltano
pipx install meltano
# Initialize meltano within this directory
cd tap-postgres
meltano install

现在您可以使用 Meltano 进行测试和编排

# Test invocation:
meltano invoke tap-postgres --version
# OR run a test `elt` pipeline:
meltano elt tap-postgres target-jsonl

SDK 开发指南

请参阅 开发指南 了解如何使用 SDK 开发自己的 taps 和 targets 的更多说明。

SSH 隧道

此 tap 支持通过 SSH 隧道(也称为堡垒主机)连接到 Postgres 数据库。如果您需要连接到不可公开访问的数据库,这很有用。这与使用 ssh -L 相同,但这是在 tap 内部完成的。

什么是 SSH 隧道?

SSH隧道是一种安全转发网络流量的方法。它使用SSH协议封装其他协议,如HTTP、MySQL、Postgres等。这在需要访问防火墙后面或无法直接到达的网络中的服务的情况下非常有用。在这个上下文中,您可以使用SSH隧道来访问对互联网不可用的Postgres数据库。

以下是SSH隧道工作原理的基本说明

+-------------+             +-------------+             +-------------+
|    Local    | SSH tunnel  |   Bastion   |   Direct    |  Postgres   |
|   Machine   | <=========> |   Server    | <=========> |     DB      |
+-------------+ (encrypted) +-------------+ (unsecured) +-------------+
  1. 本地机器:这是此隧道运行的地点,您在这里启动SSH隧道。它也被称为SSH客户端。
  2. 堡垒服务器:这是一个您有SSH访问权限且可以连接到远程服务器的安全服务器。本地机器和堡垒服务器之间的SSH隧道中的所有流量都是加密的。
  3. 远程服务器:这是您想要连接的服务器,在这种情况下是一个PostgreSQL服务器。堡垒服务器和远程服务器之间的连接是一个正常、可能未加密的连接。然而,由于堡垒服务器是受信任的,并且由于本地机器和堡垒服务器之间的所有流量都是加密的,您可以安全地与远程服务器之间传输数据。

获取密钥

设置

  1. 确保您的堡垒服务器在线。
  2. 确保您的堡垒服务器可以访问您的Postgres数据库。
  3. 有一些访问您的堡垒服务器的方法。这可以是基于密码的SSH身份验证或通过到服务器的硬连接。
  4. 如果尚未安装,请在您的客户端机器上安装ssh-keygen

创建密钥

  1. 运行命令ssh-keygen
    1. 输入您希望保存密钥的目录。如果您不确定,默认目录可能就足够了。
      • 如果您收到类似于以下消息的提示,询问是否要覆盖以前的密钥,请输入n,然后重新运行ssh-keygen并使用-f标志手动指定输出密钥文件。
        /root/.ssh/id_rsa already exists.
        Overwrite (y/n)?
        
    2. 如果您愿意,可以输入一个口令来为您的私钥提供额外的保护。基于SSH的身份验证通常被认为是安全的,即使没有口令,但口令可以提供额外的安全层。
    3. 您现在应该会看到一个类似以下的消息,以及一个密钥指纹和ascii随机艺术图像。
      Your identification has been saved in /root/.ssh/id_rsa
      Your public key has been saved in /root/.ssh/id_rsa.pub
      
  2. 导航到指定的目录,找到刚刚生成的两个密钥。名为id_rsa的文件是您的私钥。请妥善保管。名为id_rsa.pub的文件是您的公钥,需要将其传输到您的堡垒服务器,以便您的私钥可以用于身份验证。

复制密钥

  1. 现在您已经有一对密钥,需要将公钥传输到您的堡垒服务器。
  2. 如果您已经配置了基于密码的SSH身份验证,您可以使用命令ssh-copy-id [用户]@[主机]将您的公钥复制到堡垒服务器。然后您可以继续使用您的密钥
  3. 如果没有,您将需要其他方式来访问您的堡垒服务器。一旦您访问了它,将id_rsa.pub文件复制到堡垒服务器上的~/.ssh/authorized_keys文件中。您可以使用如rsync之类的工具或使用基于云的服务来完成此操作。
    • 请注意:如果您的公钥通过文件共享或其他类似方式暴露在互联网上,这是可以的。没有您的私钥,它毫无用处。

使用您的密钥

要通过SSH连接,您需要确定以下信息。如果您缺少某些信息,请返回到获取密钥部分以收集所有相关信息。

  • 您的Postgres数据库的连接详情,与任何其他tap-postgres运行相同。这包括主机、端口、用户名、密码和数据库名称。
    • 或者,提供SQLAlchemy URL。请注意,当设置了SQLAlchemy URL时,许多其他配置选项将被忽略,并且理想情况下,您应该能够通过其他配置选项完成所有操作。如果您发现当前配置选项不支持的一个合理用例,请考虑在tap-postrges仓库中提出一个问题。
    • 请注意,当使用您的连接详情时,它将是来自堡垒服务器的视角。这可能会改变本地IP地址或“localhost”等关键词的含义。
  • 堡垒服务器的主机名或IP地址,由ssh.host配置选项提供。
  • 与堡垒服务器一起使用的端口,由ssh.port配置选项提供。
  • 与堡垒服务器进行身份验证时使用的用户名,由ssh.username配置选项提供。这将要求您在堡垒服务器上设置SSH登录。
  • 您用于与堡垒服务器进行身份验证的私钥,由ssh.private_key配置选项提供。如果您私钥受密码保护(也称为“私钥口令”),则在ssh.private_key_password配置选项中提供它。如果您的私钥没有密码,您可以安全地将此字段留空。

配置完成后,请确保通过将ssh.enable配置选项设置为True来指出您使用SSH隧道到tap。然后,您应该能够通过堡垒服务器连接到您私有可访问的Postgres数据库。

基于日志的复制

基于日志的复制是全表和增量同步的替代方案,它会同步数据库中的所有更改,包括删除。该功能是基于Postgres复制槽构建的。

基于日志的复制的缺点

  1. 管理复制槽 - 基于日志的复制必须在数据库上设置和维护。此tap尽可能简化复杂性,但仍可能需要手动操作
  2. 日志文件 - 当设置复制槽时,包含这些日志的文件将继续增长,直到被消耗。如果由于故障等原因tap没有足够快地摄取这些日志,可能会导致问题。

如果有人发现更多,请将它们添加到这个列表中!

实现细节

基于日志的复制将修改tap输出的模式。具体来说,所有字段都将设置为可空的和非必需的。这是因为当tap发送指示记录已删除的消息时,该消息将保留该记录的所有字段(除主键外)为空。流模式必须能够容纳这些消息,即使数据库中的源字段不可空。因此,基于日志的模式将具有所有字段可空的。

请注意,在开始基于日志的复制后更改选择的流可能会产生意外的后果。为了确保输出一致,最好在tap的调用之间保持所选流相同。

请注意,使用基于日志的复制将导致所有流的复制键设置为“_sdc_lsn”,这是特定记录的Postgres LSN。

如何设置基于日志的复制

  1. 确保您正在使用PostgreSQL 9.4或更高版本。
  2. 需要访问主postgres实例
  3. 为您的数据库安装wal2json插件。以下是在Ubuntu 22.04上运行的Postgres 15.0数据库的示例说明。有关更多信息或替代版本/操作系统,请参阅wal2json文档
    • 如有必要,请更新和升级apt。
      sudo apt update
      sudo apt upgrade -y
      
    • 通过进行必要的安装准备工作。
      sudo apt install curl ca-certificates
      sudo install -d /usr/share/postgresql-common/pgdg
      
    • 导入Postgres Apt仓库的密钥
      sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://postgresql.ac.cn/media/keys/ACCC4CF8.asc
      
    • 创建pgdg.list文件。
      sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
      
    • 使用Postgres Apt仓库安装wal2json
      sudo apt update
      sudo apt-get install postgresql-server-dev-15
      export PATH=/usr/lib/postgresql/15/bin:$PATH
      sudo apt-get install postgresql-15-wal2json
      
  4. 配置数据库以启用wal2json。
    • 编辑您的postgresql.conf配置文件,确保以下参数正确设置。
      wal_level = logical
      max_replication_slots = 10
      max_wal_senders = 10
      
    • 重启PostgreSQL
    • 为tap-postgres创建一个复制槽。
      SELECT * FROM pg_create_logical_replication_slot('tappostgres', 'wal2json');
      
  5. 确保您手动指定tap-postgres的配置,包括主机、端口、用户、密码和数据库名称,而不是依赖于sqlalchemy URL。
  6. 在您的meltano.yml中使用以下元数据修改,以将流配置为基于日志的。请注意,在基于日志的复制过程中,我们不支持除_sdc_lsn以外的任何复制键。
    metadata:
      "*":
        replication_method: LOG_BASED
        replication_key: _sdc_lsn
    

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

meltanolabs_tap_postgres-0.0.14.tar.gz (27.3 kB 查看哈希值)

上传时间 源代码

构建发行版

meltanolabs_tap_postgres-0.0.14-py3-none-any.whl (22.9 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面