视频网站的服务器建设,预付网站制作费怎么做凭证,网站图标下载,济南食品行业网站开发1 基于业务代码嵌入式的增量同步方式在Java业务代码要修改业务数据的地方#xff0c;增加调用写入ES数据的方法优点#xff1a;1、实现方式简单#xff0c;可控粒度高#xff1b;2、不依赖第三方数据同步框架#xff1b;3、数据库不用做特殊配置和部署#xff1b;缺点增加调用写入ES数据的方法优点1、实现方式简单可控粒度高2、不依赖第三方数据同步框架3、数据库不用做特殊配置和部署缺点1所有修改数据的地方都要添加同步ES逻辑新增接口或者修改代码要同时关注ES的同步逻辑否则可能导致数据库和ES的数据不一致 2如果直接提sql修数据会造成数据库和ES数据不一致 3要自己处理同步失败的重试问题2 基于数据库离线日志的增量同步方式通过监控oracle的redo log日志和在线日志的方式把日志文件还原成sql把sql发送到MQ中间件Java消费MQ数据把数据的变更同步到ES同步流程参考下图。优化1、对数据库性能损耗最小2、对业务代码侵入性最低3、不容易造成数据库和ES数据不一致情况缺点1、解析日志方式较为复杂只能采用第三方开源框架引入第三方开源框架会增加技术学习成本和运维成本并且其稳定性不敢保证 2、需要公司DBA团队配合需要Oracle开启日志记录等配置需要开DBA系统账号另外可能还需要开启Oracle的ASM实例基于数据日志的增量同步开源框架O2Khttps://hub.docker.com/r/woqutech/o2k3 基于数据库触发器的增量同步方式通过数据库的触发器监控数据的增加、修改、删除然后把新增、修改、删除的数据备份一条数据到变更记录表里通过Java定时器定时同步方式的把变更的数据同步到ES中具体同步流程参数下图。优点1、不会造成数据库和ES数据不一致情况2、业务代码侵入性低3、技术实现简单、便捷就算不依赖第三方框架也能轻松实现当然也有基于触发器实现的数据同步开源框架比如SymmetricDS缺点触发器对insert、update、delete有一定性能损耗基于触发器实现的开源框架SymmetricDS文档参考https://www.symmetricds.org/doc/3.14/html/user-guide.html#_kafka4 基于数据库通知的增量同步方式启动应用程序通过OracleConnection.registerDatabaseChangeNotification(Properties prop).addListener(DatabaseChangeListener listener)的方式接收oracle数据变更通知优点1、同步延时低2、代码侵入性低缺点1、通知特性是Oracle的实验特性并不稳定有些版本并不支持 2、要自己处理数据同步失败的缓冲问题前面的方案中的MQ和变更记录表就是中间缓冲基于Oracle通知实现的增量同步开源框架DBSyncer参考文档https://gitee.com/ghi/dbsyncer?_fromgitee_search#%E4%BB%8B%E7%BB%8Dimport oracle.jdbc.OracleConnection;import oracle.jdbc.OracleStatement;import oracle.jdbc.dcn.*;import oracle.jdbc.pool.OracleDataSource; import java.sql.ResultSet;import java.sql.SQLException;import java.util.Arrays;import java.util.Properties; /** * author tuyou * date 2023/1/11 17:08 */public class MyTest { public static void main(String[] args) throws SQLException { String tableName EXPENSE_GENERAL_ORDER; OracleDataSource dataSource new OracleDataSource(); dataSource.setUser(xxx); dataSource.setPassword(xxx); dataSource.setURL(jdbc:oracle:thin:ip:1521/xxx); final OracleConnection conn (OracleConnection) dataSource.getConnection(); Properties prop new Properties();// prop.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION, true);// prop.setProperty(OracleConnection.DCN_NOTIFY_CHANGELAG, 1); prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, true); prop.setProperty(OracleConnection.NTF_QOS_PURGE_ON_NTFN, true); prop.setProperty(OracleConnection.NTF_TIMEOUT, 0); final DatabaseChangeRegistration databaseChangeRegistration conn.registerDatabaseChangeNotification(prop); databaseChangeRegistration.addListener(new DatabaseChangeListener() { Override public void onDatabaseChangeNotification(DatabaseChangeEvent databaseChangeEvent) { long regId databaseChangeEvent.getRegId(); System.out.println(change notify: Arrays.toString(databaseChangeEvent.getTableChangeDescription())); if (regId databaseChangeRegistration.getRegId()) { TableChangeDescription[] tds databaseChangeEvent.getTableChangeDescription(); System.out.println(TableChangeDescription change count: tds.length); for (TableChangeDescription td : tds) { System.out.println(table id: td.getObjectNumber()); System.out.println(table name: td.getTableName()); RowChangeDescription[] rds td.getRowChangeDescription(); for (RowChangeDescription rd : rds) { System.out.println(row id: rd.getRowid().stringValue()); System.out.println(row change count: rd.getRowOperation().toString()); } } } }); OracleStatement statement (OracleStatement) conn.createStatement(); statement.setDatabaseChangeRegistration(databaseChangeRegistration); ResultSet resultSet statement.executeQuery(select * from tableName where 12); statement.close(); System.err.println(started); } }5 基于扫描表更新时间的增量同步方式在数据库表更新时自动更新表的更新时间然后通过定时任务扫描更新时间大于最后同步时间的数据拿到更新的数据优点1、实现相对简单2、可以在从库上做扫描不会影响主库压力缺点1、oracle还是要建立触发器才能自动更新时间也会存在触发器的缺点2、对于删除的数据无法根据更新时间发现只能用ES的数据和数据库的数据做全量对比才能发现删除数据6 基于Oracle的闪回查询方式的增量同步方式oracle的闪回查询可以查询最近一段时间的数据的增删改记录利用这种特性也可以做增量同步优点1、实现原理相对简单2、不用采用触发器缺点1、闪回查询有时间保留限制如果应用由于停机原因可能造成部分数据变动没有同步2、闪回查询数据量和实际表数据量相关如果表数据量较大查询会非常慢闪回查询sql参考(SELECT F_DJBH FROM BF_BIZ_INFO AS OF TIMESTAMP to_timestamp(2023-02-02 10:30:00, yyyy-mm-dd hh24:mi:ss)minusSELECT F_DJBH FROM BF_BIZ_INFO)union(SELECT F_DJBH FROM BF_BIZ_INFOminusSELECT F_DJBH FROM BF_BIZ_INFO AS OF TIMESTAMP to_timestamp(2023-02-02 10:30:00, yyyy-mm-dd hh24:mi:ss))7 基于Oracle的SCN机制方式的增量同步方式同步思想5类似但是更新时间是基于oracle的SCN机制利用oracle的隐藏的ora_rowscn列来发现更新的数据参考sqlselect ora_rowscn, F_DJBH from BF_BIZ_INFO where ora_rowscn 169639743457优点1、实现相对简单2、可以在从库上做扫描不会影响主库压力缺点1、对于删除的数据无法根据更新时间发现只能用ES的数据和数据库的数据做全量对比才能发现删除数据或者建立一个delete触发器8 其他ETL开源平台DataX采用写sql的扫描数据不适合做线上数据同步只适合离线数据同步。官方文档https://github.com/alibaba/DataX/blob/master/introduction.md 同步案例 https://blog.csdn.net/weixin_42418589/article/details/126019261Tapdata开源版本并不支持Oracle可以支持Mysql最终选择基于对我们系统现状的分析最终确定的方案选择是基于Oracle的SCN机制 触发器来实现增量同步数据到ES不依赖开源框架基于Oracle的SCN机制实现insert/update数据的增量同步基于delete触发器实现delete数据的增量同步。具体同步逻辑如下图。