Kafka Linking:揭秘 AutoMQ 如何实现全球首个Zero-Downtime Kafka 迁移方案

别再手动算电阻了!手把手教你从ITF/IRCX文件自动生成EMX工艺文件(附脚本思路) 本文详细介绍了如何从ITF/IRCX文件自动生成EMX工艺文件,提升芯片设计效率。通过解析厚度变化多项式和电阻率查表,实现工艺文件的高效转换,避免手动处理带来的错误。文章还提供了脚本思路和验证方法,确保数据精确度,特别适用于电感仿真等关键环节。 阅读详情

01

前言

AutoMQ 是一款基于云存储全新设计的 Kafka 发行版,相较传统的 Apache Kafka 拥有 10 倍的成本优势和秒级的弹性能力。为帮助用户从原有的 Kafka 集群无损切换至 AutoMQ,我们在 5.0 版本中发布了 Kafka Linking —— 一种无停机时间(Zero Downtime)的全托管跨集群数据同步功能。当前业界现有的多种 Kafka 集群数据同步工具,如 MirrorMaker 2 [1], Confluent Cluster Linking [2], WarpStream Orbit [3] 等,在实现集群迁移时均要求发送端和消费端进行“停机”、“等待”、“重启”的三步过程,该操作过程不仅冗长,且由于等待时间不可控,导致迁移过程风险难以评估,从而进一步降低用户的使用体验。而使用 AutoMQ Kafka Linking 进行集群迁移,客户端仅需完成一次滚动升级,将客户端从原有的 Kafka 集群指向 AutoMQ 集群即可完成迁移,相较现有方案极大减少了人为操作成本。本文将介绍如何使用 AutoMQ Kafka Linking 从 Kafka 集群无损迁移至 AutoMQ,以及 Kafka Linking 背后的技术原理。

02

现有技术方案的痛点

以 Confluent 为例,下图是使用 Confluent Cluster Linking 进行集群迁移的过程 [4]:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ref:https://docs.confluent.io/cloud/current/_images/cluster-link-migrate-cc.png
可以看到,在迁移过程中,需要先停止源集群生产者,等待集群同步延迟为零后,对 Mirror Topic 进行 Promote(即停止同步),然后再将生产者重启并指向目标集群,在此过程可能导致分钟级的不可用时间。而业界其余方案(MM2, Orbit 等)的迁移过程也基本类似,原因在于这类方案均采用了单向同步链路,为避免消息分叉,在进行客户端迁移时需保证源集群与目标集群的数据已完全对齐且无新增。而 AutoMQ 在单向同步的基础上额外实现了反向转发,支持源集群和目标集群同时写入并保证写入一致性,从而实现一次滚动升级即可完成迁移。

03

使用 Kafka Linking 进行集群迁移

本节将介绍如何从任意一个支持 Kafka 协议的集群迁移至 AutoMQ 集群,下图为迁移步骤概览:使用 AutoMQ Console UI 进行迁移的具体步骤可参考 AutoMQ 官方文档:https://www.automq.com/docs/automq-cloud/migrate-to-automq/executing-migration

创建 Kafka Link

Kafka Link 代表了一个源集群到 AutoMQ 集群的同步链接,是管理一组待迁移的 Topic 和 Consumer Group 的最小单元,创建 Kafka Link 仅包含将源集群信息持久化至 AutoMQ,此时并不会产生其他额外资源创建和请求操作。

完成 Kafka Link 的创建后,AutoMQ 中已经记录下了 Kafka Link 对应的源集群的配置信息,后续将使用该配置信息与源集群建立连接。

创建 Mirror Topic

对所有待迁移的源集群 Topic 在 AutoMQ 集群创建相应的 Mirror Topic 以开始数据同步。Mirror Topic 在 AutoMQ 中拥有和普通 Topic 相同的读写能力,在这之上额外拥有对源集群 Topic 的同步和转发能力。如下图所示,在 AutoMQ 集群中创建了与源集群同名的 2 分区 Topic,Topic 创建完成时,数据同步即随之开始,此时从 Producer 发出的消息等效于双写源集群和目标集群。

创建 Mirror Consumer Group

对所有待迁移的 Consumer Group 在 AutoMQ 集群创建相应的 Mirror Consumer Group,该步骤是为后续同步消费位点做的前置准备,此时并不进行任何位点同步

