关键词:数据同步、数据异构、数据迁移。介绍在当今时代,数据是业务运营的核心。 随着业务的扩展和用户的增加,确保不同细分市场的数据一致性、及时性和可靠性至关重要。 本文介绍几种常见的数据同步场景,包括数据库主从同步、数据迁移同步、实时数据同步等。 通过深入了解各种解决方案的特点、优势和局限性,我们可以更好地选择和定制适合特定业务场景的数据同步策略,为构建高效、稳定、可扩展的系统奠定基础。
主要内容如下:
方案。
1.数据库主从复制。
数据库主从复制是一种常见的数据同步方案,其中主数据库将其更改操作传播到一个或多个从数据库。
MySQL数据库主从复制的配置步骤:
确保主从版本一致:确保主从数据库使用相同的MySQL版本,以避免兼容性问题。 配置主数据库:在主数据库上配置配置,然后打开 mysql 配置文件(通常为 my.)。CNF 或我的ini),参数设置:
设置主服务器的唯一标识符 server-id = 1 启用二进制日志记录,记录主数据库上的所有更改 log bin = var log mysql mysql-binlog 指定要复制的数据库binlog do db = 您的数据库名称
创建复制用户:在主数据库上创建用于复制的用户,确保该用户具有适当的权限:将复制用户和复制密码替换为您自己的用户名和密码 创建用户'replication_user'@'%' identified by 'replication_password';授予复制权限 Sl**e on *to 'replication_user'@'%';刷新权限更改应用刷新权限;
获取主数据库的二进制日志位置,请执行以下命令,记录配置从库时使用的输出文件和位置。show master status; mysql> show master status;+-file | position | binlog_do_db | binlog_ignore_db | executed_gtid_set |+mysql-bin.000001 | 6470 | your_name | 1 row in set (0.00 sec)
配置Slave Database:在Slave数据库上配置,打开MySQL配置文件,设置参数:server-id = 2
保存配置并重新启动从属数据库。
从数据库连接到主数据库:在从数据库上执行以下命令,替换主数据库的主主机、主用户、主密码、主日志文件和主日志 pos 信息
配置从数据库到主数据库的连接,将主数据库更改为主主机 ='master_host',master_user = 'replication_user',master_password = 'replication_password',从显示主站状态;中的文件值。 master_log_file = 'master_log_file',从显示主站状态;在主日志 pos 中获取的位置值 = 主日志 pos;
从数据库启动复制过程:start sl**e;
验证复制状态:对主数据库进行一些数据更改,并在从数据库上执行以下命令show sl**e status\g
总之,主从复制方案适用于读多写少的场景,读请求可以与从库共享,减少主库的负载。 优势:提高读取性能,卸载主数据库,并提供灾难恢复和备份机制。 局限性:复制延迟可能导致数据库中的数据不一致主数据库中的单点故障可能会影响整个系统;不适用于写入密集型应用程序。
解决方案 2:从 ETL 工具迁移数据
ETL(extract, transform, load)工具广泛用于不同数据存储系统之间的数据迁移、集成和同步,特别是在大规模数据迁移、数据仓库建设、数据清洗和转换中。 常见的 ETL 工具有:
名称主要特点适用场景Apache Nifi提供直观的可视化界面,支持实时数据流,强调易用性和可管理性,适合构建实时数据流,界面简单易用,管理功能强大Talend Open Studio强大的图形界面和丰富的连接器,支持多种数据源和目标,复杂的转换和清洗功能适用于复杂的数据转换,多源多目标数据同步,大规模数据迁移 Apache Camel基于企业集成模型,支持多种协议和数据格式,适用于构建灵活的数据集成解决方案、企业级数据集成和消息路由 Kettle (Pentaho) 提供了一个图形界面,支持强大的数据操作和转换能力,并集成了
选择建议:
如果您正在寻找实时数据流和易用性,Apache NiFi 是一个不错的选择。 对于复杂的数据转换和大规模迁移,Talend Open Studio 提供了丰富的功能和广泛的连接器。 如果您已经在使用 Apache Camel 的其他组件,或者如果您需要高度的灵活性和可定制性,您可能需要考虑使用 Apache Camel。 对于全面的数据集成和商业智能,Pentaho 数据集成可以是一个全面的解决方案。 具体用途取决于业务的特定需求、技术堆栈和团队的技能水平。
这里我们以 Apache Nifi 为例来说明数据迁移的过程。
官网地址: *地址:
安装和部署由读者自行咨询。 本节介绍根据 ETL 函数的主要执行过程。
独立架构:
Web 服务器的作用是托管 NIFI 基于 HTTP 的命令和控制 API。
流量控制器是操作的核心。 它为扩展提供运行线程,并管理扩展何时接收执行资源计划。
有各种类型的 NIFI 扩展,其他文档中对此进行了介绍。 这里的关键点是扩展在 JVM 中运行和执行。
FlowFile 存储库 Flowfile 存储库是 NIFI 跟踪当前在流中处于活动状态的给定 Flowfile 状态的位置。 存储库的实现是可插拔的。
内容存储库 内容存储库是给定流文件的实际内容字节所在的位置。
来源存储库 来源存储库是存储所有来源事件数据的地方。
工具定位及使用流程:
在这里,我们将以从MySQL查询数据并向MySQL写入数据为例,演示一个简单的过程
详细步骤请参考(文章来源):
如果你有兴趣,可以深入挖掘,这里我只想解释一下:对于大数据量的处理,包括数据提取、数据加载、增量数据同步,都可以使用这些工具,ETL工具提供了一些可视化组件+配置特定的链接类型。 可以节省大量人力成本,间接保证数据一致性。 这是一个很好的数据处理工具。 但是,由于引入了新的组件,在数据源较多的情况下,不可避免地会给系统带来复杂性。
方案。
3. 触发增量数据同步。
例如,当新数据插入TB顺序表时,触发示例中的触发器,并将新数据同步到TB顺序HIS表中(读者可以根据需要调整触发时序和逻辑)。
状态:TB 订单共有 3 条记录。
TB 订购他的 0 条记录。
触发逻辑脚本:
创建触发器 创建触发器同步订单到历史记录后插入 tb 订单对于每一行开始插入到 tb 订单中他的(订单 ID、客户 ID、订单日期、产品 ID、数量、总价、状态、送货地址、付款方式、优惠券代码、创建时间、更新时间)值(新。order_id, new.customer_id, new.order_date, new.product_id, new.quantity, new.total_price, new.status, new.shipping_address, new.payment_method, new.coupon_code, new.create_time, new.update_time );end;//delimiter ;
此触发器在 TB Order 表中发生插入操作后触发,并将新插入的数据复制到 TB Order His 表中。 请注意,我假设 tb order 他的表的结构与 tb order 表相同。
测试触发器的工作:
插入 tb 顺序值(4、4、'2024-01-15 12:00:00', 104, 4, 150.25, '待付', '567 elm st, county', 'credit card', 'discount_15', '2024-01-15 12:00:00', '2024-01-15 12:00:00');查询TB Order His,确保数据同步成功,从TB Order His中选择*;
检查结果:同步成功:
tb_order
tb_order_his
触发同步的优点:
实时性:触发器可以实时同步数据,当触发事件发生时,立即进行同步操作,确保目标表中的数据与源表同步。
简化操作:触发器在数据库级别自动执行同步操作,无需在应用程序中编写额外的同步逻辑,简化开发和维护。 保证源表和目标表的数据一致性。
触发同步的缺点:
性能影响:触发器的执行会带来额外的性能开销,尤其是在大规模执行数据操作时。 频繁触发的触发器可能会导致数据库性能下降。
复杂性:当触发逻辑复杂或有多个触发器时,可能很难跟踪和调试触发器的行为,尤其是在维护方面。
并发控制:在高并发环境中,触发器可能会导致并发控制出现问题,需要谨慎处理以确保数据一致性。
方案。
第四,手动脚本同步(朴实无华)。
这是一个常见的SQL脚本,常用于运维过程中的数据割接、错误数据修改,包括配置数据、业务字段、异常数据的手动调整等。 比较简单,只是为了对文章结构进行完整的解释。 让我们举一个简单的例子:
# insert into tb_target select * from tb_sourceinsert into tb_order_his ( order_id, customer_id, order_date, product_id, quantity, total_price, status, shipping_address, payment_method, coupon_code, create_time, update_time)select order_id, customer_id, order_date, product_id, quantity, total_price, status, shipping_address, payment_method, coupon_code, create_time, update_timefrom tb_order;
这比较简单,没有什么可总结的。
方案。
5.实时数据同步方案(使用消息队列)。
在此场景中,MySQL数据更改事件被捕获,并通过消息队列传递到下游数据源。 例如,如果要将 MySQL 中的数据同步到 ClickHouse,则可以使用 Debezium 作为 Change Data Capture(MySQL CDC)工具,使用 Kafka 作为消息队列。 大致步骤:
配置MySQL数据库连接信息
MySQL 连接配置数据库hostname=mysql-hostdatabase.port=3306database.user=mysql-userdatabase.password=mysql-password debezium 配置连接器class=io.debezium.connector.mysql.mysqlconnectortasks.max=1database.server.id=1database.server.name=my-app-connectordatabase.whitelist=mydatabase
启动 Debezium 连接器:从命令行或配置文件启动 Debezium 连接器,例如:
debezium-connector-mysql my-connector.properties
创建 kafka-topic:Debezium 将 change 事件发送到 kafka 主题,确保 kafka 主题已创建:
kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my-topic
jA 伪示例 - 消费 Kafka 主题,写入数据到 ClickHouse:import org.apache.kafka.clients.consumer.consumer;import org.apache.kafka.clients.consumer.consumerconfig;import org.apache.kafka.clients.consumer.consumerrecords;import org.apache.kafka.clients.consumer.kafkaconsumer;import org.apache.kafka.common.serialization.stringdeserializer;import j**a.time.duration;import j**a.util.collections;import j**a.util.properties;public class clickhousedataconsumer }catch (exception e) private static void processkafkamessage(string message) private static void writetoclickhouse(string message) }
使用 Kafka 实时同步 MySQL 有几个优点和缺点:
优点: 高实时性:Kafka 是一种高吞吐量、低延迟的消息队列系统,提供近乎实时的数据同步,使应用程序能够快速获取最新的数据变化。
消息持久化:Kafka 具有消息持久化功能,确保消费者即使离线一段时间,仍然可以检索到之前未处理的消息,并确保数据不丢失。
缺点: 一致性保证:Kafka 保证了分区内消息的顺序,但很难保证集群内消息的顺序。 在某些情况下,可能需要采取其他措施来确保全局一致性。
对于小规模应用程序,引入 Kafka 可能看起来过于繁琐,轻量级解决方案可能更合适。
总结
同步方案说明优点限制数据库主从复制利用数据库本身的主从复制功能,将主库的变更同步到一个或多个从库。 实现简单,可以提供相对实时的数据同步,适用于读多写少的场景。 主从之间需要稳定的网络连接,随之而来的是主从延迟的问题。 适用于MySQL、PostgreSQL等数据库。 ETL 工具数据迁移使用 Apache Nifi 和 Talend 等专业 ETL 工具,定期从源数据库中提取数据,进行数据转换,然后加载到目标数据库中。 它可以进行复杂的数据转换和清洗,适用于异构数据库之间的同步。 您需要配置适当的调度策略来处理增量同步和全量同步。 在源数据库中设置了基于数据库触发器的同步触发器,用于在数据发生变化时触发相应的操作,例如记录同步表的更改,目标数据库会定期轮询同步表并处理更改。 可实现实时同步,适用于小规模数据。 需要仔细设计触发器,以避免对源数据库的性能产生不成比例的影响。 手动数据脚本手动编写数据脚本,将数据从一个数据库插入到另一个数据库。 简单明了,适合小规模数据同步。 在线配置、数据割接等异常情况的处理被认为是干扰因素。 实时数据同步场景(使用消息队列)将源库的变更操作发布到消息队列,消费者订阅消息并将变更操作同步到目标库。 实现实时同步,异步处理对系统性能影响不大。 考虑消息队列的可靠性和使用者的幂等性。
结束