CORE FEATURES

核心功能一览

同步任务管理、批量创建任务、自动检测、SQL 方言适配、日志 CDC、ETL 取数与批次、Webhook 告警、统一认证、系统日志、行数核对、断点续传,以及应用内 HTTPS、配置包迁移与列清洗脱敏 —— 一个 jar 包全包了。含 31 张后台界面截图

同步任务管理

配置源库/目标库,多个同步任务并行互不干扰。每个任务独立启动/暂停,列表分页展示(默认 20 条/页,可跳页)。

连接测试

保存前即可验证连通性。选择数据库类型后自动生成 JDBC URL,非内置驱动填写 jar 路径即可动态加载。

对象选择

表 / 视图 / 存储过程分组勾选,支持搜索与批量操作。每张表的增量检测策略直接标注,一目了然。

批量创建任务

读一次源库目录统计,按估算行数把表均衡分进 N 个任务(LPT 分箱),预览后一键建出多个「未启动」的同步任务;大小未知的表可选用 COUNT(*) 精确统计。适合表多、表名没有规律的库。

ETL 按 SQL 取数

写一条取数 SQL,结果行直接复制进目标表;覆盖 / 追加 / 范围覆盖三种写模式,可用 resume key 断点续跑,前后置 SQL 处理清表与汇总。同源同目标的一组表可组成批次,共享一对连接与一条调度,按顺序执行,单个成员失败不中断后续。

同步内容

表结构、表数据、索引、视图、存储过程与函数。目标库不存在时按目标方言自动创建,DDL 变更自动传播。

SQL 方言适配

类型映射、函数名转换、标识符引号、分页语法、存储过程包装。异构库之间的桥梁,每种方言有专门的实现。

实时同步

轮询检测(默认 2 秒),也可用 Cron 表达式精确编排;MySQL 兼容家族、Oracle、达梦、PostgreSQL 方言家族、SQL Server 与崖山源可按同步任务切换日志 CDC,亚秒~秒级延迟(MySQL binlog 近实时推送,其余引擎捞到变更立即续读、仅真空闲时才按 0.5~1 秒轮询)。进程重启后从上次位点继续,停机期间的变更会被补齐。

性能曲线与 Prometheus

数据库性能页与同步任务性能页按后台采样绘制曲线:连接延迟与可用性、会话 / QPS / 缓存命中率 / 锁等待、表数 / 行数 / 占用空间,以及每个任务的同步行数、延迟、失败次数与变更构成;历史保留 7 天。可选开启 /api/metrics/prometheus 端点,用 Bearer token 接到既有监控。

故障恢复

三层锁机制(Quartz + JVM + 数据库行锁)确保跨重启安全。崩溃实例的锁可被接管,不会永久阻塞同步任务。

变更记录

每次变更的对象名、类型、影响行数、耗时与完整错误详情。与同步任务列表同一套分页,每一次同步都可追溯,问题排查不靠猜。

Webhook 告警通知

同步失败、轮询卡死、项目未运行、CDC 停摆、数据漂移、连接健康、PG slot 积压七类事件可推送到自定义 Webhook;内置通用 JSON、钉钉、企业微信、飞书四种格式,支持冷却时间与恢复通知,地址加密存储。告警只读运行状态,不改变任何同步任务的行为。

同步结果核对

「各表同步进度」新增「核对行数」:确认后逐表串行对源 / 目标各执行一次 COUNT(*),标出一致、不一致、缺失与超时。单侧 15 秒超时,页面加载时不会自动查询。

安全与权限

密码 BCrypt 哈希存储,连接密码 AES-256 加密。管理员/访客两级权限,访客仅只读;支持修改密码,也可接入企业统一认证并关闭本地登录。

日志 CDC

六类引擎:MySQL 兼容家族 binlog、Oracle LogMiner、达梦 LogMiner、PostgreSQL 方言家族逻辑复制、SQL Server CDC、崖山 YStream。按同步任务从轮询一键切换,亚秒~秒级延迟,INSERT / UPDATE / DELETE 全捕获 —— 不建触发器、不写源库,只读解析日志。

统一认证

「配置管理 → 外部认证」接入企业现有账号:账号密码(OA 接口校验)、网关头、票据 SSO 三种方式互斥生效。外部用户只保留会话,不落本地用户表;配置完成后可关闭本地登录,保留应急恢复开关。

系统日志

新增「日志管理 → 系统日志」页:按文件、级别(DEBUG / INFO / WARN / ERROR)与关键字过滤,命中内容高亮;滚动归档自动解压读取,单次最多扫描 16 MB、返回最近 1000 条。登录与敏感操作另有审计日志可查。

同步前检查

同步任务详情页一键排练下一轮:源 / 目标连通性、待执行的 CREATE / ALTER / DROP、目标表缺失 / 缺列 / 类型不兼容、游标列与索引、CDC 可用性,以及 binlog CDC 的列布局漂移。只读,不执行 DDL、不推进游标,结果按错误 / 警告 / 正常 / 跳过分组。

内容级校验

增量同步后按主键分桶抽样,逐列比对源与目标的行值,发现「行数相同但内容不同」——更新丢失、截断、类型转换错误。差异只写变更记录并发 DATA_DRIFT 告警,不自动修复;管理员可对单表手工触发。LOB / JSON / XML / 几何列自动排除。

一键诊断包