迁移 Producer

完成上述资源创建后,即可直接进行 Producer 的迁移,由于 AutoMQ Kafka Linking 具备消息转发能力,用户可直接通过一轮滚动更新将 Producer 指向 AutoMQ 集群,此时所有发送至 AutoMQ 集群的消息会被直接转发回源集群,在保证发送不断流的情况下,源集群的 Consumer 还可持续消费到最新的消息。

迁移 Consumer

和迁移 Producer 类似,用户仅需进行一次滚动更新将 Consumer 指向 AutoMQ 集群即可,需要注意的是,为避免迁移过程中同一 Consumer Group 同时消费源集群和 AutoMQ 集群导致消费位点相互覆盖从而导致重复消费,AutoMQ 在此过程中会对连接到 AutoMQ 集群的 Consumer 禁读,当 Consumer 迁移完成全部指向 AutoMQ 时,需对 Consumer Group 进行 Promote。Promote Consumer Group 意味着用户已确认源集群所有 Consumer 都已下线。

注:使用 AutoMQ Console UI 进行迁移时,AutoMQ 可自动进行源集群 Consumer 感知及 Group Promote,无需用户手动操作),此时 AutoMQ 集群会从源集群同步该 Consumer Group 的消费位点并放开读取,此时指向 AutoMQ 集群的 Consumer 可接续源集群的消费位点继续消费。

Promote Topic

当 Producer 和 Consumer 都已完成迁移,用户可手动 Promote Topic 断开源集群和 AutoMQ 集群的链接,Promote 完成后,所有新消息均不会再转发回源集群,AutoMQ 集群也不会再从源集群同步消息。

至此 “topic-a” 从源集群到 AutoMQ 集群的迁移完成,对于源集群的其余 Topic 可重复进行上述步骤完成分批迁移。

04

Kafka Linking 技术原理

本节将从一个 Mirror Topic 从创建到 Promote 的完整生命周期来介绍 Kafka Linking 背后的技术原理。

Mirror Topic 感知及预处理

与负责副本数据同步的 Apache Kafka ReplicaFetcherManager 类似,Kafka Linking 会监听 Metadata Image 变更,当感知到 Partition Leader 变更时,会将 Partition 加入预处理队列,Kafka Linking Manager 会异步从队列中取出 Partition 进行如下预处理:1.通过 Partition 元数据过滤出需要被同步的分区。2.获取 Partition 归属的 Kafka Link ID,并索引到 Kafka Link 对应的源集群配置信息。3.根据源集群配置建立与源集群的连接,获取源集群元数据。4.通过源集群元数据获取 Partition 在源集群的 Leader 和副本分布。5.按照 Rack-aware 优先原则选择数据同步连接的目标节点,选择 Leader 作为数据转发的目标节点。6.根据 Partition 和选择的目标节点以及并行度限制,将分区路由到不同的 Fetcher 和 Router。

以上图为例,有三个分区(topic-a:0, topic-a:1, topic-b: 0)被创建至 AutoMQ 集群的 Node-0,而这三个分区在源集群中分布在三个不同节点,根据上述的预处理流程,分区会优先选择同 Rack 的节点作为数据同步节点,选择 Leader 所在节点作为数据转发节点,图中的 Fetcher 负责从数据同步节点拉取数据并写入本地,Router 负责将收到的消息发送至数据转发节点。如图所示,三个分区都选择了与本节点同 Rack 的 Node-0 作为同步节点,同时根据并发度配置(假设同步并发为 2),路由至两个 Fetcher 中。而由于转发节点均不相同,故路由到了三个不同的 Router 中。

数据同步

