异构数据库向PostgreSQL实时同步
卢健
山东瀚高基础软件股份有限公司
公司简介
十年一剑
• 山东瀚高于2005年成立,2015年新三板挂牌 【瀚高股份 833644】
• 专注数据库与服务,客户覆盖政府、金融、公安、卫生、大型企业
• 优秀的DBA团队,多名OCM、Linux/Unix认证工程师
• 2010年尝试PostgreSQL商业化推广(HGDB)
• 积累了丰富的迁移及PG管理经验
• 不断完善研发团队、积极参与PG社区活动
目录
HVR 对PostgreSQL的支持
HVR 功能简介
异构数据库实时同步场景分析
需要向PostgreSQL同步数据的场景
PostgreSQL使用逐渐增多,遇到了更多的问题:
应用迁移 —— 从XX数据库迁移到PostgreSQL
数据交互 —— 从其他数据库采集数据到PostgreSQL
BI、数据仓库 —— 汇总数据到PostgreSQL、GreenPlum
一次性迁移,较好处理
数据迁移只是其中的一小部分工作
? 需要兼顾性能,不能对原系统造成太大影响
? 实时性!跨部门如何处理?
? 数据加载效率!
工具选择
需求:从其他数据库将数据同步到PostgreSQL
ORA2PG…
Trigger-Based
易用
高效实时
稳定
ETL
FDW、DBLINK
应用开发
Log-Based
目录
HVR 对PostgreSQL的支持
HVR 功能简介
异构数据库实时同步场景分析
HVR 介绍
SaaS
IaaS and
PaaS
INGRES
ORACLE
(EXADATA)
DB2 ON
LUW and
AS400
SQL
SERVER
SHAREPOINT
FILES
HADOOP
OTHER
XML
SALESFORCE
AMAZON
REDSHIFT
AMAZON EC2
AMAZON RDS
WINDOWS
AZURE
PARACCEL
(MATRIX)
VECTORWISE
(VECTOR)
TERADATA
GREENPLUM
HAWQ
POSTGRES
HVR 架构
HUB DB
日志进程
调度进程
Capture
Capture
Integrate
Integrate
Integrate
Integrate
DB #1
DB #2
Redo logs
Redo logs
HVR Agent
TX Files
DB #3
DB #4
DB #5
DB #6
HVR Agent
HVR Agent
HVR Agent
以HUB为中心的集中星型架构
尽量减少磁盘I/O
目标端不可用时,在HUB服务器生成TX日志文件
源端/目标多不需要复杂配置
尽量使用数据库Native interface
HUB维护CHANNEL状态
HUB记录和跟踪复制相关的所有信息
利用HUB实现统一监控
功能:实时同步
在线增加/删
除同步表
LOG-BASED
变更数据捕获
Native 数据库连接
对源库性能
影响最小化
基于事务复
制
良好的扩展
性
高效、并行
批量加载
Native
Drive
(非odbc)
确保数据一
致性
对于异构数据库,初始化同步时自动生成DDL
传输过程中支持数据流压缩、加密及带宽使用控制
功能:online refresh
SQL1 Update tb1 set id = 10
…… ……
SQL10 Insert tb1 (id,name) values (12,’wangwu’)
14:01:01
14:01:02
14:01:03
14:01:04
14:01:05
14:01:06
14:01:07
SQL1 Update tb1 set id = 10 √
…… …… √
SQL10 Insert tb1 (id,name) values (12,’wangwu’) √
SQL11 Update tb1 set id = 10
…… ……
SQL20 Insert tb1 (id,name) values (12,’wangwu’)
SQL21 Update tb1 set id = 10
…… ……
SQL30 Insert tb1 (id,name) values (12,’wangwu’)
SQL31 Update tb1 set id = 10
…… ……
SQL40 Insert tb1 (id,name) values (12,’wangwu’)
SQL41 Update tb1 set id = 10
…… ……
SQL50 Insert tb1 (id,name) values (12,’wangwu’)
SQL11 Update tb1 set id = 10 √
…… …… √
SQL20 Insert tb1 (id,name) values (12,’wangwu’) √
SQL21 Update tb1 set id = 10 √
…… …… √
SQL30 Insert tb1 (id,name) values (12,’wangwu’) √
SQL31 Update tb1 set id = 10 √
…… …… √
SQL40 Insert tb1 (id,name) values (12,’wangwu’) √
SQL41 Update tb1 set id = 10 √
…… …… √
SQL50 Insert tb1 (id,name) values (12,’wangwu’) √Hvr Capture JOB
Hvr Integrate JOB
功能:online refresh
SQL1 Update tb1 set id = 10
…… ……
SQL10 Insert tb1 (id,name) values (12,’wangwu’)
14:01:01
14:01:02
14:01:03
14:01:04
14:01:05
14:01:06
14:01:07
SQL1 Update tb1 set id = 10 √
…… …… √
SQL10 Insert tb1 (id,name) values (12,’wangwu’) √
SQL11 Update tb1 set id = 10
…… ……
SQL20 Insert tb1 (id,name) values (12,’wangwu’)
SQL21 Update tb1 set id = 10
…… ……
SQL30 Insert tb1 (id,name) values (12,’wangwu’)
SQL31 Update tb1 set id = 10
…… ……
SQL40 Insert tb1 (id,name) values (12,’wangwu’)
SQL41 Update tb1 set id = 10
…… ……
SQL50 Insert tb1 (id,name) values (12,’wangwu’)
SQL21 Update tb1 set id = 10 √
…… …… √
SQL30 Insert tb1 (id,name) values (12,’wangwu’) √
SQL31 Update tb1 set id = 10 √
…… …… √
SQL40 Insert tb1 (id,name) values (12,’wangwu’) √
SQL41 Update tb1 set id = 10 √
…… …… √
SQL50 Insert tb1 (id,name) values (12,’wangwu’) √
Begin refresh
End refresh
Integrate Skip before refresh
Capture Skip before refresh
功能:online refresh
SQL1 Update tb1 set id = 10
…… ……
SQL10 Insert tb1 (id,name) values (12,’wangwu’)
14:01:01
14:01:02
14:01:03
14:01:04
14:01:05
14:01:06
14:01:07
SQL1 Update tb1 set id = 10 √
…… …… √
SQL10 Insert tb1 (id,name) values (12,’wangwu’) √
SQL11 Update tb1 set id = 10
…… ……
SQL20 Insert tb1 (id,name) values (12,’wangwu’)
SQL21 Update tb1 set id = 10
…… ……
SQL30 Insert tb1 (id,name) values (12,’wangwu’)
SQL31 Update tb1 set id = 10
…… ……
SQL40 Insert tb1 (id,name) values (12,’wangwu’)
SQL41 Update tb1 set id = 10
…… ……
SQL50 Insert tb1 (id,name) values (12,’wangwu’)
SQL21 Update tb1 set id = 10 √
…… …… √
SQL30 Insert tb1 (id,name) values (12,’wangwu’) √
SQL31 Update tb1 set id = 10 √
…… …… √
SQL40 Insert tb1 (id,name) values (12,’wangwu’) √
SQL41 Update tb1 set id = 10 √
…… …… √
SQL50 Insert tb1 (id,name) values (12,’wangwu’) √
Begin refresh
End refresh
Capture All Changes
Integrate Skip before refresh
功能:数据比对
生成
校验值
Bulk Compare
生成
校验值
仅对比校验值
Row-wise Compare
差异压缩数据流
生成
Inserts,
updates &
deletes
逐行比较
查询数据
并排序
Bulk Compare:
不需要排序,仅对比校验值,可快速确
定表是否一致
Row-wise Compare:
逐行比对,精确到字段,生成详细的
fix脚本
功能:文件复制
文件位置:
Unix和 Linux文件系统
Windows文件系统
Cloud IAAS文件系统
Hadoop分布式文件系统(HDFS)
Microsoft Sharepoint (WebDAV)
FTP以及SFTP
HVR能够在不同的操作系统、关系型数据库与文件系统(包括Hadoop/HDFS)之间对数据
进行同步
功能:数据转换
emp
id name
1 Eddie East
2 Wanda West
3 Ned North
state
5
7
5
4 Sally South5
cur_emp
使用如下ACTION 定义实现:
• ColumnProperties /Name=state /Extra
• Restrict /CaptureCondition=“exists (select 1 from lookup where
{state}=state and curr = ‘Y’)”
• Restrict /RefreshCondition=“ exists (select 1 from lookup
where {state}=state and curr = ‘Y’)”
salary
2200
2300
2450
2100
id name
1 Eddie East
3 Ned North
4 Sally South
salary
2200
2450
2100
HVR
state curr
5 Y
7 N
lookup
功能:Soft-Delete
正常
id name balance
11 张三 ¥20
22 李四 ¥0
33 王五 ¥99
id name balance
11 张三 ¥20
22 李四 ¥200
id name balance timestamp
deleted
?
11 张三 ¥20 2015-08-10 10:20:03 no
22 李四 ¥200 2015-10-11 16:12:54 no
33 王五 ¥99 2015-11-06 15:14:42 yes
id name balance timestamp change
11 张三 ¥20 2015-08-10 10:20:03 insert
22 李四 ¥0 2015-10-11 16:12:54 insert
22 李四 ¥200 2015-10-11 16:12:54 update
33 王五 ¥99 2015-10-10 10:14:42 insert
33 王五 ¥99 2015-11-06 15:14:42 delete
软删除
记录变更
李四: add ¥200
王五: 清空账户
• Compare和 Refresh仍然可
以正常运行
某些场景需求:
• 了解数据变更发生时间,形成流水表
• 了解数据变更过程,而不仅仅最终结果
功能:Burst
Capture Database Target Database
Changes
Table A Table B
Update row 1
Insert row 2
Insert row 3
Insert row 4
Update row 4
Update row 2
Update row 1
Table A Table B
Update row 1
Insert row 4
Insert row 2
Insert row 3
Insert
…select from
将批量的变更进行排序 有效提升提高性能 合并多个变更到一行
HVR的设计原则
减少I/O,尽量避免在数据库服务器产生文件、占用资源
提高效率,尽量使用数据库Native高效接口
tx文件产生在hub服务器上
通过网络,在目标端直接入库,不产生trail文件
row-wise方式数据比对可放在目标端执行
相对于odbc有更好的性能
有更多的功能
让数据像水一样流动…
HUB是控制的枢纽
HVR 功能简介
目录
HVR 对PostgreSQL的支持
异构数据库实时同步场景分析
对PostgreSQL的支持
曾经…使用ODBC
版本开始,使用libpq
更高的性能,不需要生成临时文件“copy … from stdin”
Log-Based capture from PostgreSQL!
努力开发
中…:)
0
5
10
15
20
25
0
5000
10000
15000
20000
25000
1
7
:4
9
:0
0
1
7
:5
1
:0
0
1
7
:5
3
:0
0
1
7
:5
5
:0
0
1
7
:5
7
:0
0
1
7
:5
9
:0
0
1
8
:0
1
:0
0
1
8
:0
3
:0
0
1
8
:0
5
:0
0
1
8
:0
7
:0
0
1
8
:0
9
:0
0
1
8
:1
1
:0
0
1
8
:1
3
:0
0
1
8
:1
5
:0
0
1
8
:1
7
:0
0
事务数与最大延迟
capture transactions Maximum Integrate Latency
0
100000000
200000000
300000000
400000000
500000000
600000000
事务日志产生量与hvr传输量
DBMS Log Bytes Written Routed Bytes
低效,为使用copy不得不生成临时文件
500M 14G / 36M 1G
对GreenPlum的支持
不得不使用ODBC
BULK LOAD方式的优化
曾经:在master节点生成临时文件,然后copy
• copy方式无法并行
优化:使用gpfdist
• 大批量数据加载效率低
• HVR AGENT必须安装在主节点上
• 自动创建外部表
• 仍然生成临时文件,但是在gpfdist文件服务器上,调用gpfdist
create external table <tb>_bx …
location (‘gpfdist://<file_server>:port/…’)
format …
• insert into <table> as select … from <tb>_bx