设置页管理员一键导出 zip:版本、运行参数、连接、项目进度、CDC 位点、近期变更与审计、日志尾部,并附 SHA-256 清单。密码、enc: 密文、API Key、连接串凭据、游标原值与 data/ 均不入包,白名单之外再做一次正则脱敏。

专属迁移

实时同步与 ETL 之外的第三条链路:Elasticsearch / OpenSearch → Easysearch 复制 settings、mappings、别名与文档;MongoDB → MongoDB 复制集合选项、索引与文档并保留 _id;MongoDB → KingbaseES 采样推断建表,_id 作主键。独立连接、预检、手动或 cron、可取消并保留运行历史,详见能力地图。

Redis 缓存投影

日志 CDC 项目可直接以 Redis 为目标:每一行变化投影为 键前缀 + 表名 + 主键,值可选 JSON(整行镜像)或 HASH(列名作 field),支持 ttlSeconds 与排除列。先分块基线再流式回放,项目页可一键重建并只清扫本项目前缀;Redis 专用预检覆盖连通性、集群槽、maxmemory-policy 与键冲突。Redis 不是新的数据库类型,存量项目完全不受影响。

应用内 HTTPS 与系统配置

「系统管理 → 系统配置」直接上传 PKCS#12 / JKS 密钥库或 PEM 证书链与私钥,由 Jync 自己监听 HTTPS,不必再改 nginx 或环境变量;保存后重启生效,可选 HTTP→HTTPS 307 重定向(严格校验 Host,不采信 X-Forwarded-Host)。强制 HTTPS 页面可开关,取值优先级「配置文件 > 数据库 > 默认」,其他节点 5 秒内收敛;同页还能测试候选元数据库并生成一段 POSIX 安全引用的 SPRING_DATASOURCE_* 环境变量块。

配置包迁移

把连接、同步项目、任务、清洗规则、告警与外部认证整体搬到另一个元数据库:单文件 .jync 用 AES-256-GCM + PBKDF2-HMAC-SHA256(21 万次)口令加密,逻辑导出 13 张配置表,可选「包含同步进度与游标」。导入时先用包内源密钥解密全部 enc: 值、再以目标部署密钥重新加密,解不开即中止;只接受空配置库,所有 id 丢弃并重映射,导入后必须仍有 ADMIN。TLS 证书与运行历史不进包。

列清洗与脱敏

写入目标前在内存中执行,源库不变,全量、增量与 CDC 回放一致。13 种规则:去首尾空白、大小写、空串转 NULL、去前缀 / 后缀、正则替换,加上手机号、身份证、银行卡、姓名、邮箱的格式保留掩码与带可选盐的 SHA-256 哈希;掩码按 code point 保留首字符、不切断 emoji 代理对,哈希列在内容校验时自动跳过。

SCREENSHOTS

效果截图

从登录到看板,从配置到日志,每个环节都有清晰的界面

登录:本地账号或企业统一认证

默认使用用户名 + 密码,右上角可随时切换主题与语言。启用外部认证后,登录页按所选方式自动切换为门户引导页,本地表单仍在 /login/local。默认口令没改之前,登录后每个页面顶部都会挂一条红色警告。

  • 初始账号 admin 和 view
  • 密码 BCrypt 单向哈希存储
  • 管理员/访客两级权限体系
  • 支持 OA 接口校验、网关头、票据 SSO,可关闭本地登录
登录页面截图

看板:全局同步态势一屏掌握

同步任务数、ETL 任务、数据库连接与 24 小时变更量一屏总览;管理员另见负载、CPU、内存与磁盘,以及进程 CPU / 堆内存 / GC 趋势曲线。

  • 全局数据概览,表头与数值逐列对齐
  • 进程资源只统计本服务器上的任务,趋势可切换 1 小时 / 24 小时 / 7 天
  • 进程与主机样本按 metrics.app-interval-ms 采集(默认 1 分钟),历史保留 metrics.retention-days(默认 7 天)
  • 同步任务概览 / 最近活动各只列前 5 条,底部入口跳转完整列表
  • 快速导航到各模块
看板页面截图

数据库性能:延迟、库内指标与容量曲线

点连接列表里的折线按钮进入该连接的数据库性能页:连接延迟与可用性,会话数 / QPS / 缓存命中率 / 锁等待,以及表数、行数与占用空间曲线,可切换 1 小时 / 24 小时 / 7 天。

  • 曲线由后台采样器写入元数据库,打开页面不临时查询业务库
  • 库内指标读取数据库自身的会话与统计视图;账号缺少某项权限,只影响对应指标
  • 目录统计只对 MySQL、Oracle、SQL Server、PostgreSQL、DB2 可用,其余产品容量显示「—」
  • 采样间隔 metrics.db-interval-ms(默认 5 分钟)与 metrics.capacity-interval-ms(默认 1 小时)可调;不需要时关闭 metrics.enabled
数据库性能页截图:延迟、表数、行数、占用空间与库内运行指标曲线

同步任务性能:行数、延迟与变更构成

每个同步任务都有独立性能页:已同步行数、同步延迟、连续失败次数与运行状态,下方是「每个时间段的同步行数」「变更类型占比」「变更最多的表」。

  • CDC 任务的延迟按源提交时刻计算,源库空闲时显示 0,重连追赶的事件不计入
  • 变更类型占比区分插入 / 更新 / 删除,变更最多的表直接列出次数
  • 没有采样的时间桶保持断线、不补零,曲线不会被「假的 0」拉平
  • 采样间隔 metrics.task-interval-ms(默认 1 分钟)可调;历史默认保留 7 天(metrics.retention-days),采样关闭后已存样本仍可查看
