pg_flo完全指南:如何实时同步PostgreSQL数据的终极解决方案
pg_flo是实现PostgreSQL数据实时同步的终极解决方案,它能够捕获插入、更新、删除和DDL变更并进行近实时处理,还支持数据转换和路由功能,让数据流动变得简单高效。
为什么选择pg_flo进行PostgreSQL实时同步?
在当今数据驱动的时代,实时数据同步对于业务连续性和决策制定至关重要。pg_flo作为一款专为PostgreSQL设计的实时数据同步工具,具有以下显著优势:
核心功能亮点 ✨
- 实时数据流式传输:近实时捕获数据库的各种变更操作,包括插入、更新、删除和DDL变更
- 快速初始加载:并行复制现有数据,并自动跟进持续的复制过程
- 强大的数据转换:可在数据流动过程中进行过滤和转换操作(查看规则)
- 灵活的路由功能:能够将数据路由到不同的表并重新映射列(了解路由)
- 生产级可靠性:支持可恢复的流式传输、DDL跟踪等企业级特性
常见使用场景 📊
pg_flo适用于多种数据同步需求:
- PostgreSQL数据库之间的实时数据复制
- 带有数据转换的ETL管道
- 数据重新路由、屏蔽和过滤
- 零停机时间的数据库迁移
- 从PostgreSQL进行事件流处理
快速上手:3步实现PostgreSQL实时同步
准备工作
在开始使用pg_flo之前,请确保您的环境满足以下要求:
- Docker
- 配置了
wal_level=logical的PostgreSQL数据库
1. 安装pg_flo
通过Docker快速安装pg_flo:
docker pull pgflo/pg_flo:latest
2. 配置同步参数
您可以通过以下方式之一配置pg_flo:
- 环境变量
- YAML配置文件(示例)
- CLI标志
3. 启动同步服务
# 启动NATS服务器
docker run -d --name pg_flo_nats \
--network host \
-v /path/to/nats-server.conf:/etc/nats/nats-server.conf \
nats:latest \
-c /etc/nats/nats-server.conf
# 启动复制器(使用配置文件)
docker run -d --name pg_flo_replicator \
--network host \
-v /path/to/config.yaml:/etc/pg_flo/config.yaml \
pgflo/pg_flo:latest \
replicator --config /etc/pg_flo/config.yaml
# 启动工作器
docker run -d --name pg_flo_worker \
--network host \
-v /path/to/config.yaml:/etc/pg_flo/config.yaml \
pgflo/pg_flo:latest \
worker postgres --config /etc/pg_flo/config.yaml
示例配置文件 (config.yaml)
# 复制器设置
host: "localhost"
port: 5432
dbname: "myapp"
user: "replicator"
password: "secret"
group: "users"
tables:
- "users"
# 工作器设置(PostgreSQL目标)
target-host: "dest-db"
target-dbname: "myapp"
target-user: "writer"
target-password: "secret"
# 通用设置
nats-url: "nats://localhost:4222"
pg_flo核心概念解析
架构设计
pg_flo采用了两个主要组件来实现数据同步:
- 复制器(Replicator):通过逻辑复制捕获PostgreSQL的变更
- 工作器(Worker):通过NATS处理和路由变更数据
分组机制
分组用于:
- 识别复制进程
- 隔离复制槽和发布
- 在同一数据库上运行多个实例
- 维护可恢复性的状态
- 启用并行处理
# 示例:为不同的表使用不同的分组
pg_flo replicator --group users_orders --tables users,orders
pg_flo replicator --group products --tables products
三种同步模式
pg_flo提供了三种数据同步模式,以满足不同的业务需求:
- 仅流模式(Stream Only) (默认)
- 实时流式传输变更数据
pg_flo replicator --stream
- 仅复制模式(Copy Only)
- 一次性并行复制现有数据
pg_flo replicator --copy --max-copy-workers-per-table 4
- 复制加流模式(Copy and Stream)
- 初始并行复制,然后进行持续流式传输
pg_flo replicator --copy-and-stream --max-copy-workers-per-table 4
支持的目标 destinations
pg_flo支持多种数据目标:
- stdout:控制台输出
- file:文件写入
- postgres:数据库复制
- webhook:HTTP端点
高级功能使用指南
消息路由配置
路由配置在单独的YAML文件中定义:
# routing.yaml
users:
source_table: users
destination_table: customers
column_mappings:
- source: id
destination: customer_id
# 应用路由配置
pg_flo worker postgres --routing-config /path/to/routing.yaml
数据转换规则
转换规则在单独的YAML文件中定义:
# rules.yaml
tables:
users:
- type: exclude_column
columns: password
- type: exclude_column
columns: ssn
- type: transform
column: email
parameters:
type: mask
mask_char: "*"
# 应用转换规则
pg_flo worker file --rules-config /path/to/rules.yaml
综合使用示例
pg_flo worker postgres --config /etc/pg_flo/config.yaml --routing-config routing.yaml --rules-config rules.yaml
扩展pg_flo同步能力
最佳实践
- 每个分组运行一个工作器
- 使用分组独立复制不同的表
- 通过多个分组进行水平扩展
扩展设置示例
# 分组:sales
pg_flo replicator --group sales --tables sales
pg_flo worker postgres --group sales
# 分组:inventory
pg_flo replicator --group inventory --tables inventory
pg_flo worker postgres --group inventory
注意事项和限制
在使用pg_flo时,请注意以下事项:
- NATS消息大小:8MB(可配置)
- 建议每个分组使用一个工作器
- 需要PostgreSQL逻辑复制的先决条件
- 表必须具有以下之一才能进行复制:
- 主键
- 带有
NOT NULL列的唯一约束 - 设置了
REPLICA IDENTITY FULL
示例表配置
-- 使用主键(推荐)
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT,
name TEXT
);
-- 使用唯一约束
CREATE TABLE orders (
order_id TEXT NOT NULL,
customer_id TEXT NOT NULL,
data JSONB,
CONSTRAINT orders_unique UNIQUE (order_id, customer_id)
);
ALTER TABLE orders REPLICA IDENTITY USING INDEX orders_unique;
-- 使用所有列(在性能方面开销较高)
CREATE TABLE audit_logs (
id SERIAL,
action TEXT,
data JSONB
);
ALTER TABLE audit_logs REPLICA IDENTITY FULL;
开发和贡献
开发命令
make build
make test
make lint
# 端到端测试
./internal/scripts/e2e_local.sh
如何贡献
欢迎贡献!请打开issue或提交pull request。
许可证
Apache License 2.0。查看许可证 →
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