在上一小节中提到,每个分区最终会被路由到唯一一个 Fetcher 中,Fetcher 的数据同步流程如下:**1.确定起始拉取位点:**当 Fetcher 感知到新分区的加入时,会根据分区元数据决定分区的初始拉取位点。a.若分区为首次创建,则根据分区的起始位点时间配置(最新、最早或根据时间戳决定)向源集群获取分区位点。b.若分区不为首次创建,则使用分区最新位点作为起始拉取位点。**2.分区位点修正:**若分区为首次创建,则根据起始拉取位点对分区进行 truncate。**3.请求构造:**与 Apache Kafka Consumer 实现类似,Fetcher 也通过 FetchSessionHandler 构建增量拉取请求,减小冗余网络流量。**4.响应处理:**Fetcher 获取到请求响应后,会根据响应错误类型进行分别处理。a.存在分区错误:根据具体错误类型,对分区进行元数据更新、移除、重新路由 Fetcher、或退避重试的处理。b.不存在分区错误:对响应数据进行必要元信息修正后 Append 到本地存储。**5.状态更新:**当一次 Fetch 请求的响应处理完成后,Fetcher 会根据 Append 结果更新各分区下一次拉取位点,并重复 3~5 步骤进行持续数据同步。

数据转发

与 Fetcher 相对应,每个分区同样会被路由到唯一一个 Router 中,该分区收到的所有发送请求都会被路由至 Router 进行重新攒批和转发,消息转发的主要流程如下:**1.消息重新映射:**所有被路由到 Router 的消息均会被重新映射到内存中的待发送队列中,Key 为 Topic-Partition,Value 为该分区下所有待发送的消息组成的待发送消息池,在消息池中会根据消息来源的 Producer 进行再次分组,确保来自同一 Producer 的消息遵循 FIFO 的顺序被发出。**2.请求聚合:**由于 Router 收到的消息已经在 Producer 完成了 Record -> Batch 的聚合,Router 不会再次对同一分区的 Batch 进行二次聚合,而是在构建每个发送请求时,仅从每个分区的待发送消息池中挑选一个 Batch 加入发送请求中。**3.请求发送:**Router 完成一次发送请求构建后会从连接池中挑选合适的 Client 进行异步发送,并立即开始构建下一个发送请求,实现并发发送的效果。**4.响应处理:**当一次发送请求成功响应后,Router 会将该请求包含的分区对应的 Producer 的发送队列重新放回待发送消息池,使得该 Producer 的其余消息可在下一次请求中被发出。以下图为例,Producer-0 和 Producer-1 两个发送者分别向 topic-a:0 和 topic-b:1 两个分区发送消息 batch-0 ~ batch-2,以及 batch-0 ~ batch-1,经过 Router 的重新聚合后,这 5 条消息被聚合为 3 个发送请求,来源于 Producer-0 的消息被严格串行发送,保证同 Producer 消息有序,来源于不同 Producer 的消息并行发送,提高转发吞吐。

Topic Promote

Topic Promote 是集群迁移的最后一步,在触发 Topic Promote 后,AutoMQ 会伺机断开与源集群的同步和转发链路,其主要流程如下:1.在 Fetcher 构建拉取请求时,会遍历所有待拉取分区,发现被标记为 Promote 状态的分区时,标记本次 Fetch 请求为一次 Full-Fetch(即响应中强制返回所有请求的分区结果,即便结果为空)。2.Fetcher 收到响应后,判断 Promote 分区的同步延迟是否足够小:a.延迟不足够小:表示此时数据还在追赶中,继续后续正常同步请求。b.延迟足够小:触发分区所在 Router 的 Fence 操作,停止 Router 转发该分区后续 Produce 请求(避免源集群分区持续收到新消息),并等待所有 In-Flight 转发请求全部响应后标记分区状态,此时可确认源集群对应分区已无任何在途新消息。3.在下一轮 Fetch 请求构建时再次标记为 Full-Fetch,判断同步延迟为 0 时,表示该分区所有数据均同步完成,此时标记分区为 Promote 完成,分区从 Fetcher 和 Router 中移出,后续新写入消息直接写入 AutoMQ 集群本地。分区在 Fetcher 中的状态机流转如下:

05

结语

本文介绍了如何使用 AutoMQ Kafka Linking 进行集群迁移,以及 Kafka Linking 背后的技术原理。Kafka Linking 不仅可以用于高效无损的集群迁移,未来 AutoMQ 还会对其进行持续迭代,支持基于 Kafka Linking 的集群容灾、多活、跨集群数据共享等企业级能力。

参考资料

[1]Geo-Replication: https://kafka.apache.org/40/documentation/#georeplication[2]Confluent Cluster Linking: https://docs.confluent.io/cloud/current/multi-cloud/cluster-linking/index.html[3] WarpStream Orbit: https://docs.warpstream.com/warpstream/byoc/orbit[4] Migrate Data with Confluent Cluster Linking: https://docs.confluent.io/cloud/current/multi-cloud/cluster-linking/migrate-cc.html