同步任务性能页截图:已同步行数、同步延迟、失败次数与变更构成

暗色主题:整套配色一起换

右上角一键切换。看板、卡片、表格、图标都跟着走,不是只把背景刷黑、留下一片刺眼的浅色控件。

  • 仅覆盖 CSS 变量,组件无需第二套深色规则
  • 未手动选择时跟随系统偏好
  • 监听系统主题变化实时跟随
  • 切换按钮的月亮 / 太阳图标固定金黄色,昼夜两种底色下都醒目
暗色主题看板截图

英文界面:右上角一键切换

点导航栏的「中 / EN」按钮即可在中英文之间切换,菜单、表单、状态与错误提示整套文案一起换,选择记在浏览器里。首次访问未手动选择时,默认语言按浏览器时区智能推断。

  • 菜单 / 表单 / 状态 / 错误提示整套文案一起换
  • 优先级:语言 Cookie › 浏览器时区 › Accept-Language
  • 境外华人用户的时区往往比浏览器语言更准
Jync 英文界面截图

数据库连接:源 / 目标分栏,保存前先测通

连接按用途拆成「源数据库连接」「目标数据库连接」两张表,各自独立分页;同步任务表单的源、目标下拉只会列出对应一侧的连接,不会把只该写入的库错选成源。每一行都可以直接测试、编辑或删除,密码加密后入库。

  • 新建连接必须选择用途:源(数据读出)/ 目标(数据写入)
  • 测试连接会真正建立连接并执行一次轻量查询,先测通再保存
  • 被同步任务引用的连接不能删除,需要先处理相关同步任务
  • 每行的折线按钮直达该连接的数据库性能页:延迟、可用性、库内指标与容量曲线
  • 外部驱动通过独立 URLClassLoader 加载,不污染应用类加载器
数据库连接页面截图:源库与目标库分栏列表

新增连接:34 种类型,选好 URL 自己拼

先定用途,再从 34 种预置类型中选择数据库(含 OceanBase、GaussDB、GoldenDB、TDSQL、PolarDB、瀚高、海量、崖山等信创库,以及 SAP HANA、Doris、ClickHouse、Hive、Impala、Elasticsearch、MongoDB 等分析型引擎(SAP HANA 支持实时同步,其余六种可作实时同步源));默认端口随类型联动,填好主机、端口、库名后 JDBC URL 当场生成,不用记各家连接串格式。

  • MySQL / PostgreSQL 协议产品复用对应驱动,按实际端口改即可
  • SQL Server 命名实例可留空端口,主机写 主机名\实例名 或附加 instanceName
  • GBase / 神通 / GaussDB / 自定义类型可填驱动 jar 路径或目录,运行时动态加载
  • 类型切换时自动清理上一种类型的驱动覆盖,避免残留值误提交
新增数据库连接截图:类型下拉列出 34 种预置数据库

同步任务列表:多任务并行,启停自如

每个同步任务一组「源库 → 目标库」,独立启动/暂停,状态与最近同步时间一目了然。列表分页展示,页码多时也不会铺满整排。

  • 多个同步任务并行互不干扰,随时启动/暂停
  • 分页:默认 20 条/页,可选 15 / 20 / 30 / 50 / 100 并跳页
  • 页数多时中间以省略号收起,点省略号就地多展开 5 页
同步任务列表页面截图

批量创建:按表大小均衡拆成多个任务

表多、表名没有规律时不必手工拆。读一次源库目录统计(不扫表),按估算行数把表均衡分进 N 个任务,预览每箱的表清单后一次建出多个「未启动」的任务。

  • 任务数 1–50(默认 8);超过表数时收敛到表数并提示
  • LPT 分箱:按行数从大到小,每张表放进当前总重最小的箱;大小未知的表按已知大小的中位数计重
  • 需要更准时勾选「精确统计行数」,只对未知表逐条 COUNT(*),单表 15 秒、整页 120 秒预算
  • 新任务一律停用,逐表确认后再启动;规划用独立临时池,不影响正在运行的同步
  • 预览可导出 CSV(UTF-8 BOM)留档
批量创建任务预览页面截图:按估算大小分箱后的表清单

ETL 任务:按 SQL 取数,批次与单表分区展示

实时同步负责「让两边持续一致」,ETL 负责「按你写的 SQL 取数、写进目标表」。批次任务与单表任务分区展示,每个任务保留自己的取数 SQL、目标表、写模式与最近运行结果。

  • 单表任务可独立立即运行、启用 / 停用与编辑
  • 批次内的成员显示所属批次,连接与调度由批次统一管理
  • 最近运行记录保留成功 / 失败与逐成员汇总
  • 支持从源库表清单批量勾选生成默认 select * 的成员
ETL 任务列表截图:批次与单表任务分区展示

新建 ETL 任务:取数 SQL、目标表与写模式

取数 SQL 可直接编辑,也可从本地载入 .sql 文件;最后一条 SELECT 提供结果行。目标表缺失时按结果列建一次,之后不再自动改结构。

  • 写模式:覆盖(清空目标表)/ 追加 / 范围覆盖(按 range condition 删除一段再写)
  • resume key 指定唯一且单调的结果列,追加与范围覆盖可断点续跑
  • pre-sql / post-sql 在取数前、装载后执行,处理清表与汇总
  • 保存前可先跑预检:取数列、目标表、主键与 SQL 逐项检查
  • 原生 MongoDB 源用 collection + Extended JSON filter 取数
