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 的配置说明。
每个文件及其用途列表
ca.crt
:客户端证书的 CA(存储在服务器上)cert.crt
:客户端证书(存储在客户端)pkey.key
:客户端私钥(存储在客户端)public_pkey.key
:客户端私钥,文件权限不正确(存储在客户端)root.crt
:服务器证书的 CA(存储在客户端)server.crt
:服务器证书(存储在服务器上)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) +-------------+
- 本地机器:这是此隧道运行的地点,您在这里启动SSH隧道。它也被称为SSH客户端。
- 堡垒服务器:这是一个您有SSH访问权限且可以连接到远程服务器的安全服务器。本地机器和堡垒服务器之间的SSH隧道中的所有流量都是加密的。
- 远程服务器:这是您想要连接的服务器,在这种情况下是一个PostgreSQL服务器。堡垒服务器和远程服务器之间的连接是一个正常、可能未加密的连接。然而,由于堡垒服务器是受信任的,并且由于本地机器和堡垒服务器之间的所有流量都是加密的,您可以安全地与远程服务器之间传输数据。
获取密钥
设置
- 确保您的堡垒服务器在线。
- 确保您的堡垒服务器可以访问您的Postgres数据库。
- 有一些访问您的堡垒服务器的方法。这可以是基于密码的SSH身份验证或通过到服务器的硬连接。
- 如果尚未安装,请在您的客户端机器上安装
ssh-keygen
。
创建密钥
- 运行命令
ssh-keygen
。- 输入您希望保存密钥的目录。如果您不确定,默认目录可能就足够了。
- 如果您收到类似于以下消息的提示,询问是否要覆盖以前的密钥,请输入
n
,然后重新运行ssh-keygen
并使用-f
标志手动指定输出密钥文件。/root/.ssh/id_rsa already exists. Overwrite (y/n)?
- 如果您收到类似于以下消息的提示,询问是否要覆盖以前的密钥,请输入
- 如果您愿意,可以输入一个口令来为您的私钥提供额外的保护。基于SSH的身份验证通常被认为是安全的,即使没有口令,但口令可以提供额外的安全层。
- 您现在应该会看到一个类似以下的消息,以及一个密钥指纹和ascii随机艺术图像。
Your identification has been saved in /root/.ssh/id_rsa Your public key has been saved in /root/.ssh/id_rsa.pub
- 输入您希望保存密钥的目录。如果您不确定,默认目录可能就足够了。
- 导航到指定的目录,找到刚刚生成的两个密钥。名为
id_rsa
的文件是您的私钥。请妥善保管。名为id_rsa.pub
的文件是您的公钥,需要将其传输到您的堡垒服务器,以便您的私钥可以用于身份验证。
复制密钥
- 现在您已经有一对密钥,需要将公钥传输到您的堡垒服务器。
- 如果您已经配置了基于密码的SSH身份验证,您可以使用命令
ssh-copy-id [用户]@[主机]
将您的公钥复制到堡垒服务器。然后您可以继续使用您的密钥。 - 如果没有,您将需要其他方式来访问您的堡垒服务器。一旦您访问了它,将
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复制槽构建的。
基于日志的复制的缺点
- 管理复制槽 - 基于日志的复制必须在数据库上设置和维护。此tap尽可能简化复杂性,但仍可能需要手动操作
- 日志文件 - 当设置复制槽时,包含这些日志的文件将继续增长,直到被消耗。如果由于故障等原因tap没有足够快地摄取这些日志,可能会导致问题。
如果有人发现更多,请将它们添加到这个列表中!
实现细节
基于日志的复制将修改tap输出的模式。具体来说,所有字段都将设置为可空的和非必需的。这是因为当tap发送指示记录已删除的消息时,该消息将保留该记录的所有字段(除主键外)为空。流模式必须能够容纳这些消息,即使数据库中的源字段不可空。因此,基于日志的模式将具有所有字段可空的。
请注意,在开始基于日志的复制后更改选择的流可能会产生意外的后果。为了确保输出一致,最好在tap的调用之间保持所选流相同。
请注意,使用基于日志的复制将导致所有流的复制键设置为“_sdc_lsn”,这是特定记录的Postgres LSN。
如何设置基于日志的复制
- 确保您正在使用PostgreSQL 9.4或更高版本。
- 需要访问主postgres实例
- 为您的数据库安装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
- 如有必要,请更新和升级apt。
- 配置数据库以启用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');
- 编辑您的
- 确保您手动指定tap-postgres的配置,包括主机、端口、用户、密码和数据库名称,而不是依赖于sqlalchemy URL。
- 在您的
meltano.yml
中使用以下元数据修改,以将流配置为基于日志的。请注意,在基于日志的复制过程中,我们不支持除_sdc_lsn
以外的任何复制键。metadata: "*": replication_method: LOG_BASED replication_key: _sdc_lsn
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码发行版
构建发行版
meltanolabs_tap_postgres-0.0.14.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c9140f85bc3483541bde7f153d0425003c6d552154b3e3ec59a865114ba2c145 |
|
MD5 | f1271bf3fc68dfb33224dc7be68b460b |
|
BLAKE2b-256 | e9405a95f60a1b7b817b3619e04419622d16e0f1c4a8d00c1ddaee3d5b65e71a |
meltanolabs_tap_postgres-0.0.14-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a14d7159a32a959b3afa373a79deec93a375d79727323eb62e12ce3ca53969ae |
|
MD5 | dca8091295d1c554a7075e5deb0eb1a8 |
|
BLAKE2b-256 | 37554e71ea69b04ccbbce23d7cf516c720ad2fe968e50516e9b92f8bc04510ed |