END

13、核心网络模块:VyOS 设备配置实战 本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。 阅读详情

相关推荐

Unity四部曲(核心)

需要先改成Cube复杂的展开留到unity进阶再说。

ultraman1234566的博客 2797

kafka 怎么保证的exactly once

Kafka auto.offset.reset值详解 发表于2017/7/6 11:25:22 1010人阅读 分类:Kafka 昨天在写一个java消费kafka数据的实例,明明设置auto.offset.reset为earliest,但还是不从头开始消费,官网给出的含义太抽象了。earliest: automatically reset the offset to...

afei2530的博客 1121

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

kafka 的 auto.offset.reset 含义详解

最近也是有人问我kafka的auto.offset.reset设置为earliest后怎么结果和自己想象的不一样呢,相信很多人都对这个参数心存疑惑,今天来详细讲解一下: kafka-0.10.1.X版本之前:auto.offset.reset 的值为smallest,和,largest.(offest保存在zk中) kafka-0.10.1.X版本之后:auto.offset.reset ...

JasonLee实时计算 3万+

LLMOps的崛起:如何利用Langfuse和Opik构建高效的模型监控与评估体系

本文探讨了LLMOps的崛起,详细介绍了如何利用Langfuse和Opik构建高效的模型监控与评估体系。通过开源工具Langfuse的全景监控方案和Opik的三层评估体系,帮助AI工程团队实现大语言模型的全生命周期管理,提升模型性能和迭代效率。文章还提供了实战技巧和工具链集成方案,助力企业优化AI应用。

ll5678的博客 680

避坑指南:WSL2网络模式修改导致无法上网的解决方案(附备份还原技巧)

本文深入解析WSL2默认网络隔离机制,并提供三种安全的端口互通方案,重点推荐通过配置Windows防火墙规则实现稳定访问。同时,针对网络配置修改可能引发的无法上网问题,给出了从重置配置到系统级备份的完整恢复指南,确保开发环境安全可靠。

jj890的博客 781

Kafka auto.offset.reset值详解

昨天在写一个java消费kafka数据的实例,明明设置auto.offset.reset为earliest,但还是不从头开始消费,官网给出的含义太抽象了。 earliest: automatically reset the offset to the earliest offset,自动将偏移量置为最早的。难道不是topic中各分区的开始?结果还真不是,具体含义如下:auto.offset.res

李双喆 21万+

小新学习K8s第一天之K8s基础概念

kubernetes是一个可移植,可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明式配置和自动化。它拥有庞大且快速发展的生态系统。kubernetes服务,支持和工具随处可见。作用:用于自动部署,扩展和管理“容器化应用程序”的开源系统。可以理解成k8s是负责自动化运维管理多个容器化程序(比如docker)的集群,是一个生态及其丰富的容器编排框架工具。

pangdongqiqi的博客 1228

消费回调固定 return nil:错误传播与 Kafka 位点提交的区别

Mongo 写入失败时处理器记录错误但不 Mark,外层回调仍返回 nil;返回值与 Kafka 位点提交是不同动作。失败消息是否重投或被后续位点越过,需要结合分区水位分析。

2501_92769340的博客 168

从MC到DC:三维重建算法的核心原理与实战对比

本文深入对比了三维重建领域两大经典算法Marching Cubes(MC)与Dual Contouring(DC)的核心原理与实战表现。MC算法原理直观、实现简单,但存在特征丢失和二义性问题;DC算法通过求解二次误差函数(QEF)和利用法向量信息,能更好地保留模型的尖锐特征,但计算更复杂。文章结合医学影像处理实例,为开发者根据速度、精度和特征保真度需求选择合适算法提供了清晰指南。

weixin_29251131的博客 1034

【文献笔记】CVPR 2023|Attention-Based Point Cloud Edge Sampling

优点能够有效采出点云数据的边缘点分类任务性能优越不足没有设计出一个更好的上采样方法,导致分割任务的性能略低只考虑了边缘特征,没有利用其他几何特征。

m0_55908255的博客 320

Kafka 如何实现顺序消费?