新建 ETL 任务页面截图:取数 SQL、目标表与写模式

ETL 批次:一组表共享一条调度与一对连接

同源同目标的一组表放进一个批次,运行时只建一对源 / 目标连接,组内按顺序执行 —— 不必为每张表各占一条调度、各做一次连接握手。

  • 从表清单勾选建成员:默认 select *、目标表 = 表名、覆盖写模式
  • 批次 cron 是组内唯一调度,成员不再单独调度,但仍可「立即运行」
  • 单个成员失败不中断后续成员,批次记录成功 / 失败 / 跳过的汇总
  • 批次创建后源 / 目标连接锁定;可追加表、移出成员,删除批次级联删除成员与检查点
  • 批次内按目标表名去重,避免两个覆盖任务互相覆盖
ETL 批次编辑页面截图:连接与成员表清单

专属迁移:不走 JDBC 的整库复制

实时同步与 ETL 之外的第三条链路,用独立的搜索 / 文档连接做整库复制,不占用 JDBC 连接与同步任务席位。每类迁移都有预检、手动或 cron 运行、运行中可取消,并保留运行历史。

  • Elasticsearch / OpenSearch → Easysearch:复制 settings、mappings、别名与文档,保留 _id 与 routing,支持覆盖 / 追加 / 冲突即失败
  • MongoDB → MongoDB:复制集合选项、索引与文档,完整保留 _id
  • MongoDB → KingbaseES:采样推断集合结构,自动建表并把文档写入关系库
  • 索引 glob 发现、目标命名前缀 / 后缀、写入后计数与抽样校验
专属迁移页面截图:Elasticsearch/OpenSearch、MongoDB 三类迁移链路

告警通知:故障主动推送,不用盯屏

在「配置管理 → 告警通知」填写 Webhook 地址、选择消息格式与分类,保存后可先发一条测试消息。告警评估只读 Jync 已有的运行状态,不改变同步、CDC 或 ETL 任务的行为。

  • 七类事件:同步失败、轮询卡死、项目未运行、CDC 停摆、数据漂移、连接健康、PG slot 积压
  • 消息格式:通用 JSON / 钉钉 / 企业微信 / 飞书
  • 重复提醒间隔(冷却)可调,故障恢复时发送恢复通知
  • Webhook 地址 AES-256 加密存储;关闭告警后不评估规则、不发送消息
告警通知设置页面截图:Webhook 地址、消息格式、分类与冷却

同步任务详情:逐表勾选与游标策略可视化

表 / 视图 / 存储过程分组勾选,支持搜索与批量操作;每张表的增量检测策略直接标注,游标列可手动指定。

  • TIMESTAMP 策略:可检测更新
  • IDENTITY / NONE 策略显著提示 —— 意味着更新可能同步不到
  • FULL_COMPARE 策略:需主键的周期性整表比对;超出上限或当前间隔下负担过重时,页面会提示并给出建议间隔
  • 捕获策略三卡片切换(轮询 / 全量比对 / 日志 CDC),CDC 仅在就绪探测全部通过时标注「推荐」
  • 「立即同步」运行中再点不会丢:本轮结束后自动补跑一轮,连点多次只补一轮
  • 只读账号下写入操作不可见
同步任务详情页面截图:逐表勾选与游标策略标注

日志 CDC:亚秒~秒级延迟,变更全捕获

MySQL 兼容家族、Oracle、达梦、PostgreSQL 方言家族、SQL Server 与崖山源可按同步任务从轮询切换到日志 CDC —— 直接解析数据库自身日志流,INSERT / UPDATE / DELETE 全捕获,严格按日志顺序回放。繁忙时捞到数据立即开下一轮(0 等待),只有真空闲才休眠轮询,延迟不再被固定 sleep 拖慢。

  • 切换前逐项就绪探测:日志开启、格式、权限、保留期,不满足项直接给出原因
  • 状态面板:当前位点、上次事件时刻、吞吐、已应用行数、跳过 DDL / 不支持事件 / 不可映射值、零日期改写与 LOB 跳过计数及最近错误
  • at-least-once + 幂等 upsert:先提交数据再推进位点,崩溃重启不丢数据
  • 多实例租约互斥,持锁节点宕机后其余节点 ≤ 60s 自动接管
  • 不建触发器、不写源库 —— 对日志全程只读
同步任务详情页日志 CDC 状态面板截图

调度设置:轮询间隔或 Cron,按同步任务单独覆盖

轮询与全量比对任务默认跟随全局 2 秒间隔。开启「自定义调度」后,可为该同步任务单独填写轮询间隔(毫秒)或 Quartz Cron 表达式(6 / 7 段,秒在最前);Cron 优先于轮询,留空则回落到全局默认值。

  • 轮询间隔适合持续追增量,Cron 适合每天凌晨定时批量跑
  • Cron 按服务器时区计算,同步任务启动后生效
  • 日志 CDC 同步任务由常驻消费线程流式回放,调度卡片自动隐藏并说明原因
  • 批次与并行度不属于调度,独立放在「全量加载性能」卡片,关闭自定义调度也不会被清空
同步任务详情页调度设置截图:自定义调度、轮询间隔与 Cron 表达式

全量加载性能:批次与并行度,按库承受能力调

