PostgreSQL 14 到 Apache Doris 4.1.1 CDC 同步方案 本文档用于验证并实施 PostgreSQL 业务库 fudabd_common_plat_db.public.terminal_pos_202602 到 Apache Doris 分析库 fudabd_common_plat_db.terminal_pos 的数据同步。 实际验证环境要求 PostgreSQL 源端 PostgreSQL 版本:14。 连接地址: 127.0.0.1:15432 。 登录账号: postgres 。 登录密码: Fdbd@2013 。 源数据库: fudabd_common_plat_db 。 源 schema: public 。 源表: fudabd_user 。 主键字段: id 。 已开启 logical replication。 pg_hba.conf 已允许 Doris 所在机器或容器访问数据库和 logical replication。 PostgreSQL 账号具备 logical replication、publication、slot 操作权限。 Doris 目标端 Apache Doris要求 最低docker镜像版本 4.1.1 ,此版本支持Stream Job; Doris 版本: doris-4.1.1-rc01-b10073ad9ca 。 Doris @@version : 5.7.99 。 目标数据库: fudabd_common_plat_db 。 目标表: fudabd_user 。 目标表当前不存在,需要由方案一手动创建。 目标表需要支持 UPDATE 、 DELETE ,因此设计为 UNIQUE KEY 表。 同步要求 需要先全量初始化,再持续增量同步。 需要处理 INSERT 、 UPDATE 、 DELETE 。 当前只验证 terminal_pos_202602 单表,暂不处理后续每月新增分表。 单表数据量:日均约 500 万条。 延迟目标:10 秒内。 Doris Streaming Job 支持判断 Apache Doris 4.x 官方文档提供 CREATE JOB ... ON STREAMING ,支持以下两类模式: TVF Mode :使用 cdc_stream(...) 读取 PostgreSQL CDC,再通过 INSERT INTO ... SELECT ... 写入指定 Doris 表,适合单表 SQL 映射同步。 当前环境是 4.1.1-rc01 ,建议正式执行前在当前 Doris 集群验证 Streaming Job 语法和 FE 配置。 参考文档: CREATE STREAMING JOB : CREATE STREAMING JOB - Apache Doris PostgreSQL SQL Mapping Sync: PostgreSQL CDC with SQL Mapping - Apache Doris PostgreSQL Auto Table Creation Sync: PostgreSQL CDC with Auto Table Creation - Apache Doris Doris 4.1.1 Release Notes: Release 4.1.1 - Apache Doris 前置检查 PostgreSQL 配置检查 当前已确认 postgresql.conf 包含以下配置: wal_level = logical max_replication_slots = 10 max_wal_senders = 10 wal_sender_timeout = 0 执行以下 SQL 复核: SHOW wal_level; SHOW max_replication_slots; SHOW max_wal_senders; 检查源表主键: SELECT tc.table_schema, tc.table_name, kcu.column_name FROM information_schema.table_constraints tc JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = 'public' AND tc.table_name = 'terminal_pos_202602'; Doris 配置检查 登录 Doris FE MySQL 协议端口后执行: SELECT @@version_comment, @@version; SHOW FRONTEND CONFIG LIKE 'max_streaming_job_num'; 如果 max_streaming_job_num 为 0 或 Streaming Job 语法不可用,需要先调整 Doris FE 配置或切换到正式 4.1.1 镜像版本。 PostgreSQL JDBC Driver 准备 Streaming Job 需要 PostgreSQL JDBC Driver。建议将驱动放到 Doris FE/BE 都可访问的 HTTP 地址。 示例: postgresql-42.7.3.jar 本文 SQL 中使用 <PG_DRIVER_URL> 占位,执行前替换为实际地址,例如: https://maven.aliyun.com/repository/public/org/postgresql/postgresql/42.7.3/postgresql-42.7.3.jar 源表结构 CREATE TABLE `fudabd_user` ( `id` bigint NOT NULL COMMENT "用户ID", `user_name` varchar(50) NOT NULL COMMENT "用户名", `password` varchar(255) NOT NULL COMMENT "密码(应加密存储)", `age` tinyint NULL COMMENT "年龄", `create_time` datetime NULL COMMENT "创建时间", `update_time` datetime NULL COMMENT "更新时间", `is_deleted` int NULL DEFAULT "0" COMMENT "是否删除标记" ) SQL 映射同步 推荐结论 当前验证目标是 fudabd_user 同步到 fudabd_user ,且 Doris 目标表不存在、需要设计为 UNIQUE KEY ,优先 SQL 映射同步。 该模式优势: 可将源表 fudabd_user 明确写入目标表 fudabd_user 。 可手动控制 Doris 表模型、字段类型、分桶数和副本数。 可承接 PostgreSQL 主键表的 INSERT 、 UPDATE 、 DELETE CDC 变更。 创建 Doris 数据库 CREATE DATABASE IF NOT EXISTS fudabd_common_plat_db; USE fudabd_common_plat_db; 创建 Doris 目标表 CREATE TABLE `fudabd_user` ( `id` bigint NOT NULL COMMENT "用户ID", `user_name` varchar(50) NOT NULL COMMENT "用户名", `password` varchar(255) NOT NULL COMMENT "密码(应加密存储)", `age` tinyint NULL COMMENT "年龄", `create_time` datetime NULL COMMENT "创建时间", `update_time` datetime NULL COMMENT "更新时间", `is_deleted` int NULL DEFAULT "0" COMMENT "是否删除标记" ) ENGINE=OLAP UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 10 PROPERTIES ( "replication_allocation" = "tag.location.default: 1", "min_load_replica_num" = "-1", "is_being_synced" = "false", "storage_medium" = "hdd", "storage_format" = "V2", "inverted_index_storage_format" = "V3", "compression" = "LZ4", "enable_unique_key_merge_on_write" = "true", "light_schema_change" = "true", "disable_auto_compaction" = "false", "enable_single_replica_compaction" = "false", "group_commit_interval_ms" = "10000", "group_commit_data_bytes" = "134217728", "enable_mow_light_delete" = "false" );; 参数建议: 单 BE 验证环境使用 replication_num = 1 。 生产多 BE 环境建议改为 replication_num = 3 。 日均 500 万数据验证阶段可先使用 BUCKETS 32 ,生产环境根据 BE 数量和 tablet 大小调整为 32 或 64 。 创建 SQL 映射 Streaming Job 执行前需要将 <PG_DRIVER_URL> 替换为 PostgreSQL JDBC Driver 的实际地址。 将 “offset” 从 “initial” 改为 “latest” 即可跳过全量快照,仅捕获增量变更: CREATE JOB pg_fudabd_user_to_fudabd_user ON STREAMING DO INSERT INTO fudabd_common_plat_db.fudabd_user ( id , user_name , password , age` tinyint , create_time , update_time , is_deleted ) SELECT id, user_name , password , age, create_time , update_time , is_deleted FROM cdc_stream( "type" = "postgres", "jdbc_url" = "jdbc:postgresql://127.0.0.1:15432/fudabd_common_plat_db", "driver_url" = "https://maven.aliyun.com/repository/public/org/postgresql/postgresql/42.7.3/postgresql-42.7.3.jar", "driver_class" = "org.postgresql.Driver", "user" = "postgres", "password" = "Fdbd@2013", "database" = "fudabd_common_plat_db", "schema" = "public", "table" = "fudabd_user", "offset" = "initial" ); JOB 运维命令 以下命令用于查看、暂停、恢复和删除前面创建的 Doris Streaming Job。 JOB 查看所有 INSERT 类型 JOB: SELECT * FROM jobs("type" = "insert"); 查看 SQL 映射同步 JOB: SELECT * FROM jobs("type" = "insert") WHERE Name = 'pg_fudabd_user_to_fudabd_user'; 查看 JOB 产生的 TASK 查看所有 INSERT 类型 TASK: SELECT * FROM tasks("type" = "insert"); 查看 SQL 映射同步 JOB 的 TASK: SELECT * FROM tasks("type" = "insert") WHERE JobName = 'pg_fudabd_user_to_fudabd_user'; 暂停 JOB 暂停 SQL 映射同步 JOB: PAUSE JOB WHERE jobName = 'pg_fudabd_user_to_fudabd_user'; 恢复启动 JOB 恢复 SQL 映射同步 JOB: RESUME JOB WHERE jobName = 'pg_fudabd_user_to_fudabd_user'; 删除 JOB 删除 SQL 映射同步 JOB: DROP JOB WHERE jobName = 'pg_fudabd_user_to_fudabd_user'; PGSQL运维命令 -- 查看当前 Publication SELECT p.pubname, n.nspname AS schema_name, c.relname AS table_name FROM pg_publication p JOIN pg_publication_rel pr ON p.oid = pr.prpubid JOIN pg_class c ON pr.prrelid = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid; -- 查看 Replication Slot SELECT slot_name, plugin, slot_type, active, database, restart_lsn, confirmed_flush_lsn FROM pg_replication_slots; -- 如果 Slot 仍然 active,先终止连接 SELECT pid, usename, application_name, client_addr, state FROM pg_stat_activity WHERE backend_type = 'walsender'; SELECT pg_terminate_backend(pid); -- pid 需要手动替换 -- 删除 Replication Slot SELECT pg_drop_replication_slot('slot_name'); -- 删除 Publication -- 查看当前 Publication 进行替换 DROP PUBLICATION doris_pub_1781162893358; -- 确认 Slot 已删除 SELECT slot_name FROM pg_replication_slots; -- 检查 WAL 是否恢复正常 SELECT slot_name, active, pg_size_pretty( pg_wal_lsn_diff( pg_current_wal_lsn(), restart_lsn ) ) AS retained_wal FROM pg_replication_slots; 延迟与性能建议 当前单表日均约 500 万条,验证阶段建议先使用 BUCKETS 32 。 如果同步延迟超过 10 秒,优先检查 Doris Streaming Job 状态、BE compaction、tablet 数量、网络带宽和 PostgreSQL replication slot WAL 堆积。 如果 Doris 集群 BE 数量较多,可将 BUCKETS 调整到 64 ,但不建议在 POC 初期过度增加 tablet 数。 生产环境建议使用多 BE,并将 replication_num 调整为 3 。 PostgreSQL 侧需要持续监控 pg_replication_slots ,避免 Doris Job 停止后 WAL 长时间堆积。 注意事项 STREAMING JOB 任务状态出现PENDING解决 问题根因 __internal_schema.streaming_job_meta 是 Doris 内部管理 Streaming Job 元数据的系统表, FE 未能自动创建它 。所有 Streaming Job 操作都依赖此表,缺失则全部阻塞在 PENDING。 确认 __internal_schema 库及表现状 -- 查看内部库是否存在 SHOW DATABASES LIKE '__internal_schema'; -- 如果存在,查看里面有哪些表 SHOW TABLES FROM __internal_schema; 第一步:先停掉报错的 JOB 止血 TOP JOB pg_fudabd_user_to_fudabd_user; 第二步:手动创建缺失的内部表 CREATE TABLE IF NOT EXISTS `__internal_schema`.`streaming_job_meta` ( `id` bigint NOT NULL, `job_id` bigint NOT NULL, `table_name` varchar(256) NOT NULL, `chunk_list` text ) UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1 PROPERTIES ( "replication_num" = "1" ); 这是基于日志中 SQL 推断的最小表结构。如果后续 FE 代码还访问了其他字段,会再次报错,届时根据错误信息用 ALTER TABLE 补充列即可。 第三步:删除旧 JOB 重新创建 3 个帖子 - 3 位参与者 阅读完整话题
IT之家 6 月 8 日消息,绿联 (UGREEN) 今日面向全球市场宣布了 NASync DXP GT 系列 NAS,其中既有此前国内市场已推出的 4+2 盘位型号 DXP4800 GT,还有本次新公布的 DXP2800 GT。 DXP2800 GT 也基于 AMD 锐龙嵌入式 R2514 处理器,不过 换用 2+2 盘位设计 ,运行 UGOS Pro 操作系统。 其配备 8GB DDR4 内存和 64GB eMMC 存储,提供 1 个 10GbE RJ45 、1 个 USB-C 10Gbps、2 个 USB-A 10Gbps、2 个 USB-A 480Mbps、1 个 HDMI 2.1 TMDS。 这款 NAS 在欧洲市场的建议零售价为 509.99 欧元 / 459.99 英镑(IT之家注:现汇率约合 3994 / 4169 元人民币);首发享受九折优惠,到手价 459.99 欧元 / 412.99 英镑(现汇率约合 3603 / 3743 元人民币)。
Fortune Trump stunned as stocks fall on great jobs report. Barclays explains why ‘we... “With a great Jobs Report, like just announced, stocks should go up, not down," Trump posted. "That's the way it was for 200 years. Growth does not mean inflation!” 美国就业市场5月份表现出色,非农就业人数增幅几乎是分析师预期的两倍。尽管经济学家们欢欣鼓舞,但人工智能交易却大幅萎缩,导致纳斯达克指数下跌4%,创一年多来最大单日跌幅,标普500指数也下跌了1.2%。 https://www.bloomberg.com/news/articles/2026-06-07/trump-says-fed-rate-increase-would-be-wrong-again-calls-for-cut NBC News – 7 Jun 26 Trump says Fed chair should ‘do whatever he wants’ but criticizes possible... Trump railed against potential interest rate hikes, arguing rates should instead be lowered. 7 个帖子 - 7 位参与者 阅读完整话题
今天我在使用我自己的 Agent Dais 来理解一个项目时,发现它突然报错显示输入长度超过上下文上限,同时中转站的余额不足。 这引起了我的注意。我使用的是 gpt-5.4,有 1M 的上下文,在有 subagent 辅助读文件的情况下不应该出现上下文溢出的问题。我调了下中转站的使用日志,发现确实有连续的几个超过八十万 token 的请求,一下把账号的余额干完了。 排查过程 我导出了该任务的 message 数据后,另外开了一个任务来排查。由于 message 数据过长,我在提示词中明确说明只读开头的一小部分,让后让 agent 编写 python 脚本来找导致累计输入输出 token 大幅增长的元凶。 最后定位到原因是一个 ripgrep 调用,这个调用匹配到了项目源码中内嵌的一串 base64 超长文本,该文本本身可能就超过 1M 的字符数,导致上下文爆炸也是顺理成章。 解决方案 经过搜索,使用 ripgrep 时可以加上如下参数来限制单个匹配结果的展示长度(加上 --max-columns-preview 可以在文本溢出时保留部分文本用于预览): rg --max-columns 300 --max-columns-preview ... 本文转自我的个人博客,你可以点此查看原文: BHznJNs' Blog 1 个帖子 - 1 位参与者 阅读完整话题
为啥首次启动,要先连接到 postgres 数据库?导致一直卡在初始化步骤 我记得之前不是这样的,这是哪个版本引入的吗? 我不是自托管的,现在的云托管数据库服务都默认没有这个库了呀!! 1 个帖子 - 1 位参与者 阅读完整话题
已将CHY公益站使用的MySQL迁移至 PostgreSQL 并配置了 Redis 作为缓存,至此,CHY公益站迈出向着稳定的第二步 10 个帖子 - 10 位参与者 阅读完整话题
对接了一个 Newapi 搭中转上游,在 codex 里问答没问题,在 opencode 里直接报错了,下面是这个中转返回的格式,第一帧明显是 Chat Completions 格式,号称是 纯血 pro 号池,第一帧返回这个是不是有什么鬼,或者造假呢? 实际返回的第一帧是: json { "object": "chat.completion.chunk", "id": "chatcmpl-ws-ingress", "model": "gpt-5.5", "choices": [ { "index": 0, "delta": { "role": "assistant", "content": "" } } ] } 注意这个是 Chat Completions 的 chunk 格式。 但后面马上又开始返回 Responses API 格式: json {"type":"response.created", ...} {"type":"response.in_progress", ...} {"type":"response.output_text.delta", "delta":"OK", ...} {"type":"response.completed", ...} 1 个帖子 - 1 位参与者 阅读完整话题
图片中显示已经索引构建完成。但是在使用的使用,我发现 AI 还是 grep 这些操作,没有看到任何使用 KILO 的索引内容。各位大佬知道怎么使用吗? 1 个帖子 - 1 位参与者 阅读完整话题
不是又一家中转。我们做的是一条 稳定、可审计、可托付 的 AI Coding 算力链路。 立即体验 Green Mountain Claude 中转站 → [ Cc Max一手号池中转 ] 一、为什么团队会从别家迁过来? 我们不"卖 token",我们为 AI Coding 团队 提供一手算力供给。 纯血 CCMax · 自建一手号池 · 首字丝滑 · 服务器稳定 · 万级并发 一句话立 Flag: 掺假即赔付,并永久退出这个行业。 二、核心承诺:把"行业潜规则"摊到台面上 维度 行业常态 Green Mountain 倍率 标 1.2x,实际虚标 1.5x+ 真实 1.2x,随时拉日志对账 号池 多家上游混卖、串号 自建一手 Claude Max 号池 ,单一可控源 分组 Max / Pro / 共享池混卖 物理隔离 ,绝不混池 维护 出故障才响应 技术团队全天值守 + 每日主动巡检 + 灰度演练 首字延迟 卡顿、抽风、随机超时 首字丝滑 ,长上下文同样稳 并发 高峰必排队 万级并发 ,扛得住团队级压测 永不掺假 · 永不混卖 · 永不甩锅 —— 写进公告,也写进每一次调用。 三、技术亮点:把成本结构透明化 对深度使用 Claude Code / Cursor / Cline 的团队来说,Token 成本 = 研发成本。 自研智能缓存机制 针对系统提示词、工程上下文、Few-shot 模板等高频重复场景,缓存命中率稳定 90%+ ,把原本被白白消耗的算力,直接转化为团队的成本优势。 全链路自建 Max 号池 拒绝任何第三方上游中转,杜绝"上游跑路 / 降级 / 限流"三大不确定性。 你看到的每一个 token,都来自我们自己的资源池。 数据安全闭环 请求 不留痕、不训练、不分析 。 企业敏感代码上行,我们 不碰、不存、不看 。 四、面向企业客户 不仅服务个人开发者,更欢迎企业级深度合作: 官方开票 私有化分组 / 独立速率限制 定制化套餐 + SLA 承诺 接入咨询 · 成本测算 · 一对一商务 商务对接微信: shan191810 五、 LinuxDO 佬友专属福利 为感谢社区一路以来的关注,本次特别准备: 使用 LinuxDO 登录的用户赠送 $10 测试额度 非自动到账,需通过以下方式领取: QQ 群联系客服 支持 LinuxDO 一键登录 ,免注册门槛 QQ 交流群实时答疑: 1091368043 我们不靠话术留住用户,靠的是 每一次稳定的 200 响应 。 掺一次假,我们赔到肉疼,然后永久退出这个行业—— 这不是口号,是我们敢公开签字的底线。 下一个交付里程碑,要不要让 Green Mountain 替你的团队扛住? —— Green Mountain Team 让每一次 Claude 调用,都值回成本。 2 个帖子 - 1 位参与者 阅读完整话题
greasyfork.org chatgpt model selection Globally override model and thinking_effort on chatgpt.com 1 个帖子 - 1 位参与者 阅读完整话题
三台服务器,一台用来跑服务,简称service,另外一台运行了Kafka和PostgreSQL,这台简称sql-kafka,最后一台放了Cassandra,这个简称Cassandra,然后这三个服务器都是同一个vpc,并且他们的可用区域都是一样的,service访问sql-kafka和cassandra都是通过vpc的里面的内网IP访问的,亚马逊的数据转发不是说处于同一个区域并且通过内网IP访问是没有数据转发费用的,但是现在我看到了很多的数据转发流量 3 个帖子 - 2 位参与者 阅读完整话题
为什么市面上有那么多开源的代码索引工具,但是cc仍然使用grep去查代码。 考虑到在不影响质量的前提下省token的场景,各位佬认为有必要加这类工具吗,有的话,有哪些推荐的。 13 个帖子 - 10 位参与者 阅读完整话题
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?
最近踩了好几个 regression 的坑,感觉都是 AI 脱离上下文约束,把老问题给改出来了 我怀疑是不是要求 AI 输出的时候写上注释更好一些。 大家有什么好的最佳实践么? 还是就加强 spec 和文档维护?