Kafka仅保证分区内消息有序,不支持全局有序。实现顺序的关键是:生产端通过相同Key确保消息进入同一分区(配合幂等生产者防重试乱序),消费端保证分区独占且按Key路由至内存队列,由单线程串行处理。吞吐提升可按Key拆分队列并行处理,避免并行导致乱序。核心口诀:同Key同分区,同分区同线程。

206

如何选择深度强化学习算法:MuZero/SAC/PPO/TD3/DDPG/DQN/等算法

如何选择深度强化学习算法:MuZero/SAC/PPO/TD3/DDPG/DQN/等算法

丨汀、的博客 5222

第十二篇:《完整实战:订单事件驱动系统(Kafka + 消费者 + 死信队列)》

这篇按一条完整的订单链路来搭:订单服务写库 + 发事件,库存服务消费并扣减,失败走指数退避重试,重试耗尽后进入死信队列,消费端全程幂等去重。Outbox 的 relay 是至少一次,DLQ 的重试也是至少一次。重试消费组的 Lag 速率:order-events.retry 的消费 lag 如果持续增长且不回落,说明重试没有收敛,可能正在走向“重试爆炸”的早期形态。retries=MAX_VALUE 配合幂等生产者,解决的是生产者重试导致的 Broker 端重复,不解决消费端业务重复——后者是下一节的事。

qq_45239623的博客 393

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Flink 连接器选型实战:HDFS、Kafka、MySQL 与 Doris 的分层数据架构

连接器选型不是技术炫技,而是对数据特征的准确判断。HDFS承担离线归档与批处理,靠分区和滚动策略控制文件质量。Kafka是实时链路的中枢,靠分区、攒批和事务保证吞吐与一致性。MySQL只做维表和小结果集,靠缓存和限流保护在线库。Doris承接大数据量分析写入,靠分桶、攒批和两阶段提交保证性能与准确。把这四者按数据规模、延迟要求和一致性要求分层组合,就能搭出一套既稳定又可扩展的 Flink 数据架构。

2401_83857914的博客 797

Kafka 的存储也能进对象存储:用 AutoMQ 把日志流写进 RustFS

Kafka 的痛点是存储和 broker 绑死在一起。topic 一多、留存一久,broker 本地盘就被日志段塞满,扩容不是加 broker 就是换更大的盘,数据还得在节点间搬来搬去。更麻烦的是 broker 一旦挂了,恢复全靠副本在别的节点重建,磁盘 IO 先爆一轮。AutoMQ 是 Kafka 的一个云原生发行版,思路是把存储和 broker 彻底解耦:预写日志先在本地缓冲,随后作为不可变…

分布式存储与RustFS的博客 320

第八篇:《Kafka Connect 与 Kafka Streams:数据集成与流处理的两种路径》

还有 exactly.once.source.support 只覆盖 Source 侧的精确一次,Sink 侧的重复仍然要靠目标系统的幂等或 DLQ 兜底——这和第七篇的结论完全一致:框架不解决语义正确性,只解决工程效率。KRaft 和 EOS 让 Kafka 内部更可靠,但 Connect 和 Streams 的分工不会因此模糊:Connect 把数据搬进来搬出去,Streams 在 Kafka 内部算,算到边界之外仍然要自己兜底一致性。判断标准只有一句话:你是在“搬数据”,还是在“算数据”。

qq_45239623的博客 363

【Kafka 从入门到实战】从手写一个队列到生产级消息中间件:架构、分区、消费组、零拷贝全解析

本文从队列基础出发,层层解析Kafka架构与设计精髓,涵盖消息队列本质、核心术语、分区机制、生产者消费者模型及四大性能优化原理:顺序写入、批量压缩、页缓存、零拷贝。附完整可运行Python代码(建Topic、生产/消费),并总结12道高频面试题与踩坑记录,帮助读者真正理解Kafka“为何快”,而非仅背“零拷贝”一词。

wiwiwiwiooo的博客 332

kafka指定分区消费

【代码】kafka指定分区消费。

hy_208的博客 67

只 Mark 最后一条:Kafka 跨分区消费水位的风险

历史快照中两个分区重启后 lag 为 1;当前批次回调只 Mark 最后一条,可能漏记其他分区的进度,但快照不足以证明永久停滞或唯一根因。