首次全量和 CDC 基线重建共用这些参数:批量大小控制每个 JDBC 批次的行数,默认 2000(1–20000);并行度控制分片 worker 数,默认 2,最高 8;分块大小控制单块行数,填小于等于 0 表示关闭分块。

  • 批次越大提交越少、加载越快,但单次事务更大,回滚与锁持有时间更长
  • 每个 worker 同时占用 1 条源连接和 1 条目标连接,实际并行度受连接池上限二次限制
  • 有主键的表都可并行:整数前导键按区间算术切分,其余键形态按采样边界切分;无主键表顺序加载
  • 只影响首次全量与重建基线,增量轮询和 CDC 回放仍使用全局批次,不会被这里放大
  • 数据库压力敏感时把并行度设为 1,并适当调小批次
同步任务详情页全量加载性能截图:批量大小与并行度

列清洗:写入前统一字符串,不动源库

按「表 + 列」添加规则,在写入目标库前于内存中依次执行,源库数据保持不变。规则同样作用于全量、增量与 CDC 回放;主键列参与匹配与删除时,也使用清洗后的值。

  • 七种基础规则:去首尾空白、转大写、转小写、空串转 NULL、去前缀、去后缀、正则替换
  • 六种脱敏规则:手机号、身份证、银行卡、姓名、邮箱的格式保留掩码,以及带可选盐的 SHA-256 哈希
  • 只处理字符串列,数字和日期原样通过,不做隐式类型转换
  • 正则替换支持 $1 分组引用;表达式与替换串在保存时校验
  • 规则按列表顺序执行,可逐条添加和删除;运行中的同步任务需先停止再修改
同步任务详情页列清洗截图:按表与列配置清洗规则

新建同步任务:源与目标各选一条连接

一个同步任务就是一条「源库 → 目标库」链路。新建时源、目标下拉各自只列出对应用途的连接,不会把只该写入的库错选成源。

  • 源 / 目标下拉按连接用途过滤,选不错方向
  • 建好后进同步任务详情勾选要同步的表 / 视图 / 存储过程
  • 权限按 HTTP 方法判定:新建等写操作一律要求管理员,访客界面上看不到入口
新建同步任务弹窗截图

变更日志:每一次变更都可追溯

对象名、变更类型、影响行数、耗时与完整错误详情。问题排查不靠猜,全在日志里。

  • 每次同步的明细记录,错误详情完整展示
  • 支持按时间范围筛选,与同步任务列表同一套分页
  • 第 2 页起自动刷新禁用 —— 日志按时间倒序,刷新会让正在读的行一直换位置
变更日志页面截图

核对行数:源 / 目标 COUNT 按需对比

在「各表同步进度」卡片点「核对行数」,确认后逐表串行执行。弹窗列出对象、源行数、目标行数、差值、累计同步与状态;每行可单独重查,表头徽标汇总不一致与异常数量。

  • 只在确认后查询,页面加载时零请求
  • 单侧 15 秒查询超时,缺表 / 超时 / 其他异常分别标记
  • 源 / 目标独立计数,一侧失败不掩盖另一侧结果
  • 仅管理员可用,访客看不到入口
核对行数弹窗截图:源行数、目标行数、差值与状态

外部认证:门户账号直接登录,三种方式互斥

「配置管理 → 外部认证」把企业现有的身份体系接进来:账号密码由 Jync 服务端 POST 到 OA 登录接口校验,网关头由网关传递已认证用户,票据模式由登录中心签发一次性 ticket。同一时刻只生效一种方式。

  • 账号密码模式支持表单 / JSON 请求、字段名映射、data.user 点路径与成功标识
  • 网关头只采信可信代理(默认仅回环)转发的身份头,可选共享密钥
  • 票据入口按客户端 IP 限流,校验通过才建立会话,票据不写审计、不在页面回显
  • 外部用户只保留会话,不写入本地用户表;管理员列表命中即为管理员
  • 完成配置后可关闭本地登录;外部认证故障时用 JYN_RESET_LOGIN=true 应急恢复
外部认证配置页面截图:启用开关、认证方式、管理员列表与门户地址

系统日志:按文件、级别与关键字定位问题

「日志管理 → 系统日志」直接读取日志目录里由滚动策略生成的文件,按文件、级别与关键字过滤,命中内容高亮显示。排查启动失败、连接异常或调度问题时,不用再登录服务器翻日志。

  • 级别筛选:DEBUG / INFO / WARN / ERROR / 全部,关键字不区分大小写
  • 滚动归档按 gzip 自动解压读取;普通文件从尾部、归档从头部扫描
  • 单次最多扫描 16 MB,返回最近 1000 条匹配行,并提示是否截断
  • 文件名白名单 + 真实路径校验,拒绝 ../ 与符号链接逃逸
  • 登录与敏感操作另记审计日志,与变更日志、系统日志各归其位
系统日志页面截图:按文件、级别与关键字过滤并高亮命中行

系统配置:证书、强制 HTTPS 与配置包都在界面里

「系统管理 → 系统配置」把过去必须改配置文件或数据库的事情搬进页面:上传证书让 Jync 自己提供 HTTPS,开关强制 HTTPS,导出 / 导入整套配置,还能先测一次候选元数据库。

  • TLS 证书支持 PKCS#12 / JKS 密钥库与 PEM 证书链 + 私钥,保存后重启生效
  • 证书与加密后的口令存在数据目录 ./data/tls,不进元数据库、不进配置包
  • 页面把「已保存 / 已生效 / 等待重启 / 移除待重启」分开显示,证书到期前 30 天提示
  • 配置包 .jync 用 AES-256-GCM + PBKDF2 口令加密,可整体迁移到另一个元数据库
  • 元数据库连接测试器生成一段 POSIX 安全引用的 SPRING_DATASOURCE_* 环境变量块
系统配置页面截图:元数据库、强制 HTTPS 与 TLS 证书三张卡片

管理审计:谁在什么时候改了什么

登录、配置变更、任务启停、TLS 与配置包操作都会留下一条审计记录:时间、用户、操作与详情。只读、仅管理员可见,用来回答「这项配置是谁改的」,与变更日志、系统日志各归其位。

  • 登录成功 / 失败、注销与密码修改
  • 连接、同步任务、ETL 与专属迁移的保存、启停与删除
  • 系统设置、强制 HTTPS、TLS 证书与配置包导入 / 导出
  • 详情里的 URL 一律脱敏,口令与 enc: 密文不入审计
管理审计页面截图:时间、用户、操作与详情列表

AI 配置:多供应商共存,同一时刻只启用一个

存储过程里的不兼容语法,靠文本替换只能走到一定程度。AI 配置 提供另一条路:让模型起草一份候选,由你审阅后落库。

  • 支持 OpenAI 兼容、Anthropic 与 Ollama(本地) 三种选择
  • 深度思考可开关(跟随默认 / 关闭 / 低 / 高)。关掉不只是快:思考 token 会计入输出预算,小 max_tokens 下正文甚至会被思考挤空,表现成「一直转圈然后报模型返回空内容」
  • 保存前先探测端点 —— 发一次真实请求,而非 TCP 探活
  • 密钥与数据库密码同样 AES-256 加密存储
  • AI 只产出候选,永不直接参与同步
  • sync.ai.enabled=false 可彻底下线该功能
AI 配置页面截图

新增供应商:保存前先探测端点

新增 AI 供应商时,保存前会发一次真实请求探测端点,而非 TCP 探活 —— 密钥错误、模型名写错、Base URL 差一段路径这三类问题只有真发请求才暴露得出来。

  • 密钥与数据库密码同样 AES-256 加密存储
  • 探测不通过无法保存,配错当场知道
  • 多供应商共存,同一时刻只启用一个
新增 AI 供应商页面截图

AI 起草:候选 SQL 流式进编辑器

复审页「用 AI 起草」把源过程体发给启用的供应商,候选边生成边渲染进编辑器,不再等超时才一次性看到全文。起草完成后页面只留一条提醒:AI 输出仅为候选,保存为覆盖前请先在目标库人工自测。

  • 流式(SSE)输出;整段返回的缓冲型网关自动回退为全文渲染
  • 10 分钟起草缓存:同对象重复点击立即返回
  • 编辑器带 DBeaver 风格 SQL 高亮;绿条是目标库语法检查的接受结果
AI 起草存储过程的复审页截图

系统信息:运行参数与版本一目了然

原「设置」菜单改名为「系统信息」:实例标识、Java 版本、已调度同步任务数、同步默认参数与并发恢复机制集中只读展示;版本信息卡片显示当前版本、GitHub 最新版本和本版更新内容。更新检查在后台进行,不拖慢页面,纯内网也能看当前版本和更新内容。

  • 运行参数集中只读展示
  • 版本卡片:当前版本 / GitHub 最新版本 / 本版更新内容
  • 可用 --app.update-check.enabled=false 关闭更新检查
系统信息页面截图
DESIGN

并发与一致性设计

增量窗口闭区间 · 先提交后推进 · 幂等写入 · 三层锁 · 安全回退

增量窗口闭区间

先读取 MAX(游标列) 作为水位线,再查询 游标列 > 上次游标 AND 游标列 <= 本次水位线。同步期间新写入的数据自然落在窗口之外,下个周期被捕获。

先提交后推进

先提交目标库数据,再持久化游标。若两者之间崩溃,下次重放同一窗口,不会丢数据。代价是同一行可能被投递两次,由幂等写入消化。

幂等写入

每一行通过基于主键的 upsert 写入,重复执行收敛到同一状态。每种数据库适配各自的 upsert 语法:INSERT ... ON DUPLICATE KEY UPDATE、MERGE INTO、UPDATE-then-INSERT 等。

三层锁机制

Quartz 调度锁 + JVM ReentrantLock + 数据库行锁(带租约)。崩溃实例的锁可被接管,不会永久阻塞同步任务。启动时主动释放本实例上次遗留的锁。

CURSOR STRATEGY

增量检测策略

一行数据能否被同步,只取决于它的游标列值有没有涨到上次记录之上

增量同步只有一条查询
SELECT * FROM 表 WHERE 游标列 > 上次游标 AND 游标列 <= 本次水位 ORDER BY 游标列
策略触发条件检测新增检测更新
TIMESTAMP 存在符合最后修改时间命名约定的时间戳类型列 ✅ ✅ 前提是该列真被更新
IDENTITY 存在符合创建时间命名约定的列,或单列数字主键 ✅ ❌ 永远检测不到
FULL_COMPARE 无可用游标列、有主键,且行数 ≤ full-compare-max-rows(默认 20000;自动选择时受此上限约束,任务级手动选择不受限) ✅ ✅ 每周期全表 upsert
NONE 无可用游标列且表过大 ❌ ❌ 仅首次全量加载
⚠️ 游标列必须是「改一行它就会变大」的列。 用单列数字主键(id)或创建时间(create_time)做游标,UPDATE 不会改变它们的值, 那一行的游标值原地不动 —— 修改永远同步不到,只有新增能过去。 这不是缺陷,而是「用普通查询做增量」这个前提的必然代价 —— 如果更新必须被捕获, 源库又是 MySQL 兼容家族、Oracle、达梦、PostgreSQL 方言家族、SQL Server 或崖山,可以按同步任务切换日志 CDC:直接解析日志流,不依赖游标列。