2501_92769340的博客 182

第九篇:《Kafka 监控与运维:Lag、Under-replicated Partition 与磁盘管理》

标签:Kafka | 监控 | Consumer Lag | Under-replicated Partition | 磁盘管理 | 运维 | SRE适合人群:负责 Kafka 集群稳定性的 SRE、后端开发,被“告警响了但不知道要不要起床”折磨过的同学阅读收益:搞清楚 Lag 告警为什么用绝对值会双向失效、URP 为什么不能一看到就重启、磁盘管理为什么“百分比告警”是错的,以及三条可以直接抄的运维规则前言:凌晨两点的两个告警,一个误报,一个差点搞出大事故先说两个真实场景。

qq_45239623的博客 444

第十篇:《Kafka 安全加固:SASL、SSL、ACL 与多租户隔离》

allow.everyone.if.no.acl.found 的生产语义必须理解清楚:默认 false 是安全的选择——如果一个资源没有任何 ACL,除了超级用户,谁都无权访问。最关键、也最容易被误解的语义是:配额是按 Broker 强制的,不是按集群强制的。另一个静默坑是后缀与格式不匹配:给 PKCS12 格式的密钥库文件用了 .jks 后缀,部分 Spring Boot 版本的 SSL 类型自动探测会按 JKS 格式加载,失败后直接返回空密钥库,启动时不抛异常,只在握手时表现为没有证书。

qq_45239623的博客 307

Kafka 消费者每 5 分钟触发一次 Rebalance,把 max.poll.interval.ms 调大仍然掉线

消费者加入消费组后每约 5 分钟被踢出一次。文中命令与代码块可直接复制执行,未实测的结论均已单独标注。文中给出了可复现的环境与操作步骤,并标注了哪些结论已经验证、哪些仍属推测。

昨日种种,皆成今我。今日种种,皆成新我。 179

第二篇:《CommitLog + ConsumeQueue:一条日志解决 Kafka 多分区随机写的难题》

RocketMQ 采用 CommitLog 全局顺序写 + ConsumeQueue 索引的存储模型,解决 Kafka 多 Topic 场景下跨 Partition 随机写问题。CommitLog 存所有消息,保证写入顺序;ConsumeQueue 为每 Topic+Queue 的 20 字节索引(偏移量、长度、Tag 哈希),支持消费者“读两次”定位消息。虽有读放大与异步重建代价,但通过顺序写与 mmap 零拷贝实现高性能,本质是用索引换写入可扩展性。

qq_45239623的博客 241

ubuntu安装kafka

搭建基于KRaft模式的Kafka三节点集群,使用Kafka 3.9.1与Java 11,三台机器(master、worker1、worker2)各承担broker与controller角色。通过统一集群ID初始化,配置节点ID与监听地址,分发配置并设置环境变量。启动后通过命令行创建主题、测试消息收发,验证集群正常运行。无需ZooKeeper,适合实验环境。日常启停需在每台执行对应脚本。

qq_43592674的博客 199

极致工程之美:Kafka 时间轮与 LevelDB LSM-Tree 的架构同构赏析

Kafka分层时间轮与LevelDB LSM-Tree虽服务于不同场景,却共享同一设计哲学:在高吞吐与有限资源的困境中,以幂次分层、局部吸收与级联下沉破局。二者均通过指数级扩张的层级结构,将高频操作限制于浅层,低频归并沉淀于深层,实现时间与空间维度的高效调度。其核心思想在于:允许局部无序以换取全局稳定,借由降频级联重构秩序,体现了系统工程中“以退为进”的极致优雅。

weixin_42418361的博客 191

消息队列入门:RabbitMQ 与 Kafka 核心概念与运维要点

BIOS→GRUB→内核→systemd→target 全链路解读,root 密码忘了解锁、文件系统损坏修复、单用户模式与救援模式实战,服务器起不来时的救命指南。

2502_91473995的博客 380
上一篇: XEOS 与 AutoMQ 推出联合方案,共筑云原生 Kafka 新生态
下一篇: 技术干货 | Kafka 网络成本失控?如何彻底根除 AWS、GCP 上的 Kafka 网络隐性成本?
AutoMQ
博客等级 码龄3年 1206粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值