💡 建议给游标列建索引(主要影响增量轮询)。首次全量按主键分块读取,不走游标列索引;但之后的每个增量周期都要执行 游标列 > 上次游标 的范围查询并按它排序 —— 有索引时只读新增区间,没有索引则每轮全表扫描再排序,表越大对源库的压力越明显。

✅ 判为 TIMESTAMP 的列名(16 个)

UPDATE_TIME UPDATED_AT UPDATETIME UPDATED_TIME LAST_MODIFIED LASTMODIFIED LAST_UPDATE LAST_UPDATED MODIFY_TIME MODIFIED_AT MODIFIED_TIME GMT_MODIFIED ROW_VERSION ROWVERSION SYS_UPDATE_TIME DATA_CHANGE_TIME

⚠️ 判为 IDENTITY 的列名(7 个)

CREATE_TIME CREATED_AT CREATETIME CREATED_TIME GMT_CREATE INSERT_TIME ADD_TIME

创建时间不随修改而变,因此这些列只能检测新增。

匹配规则:大小写不敏感,- 视作 _,按包含匹配。
并且列类型必须确实是时间类型 —— 名为 update_time 的 VARCHAR 不会被当作游标,因为字符串比较的顺序不可靠。

LOG CDC

日志 CDC:六类引擎,亚秒~秒级延迟

轮询依赖游标列,日志 CDC 直接解析数据库自身的日志流 —— INSERT / UPDATE / DELETE 全捕获,不建触发器、不写源库,按同步任务一键切换。MySQL binlog 近实时推送;LogMiner / 逻辑解码 / SQL Server CDC / YStream 四类轮询引擎捞到变更零等待续读,仅真空闲时按引擎默认 0.5~1 秒休眠(可按同步任务覆盖),失败才指数退避

MySQL 兼容家族 · binlog

Jync 伪装成一台只读从库订阅 ROW 格式 binlog,按事务流式回放。位点为「文件 + 偏移」(开启 GTID 时含 GTID 集)。七项就绪探测:版本、log_bin、binlog_format=ROW、binlog_row_image=FULL、server_id、复制权限、binlog 保留期。MySQL / MariaDB 与 GBase、OceanBase、TiDB、GoldenDB、TDSQL、PolarDB 等兼容产品按实际能力探测放行。

Oracle / 达梦 · LogMiner

用数据库内建的 DBMS_LOGMNR 挖掘 redo 日志,从 V$LOGMNR_CONTENTS 流式读取变更回放,位点为 SCN。七项就绪探测:ARCHIVELOG 模式、补充日志(SUPPLEMENTAL LOG)、归档保留、LogMiner 权限等,逐项给出满足 / 不满足与原因。达梦 DM8 按方言家族放行,额外检查 ARCH_MODE=Y、RLOG_APPEND_LOGIC=2、V$ARCHIVED_LOG 权限,基线起点取最新归档的 NEXT_CHANGE#。

PostgreSQL 方言家族 · 逻辑复制

创建逻辑复制槽,经 test_decoding 插件解码 WAL 流式回放,位点为 LSN。五项就绪探测:wal_level=logical、复制槽可用、复制权限、WAL 保留等。槽的推进由 Jync 托管,停机期间变更留在 WAL 里,重启后续读。openGauss 等方言按 SELECT version() 识别,pg_current_wal_lsn 系列与 pg_current_xlog_location 按能力选择;基线期间每 30 秒采样槽滞留的 WAL,超过阈值标红告警。

SQL Server · CDC

读取数据库内建 CDC 特性生成的变更表(cdc.fn_cdc_get_all_changes),位点为 LSN。五项就绪探测:库级 CDC 开启、表级 CDC 开启、捕获作业运行中等。22054 等常见错误自动自愈,变更表被 purge 时停放同步任务而不是无限重试。

崖山 YashanDB · YStream

走崖山自带的逻辑日志(DBMS_YSTREAM_ADM),不建触发器、不改表结构。位点为提交 SCN、实例、组 LSN、组偏移与行号的五元组;源侧服务按任务生命周期管理,停止时一并回收。逐表检查归档模式、主库角色、权限与列补充日志,缺项给出可直接复制的 ALTER 语句。

六类引擎共用一套可靠性机制

基线 + 位点

先持久化当前日志位点,再做 keyset 分块全量装载 —— 基线期间源库的变更已被续读点覆盖,不会漏;基线中途崩溃则整体重跑,不留半份数据。

at-least-once

先提交目标库数据、复检租约、最后推进位点。任何一步崩溃都从上一位点重放,重叠窗口由幂等 upsert 吸收 —— 宁可重复,绝不丢失。

高可用与处置

多实例按租约互斥,同一同步任务同一时刻至多一个节点消费,宕机接管 ≤ 60s;致命故障(日志被清理、位点失效)置 ERROR 帽等人处置,一键重建基线恢复。

已知边界,直说:CDC 不捕获 DDL —— 源库改表后需人工对齐目标库结构,差异过大时用「重建基线」重新全量; 无主键表仅在基线阶段播种一次(状态面板逐表标注);MySQL 兼容家族、达梦与 openGauss 等按能力探测放行 —— 探测不过时会说明缺哪一项,可维持轮询 / 全量比对策略。
FULL LOAD

全量加载性能:批次、并行度与索引时机

不管用轮询还是日志 CDC,首次全量搬一张大表,快慢主要取决于三个旋钮 —— 一次提交多少行、同时开几条分片,以及索引什么时候建。前两项「够用就好」:再往上加,换来的主要是风险

批次与并行度只作用于首次 / 全量加载,增量轮询与 CDC 回放不受影响。并行覆盖所有有主键的表:整数前导键按区间算术切分,其余键形态按采样边界切分;无主键表按顺序加载。索引时机只影响本轮新建的表,已有表的结构同步行为不变。

批量大小

取值适用场景相对默认
500目标库敏感、库较老、单表只有几万行慢约 10–15%
1000–2000均衡,默认 2000基准
5000内网低延迟 + SSD + 目标库余量充足再快约 5–10%
10000–20000不建议,除非专门压测过基本不再变快

依据是实测:MERGE 从 500 提到 2000 提速 13%,2000→5000 只再提 6%;而走 INSERT 路径时 batch 2000 已经打到约 20 万行/秒,再往上驱动和数据库都到瓶颈了。数值变大换来的主要是风险:单次事务的 undo/redo 成倍放大、失败时回滚更久、目标表被锁的时间更长、驱动端批缓冲占内存,Oracle 上还可能顶到 undo 表空间。所以 20000 那个上限只是防呆天花板,不是目标值。

同一张卡片里还有两个边界:读取批量同样限制在 1–20000,MySQL 源逐行流式读取时该值不参与;分块大小(chunk-size)必须大于 0,填小于等于 0 表示关闭分块,改为整表加载。

并行度

取值适用场景相对默认
1数据库敏感、与生产共用、源和目标同一实例慢约 35–40%
2均衡,默认 2基准
4专用库、多核、I/O 有余量再快约 15–20%
8只建议在压测过的专库上用收益很小,负载约翻倍

约束一:每个 worker 占两条连接

一个 worker 同时借 1 条源连接 + 1 条目标连接。并行度 4 意味着目标库上同时有 4 个写事务在提交 —— 数据库压力大致和并行度成正比,不是「只多占一点 CPU」。

约束二:实际值会被连接池压回

源与目标使用不同连接配置时,要求 max-pool-size ≥ 并行度 + 1;源和目标指向同一个连接配置时,要求 max-pool-size ≥ 2 × 并行度 + 2。默认池大小 5 时,前者最多 4 个 worker,后者只剩 1 个。要真上 8,前者池至少 9,后者至少 18。

索引:灌完数据再建

新建表的非唯一二级索引默认延后:先只建主键(CREATE TABLE 自带)和唯一索引,等首次全量提交完再一次性建普通索引。逐行维护二级索引是装载期实打实的开销 —— 50 万行、2 个索引的容器实测,边灌边建 11.1 秒,不建索引 5.9 秒,最后补建两个索引只要 0.5 秒,端到端快约 42%。 主键不能延(upsert 的冲突判断靠它),唯一索引也不延(重复值要在写进去的那一刻就报错);只同步结构、不跑数据时仍然全部立即创建。开关是 sync.defer-secondary-indexes,默认开。

全量加载每块提交后都会留下吞吐(每个 worker 每块一行)
table=ORDERS thread=full-load-ORDERS rows=100000 changed=100000 elapsed=0.9s rows/s=111111.1 read=18% write=74% commit=8% batches=50 rowsPerBatch=2000
怎么判断调够了:看上面那行吞吐日志。并行从 2 调到 4 只快 15%,说明瓶颈已经在数据库,再加 worker 只是加压不加速,就停在 4(或退回 2);批量同理,2000→5000 没明显变化,就说明已经不是在等提交了。 批次与并行度在同步任务详情页的「全量加载性能」卡片里按同步任务覆盖,标签旁边的问号图标就是这份建议;留空则使用全局默认值。索引时机由全局开关 sync.defer-secondary-indexes 控制。改全局默认或 max-pool-size,见 部署文档的配置项。
FRONTEND

前端设计

手写 CSS + 设计令牌,无框架、无构建步骤,内网离线可用

主题切换

主题写在 <html data-theme>,只覆盖 CSS 变量,因此组件无需第二套深色规则。未手动选择时跟随系统 prefers-color-scheme 并实时响应变化。<head> 内联脚本在首屏渲染前应用主题,避免深色用户看到一帧白底闪烁。

时区优先的语言判定

优先级:语言 Cookie › 浏览器时区 › Accept-Language › 简体中文。 为什么时区优先?境外华人用户的浏览器语言常常是英文,但人在国内时区 —— 时区是「想看哪种语言」更准的信号。

离线/内网可用

所有前端资源均在仓库内,运行时不发起任何外部请求:手写样式、原生 JS、本地托管的图标字体、内联渐变 SVG。字体使用系统字体栈,不引入 webfont。静态资源总体积约 440KB。

验证方式:抓取任意页面 HTML,其中 src/href 引用的外部 http(s) 地址数量为 0。