分类: 云计算

云计算

10分钟带你逆袭kafka之路

1. kafka概述

##1.1 kafka简介

Apache Kafka 是一个快速、可扩展的、高吞吐的、可容错的分布式“发布-订阅”消息系统, 使用 Scala 与 Java 语言编写,能够将消息从一个端点传递到另一个端点,较之传统的消息中 间件(例如 ActiveMQ、RabbitMQ),Kafka 具有高吞吐量、内置分区、支持消息副本和高容 错的特性,非常适合大规模消息处理应用程序。

Kafka 官网: http://kafka.apache.org/

Kafka主要设计目标如下:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
  • 同时支持离线数据处理和实时数据处理。
  • 支持在线水平扩展。

Kafka通常用于两大类应用程序:

  • 建立实时流数据管道,以可靠地在系统或应用程序之间获取数据
  • 构建实时流应用程序,以转换或响应数据流

要了解Kafka如何执行这些操作,让我们从头开始深入研究Kafka的功能。

首先几个概念:

  • Kafka在一个或多个可以跨越多个数据中心的服务器上作为集群运行。
  • Kafka集群将记录流存储在称为主题的类别中。
  • 每个记录由一个键,一个值和一个时间戳组成

1.2 kafka架构体系

在这里插入图片描述

1.3 kafka的应用场景

kafka的应用场景非常多, 下面我们就来举几个我们*常见的场景

1.3.1 用户的活动跟踪

用户在网站的不同活动消息发布到不同的主题中心,然后可以对这些消息进行实时监测、实时处理。当然,也可以加载到Hadoop或离线处理数据仓库,对用户进行画像。像淘宝、天猫、京东这些大型电商平台,用户的所有活动都要进行追踪的。

1.3.2 日志收集

在这里插入图片描述

1.3.3 限流削峰

在这里插入图片描述

1.3.4 高吞吐率实现

Kafka与其他MQ相比,*大的特点就是高吞吐率。为了增加存储能力,Kafka将所有的消息都写入到了低速大容量的硬盘。按理说,这将导致性能损失,但实际上,Kafka仍然可以保持超高的吞吐率,并且其性能并未受到影响。其主要采用如下方式实现了高吞吐率。

  1. 顺序读写:Kafka将消息写入到了分区partition中,而分区中的消息又是顺序读写的。顺序读写要快于随机读写。
  2. 零拷贝:生产者、消费者对于Kafka中的消息是采用零拷贝实现的。
  3. 批量发送:Kafka允许批量发送模式。
  4. 消息压缩:Kafka允许对消息集合进行压缩。

1.4 kafka的优点

1. 解耦:

在项目启动之初来预测将来项目会碰到什么需求,是*其困难的。消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

2. 冗余:(副本)

有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

3. 扩展性

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。

4. 灵活性&峰值处理能力

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

5. 可恢复性

系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

6. 顺序保证

在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。

7. 缓冲

在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务*高效率的执行———写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。

8. 异步通信

很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

1.5 kafka于其他MQ对比

1. RabbitMQ

RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。

2. Redis

Redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

3. ZeroMQ

ZeroMQ号称*快的消息队列系统,尤其针对大吞吐量的需求场景。ZeroMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演这个服务器角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果宕机,数据将会丢失。其中,Twitter的Storm 0.9.0以前的版本中默认使用ZeroMQ作为数据流的传输(Storm从0.9版本开始同时支持ZeroMQ和Netty作为传输模块)。

4. ActiveMQ

ActiveMQ是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。

5. Kafka/Jafka

Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制统一了在线和离线的消息处理。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。

1.6 kafka的几种重要角色

1.6.1 kafka作为存储系统

任何允许发布与使用无关的消息发布的消息队列都有效地充当了运行中消息的存储系统。Kafka的不同之处在于它是一个非常好的存储系统。

写入Kafka的数据将写入磁盘并进行复制以实现容错功能。Kafka允许生产者等待确认,以便直到完全复制并确保即使写入服务器失败的情况下写入也不会完成。

Kafka的磁盘结构可以很好地扩展使用-无论服务器上有50 KB还是50 TB的持久数据,Kafka都将执行相同的操作。

由于认真对待存储并允许客户端控制其读取位置,因此您可以将Kafka视为一种专用于高性能,低延迟提交日志存储,复制和传播的专用分布式文件系统。

1.6.2 kafka作为消息传递系统

Kafka的流概念与传统的企业消息传递系统相比如何?

传统上,消息传递具有两种模型:排队和发布-订阅。在队列中,一组使用者可以从服务器中读取内容,并且每条记录都将转到其中一个。在发布-订阅记录中广播给所有消费者。这两个模型中的每一个都有优点和缺点。排队的优势在于,它允许您将数据处理划分到多个使用者实例上,从而扩展处理量。不幸的是,队列不是多用户的—一次进程读取了丢失的数据。发布-订阅允许您将数据广播到多个进程,但是由于每条消息都传递给每个订阅者,因此无法扩展处理。

Kfka的消费者群体概念概括了这两个概念。与队列一样,使用者组允许您将处理划分为一组进程(使用者组的成员)。与发布订阅一样,Kafka允许您将消息广播到多个消费者组。

Kafka模型的优点在于,每个主题都具有这些属性-可以扩展处理范围,并且是多订阅者-无需选择其中一个。

与传统的消息传递系统相比,Kafka还具有更强的订购保证。

传统队列将记录按顺序保留在服务器上,如果多个使用者从队列中消费,则服务器将按记录的存储顺序分发记录。但是,尽管服务器按顺序分发记录,但是这些记录是异步传递给使用者的,因此它们可能在不同的使用者上乱序到达。这实际上意味着在并行使用的情况下会丢失记录的顺序。消息传递系统通常通过“专有使用者”的概念来解决此问题,该概念仅允许一个进程从队列中使用,但是,这当然意味着在处理中没有并行性。

Kafka做得更好。通过在主题内具有并行性(即分区)的概念,Kafka能够在用户进程池中提供排序保证和负载均衡。这是通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区都由组中的一个消费者完全消费。通过这样做,我们确保使用者是该分区的唯一读取器,并按顺序使用数据。由于存在许多分区,因此仍然可以平衡许多使用者实例上的负载。但是请注意,使用者组中的使用者实例不能超过分区。

1.6.3 kafka用作流处理

仅读取,写入和存储数据流是不够的,目的是实现对流的实时处理。

在Kafka中,流处理器是指从输入主题中获取连续数据流,对该输入进行一些处理并生成连续数据流以输出主题的任何东西。

例如,零售应用程序可以接受销售和装运的输入流,并输出根据此数据计算出的重新订购和价格调整流。

可以直接使用生产者和消费者API进行简单处理。但是,对于更复杂的转换,Kafka提供了完全集成的Streams API。这允许构建执行非重要处理的应用程序,这些应用程序计算流的聚合或将流连接在一起。

该功能有助于解决此类应用程序所面临的难题:处理无序数据,在代码更改时重新处理输入,执行状态计算等。

流API建立在Kafka提供的核心原语之上:它使用生产者和使用者API进行输入,使用Kafka进行状态存储,并使用相同的组机制来实现流处理器实例之间的容错。

2. kafka中的关键术语解释

2.1 Topic

主题。在 Kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。 topic 相当于消息的分类标签,是一个逻辑概念

物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处

2.2 Partition

分区。topic 中的消息被分割为一个或多个 partition,其是一个物理概念,对应到系统上 就是一个或若干个目录。partition 内部的消息是有序的,但 partition 间的消息是无序的。

2.3 Segment

段。将 partition 进一步细分为了若干的 segment,每个 segment 文件的大小相等。

2.4 Broker

Kafka 集群包含一个或多个服务器,每个服务器节点称为一个 broker。

broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。

如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。

如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

2.5 Producer

生产者, 即消息的发布者. 生产者将数据发布到他们选择的主题。生产者负责选择将哪个记录分配给主题中的哪个分区。即: 生产者生产的一条消息,会被写入到某一个 partition。

2.6 Consumer

消费者。可以从 broker 中读取消息。

一个消费者可以消费多个 topic 的消息

一个消费者可以消费同一个 topic 中的多个 partition 中的消息

一个 partiton 允许多个 consumer 同时消费

2.7 Consumer Group

consumer group 是 kafka 提供的可扩展且具有容错性的消费者机制。组内可以有多个消 费者,它们共享一个公共的 ID,即 group ID。组内的所有消费者协调在一起来消费订阅主题 的所有分区。

Kafka 保证同一个 consumer group 中只有一个 consumer 会消费某条消息,实际上,Kafka 保证的是稳定状态下每一个 consumer 实例只会消费某一个或多个特定的 partition,而某个 partition 的数据只会被某一个特定的 consumer 实例所消费。

下面我们用官网的一张图, 来标识consumer数量和partition数量的对应关系

由两台服务器组成的Kafka群集,其中包含四个带有两个使用者组的分区(P0-P3)。消费者组A有两个消费者实例,组B有四个。

在这里插入图片描述

其实对于这个消费组, 以前一直搞不明白, 我自己的总结是:

topic中的partitoin到group是发布订阅的通信方式,即一条topic的partition的消息会被所有的group消费,属于一对多模式;group到consumer是点对点通信方式,属于一对一模式。

举个例子: 不使用group的话,启动10个consumer消费一个topic,这10个consumer都能得到topic的所有数据,相当于这个topic中的任一条消息被消费10次。

使用group的话,连接时带上groupid,topic的消息会分发到10个consumer上,每条消息只被消费1次

2.8 Replizcas of partition

分区副本。副本是一个分区的备份,是为了防止消息丢失而创建的分区的备份。

2.9 Partition Leader

每个 partition 有多个副本,其中有且仅有一个作为 Leader,Leader 是当前负责消息读写 的 partition。即所有读写操作只能发生于 Leader 分区上。

2.10 Partition Follower

所有Follower都需要从Leader同步消息,Follower与Leader始终保持消息同步。Leader 与 Follower 的关系是主备关系,而非主从关系。

2.11 ISR

  • ISR,In-Sync Replicas,是指副本同步列表。 ISR列表是由Leader负责维护。
  • AR,Assigned Replicas,指某个 partition 的所有副本, 即已分配的副本列表。
  • OSR,Outof-Sync Replicas, 即非同步的副本列表。
  • AR = ISR + OSR

2. 12 offset

偏移量。每条消息都有一个当前Partition下唯一的64字节的offset,它是相当于当前分区*条消息的偏移量。

2.13 Broker Controller

Kafka集群的多个broker中,有一个会被选举controller,负责管理整个集群中partition和replicas的状态。

只有 Broker Controller 会向 zookeeper 中注册 Watcher,其他 broker 及分区无需注册。即 zookeeper 仅需监听 Broker Controller 的状态变化即可。

2.14 HW与LEO

  • HW,HighWatermark,高水位,表示 Consumer 可以消费到的*高 partition 偏移量。HW 保证了 Kafka 集群中消息的一致性。确切地说,是保证了 partition 的 Follower 与 Leader 间数 据的一致性。
  • LEO,Log End Offset,日志*后消息的偏移量。消息是被写入到 Kafka 的日志文件中的, 这是当前*后一个写入的消息在 Partition 中的偏移量。
  • 对于 leader 新写入的消息,consumer 是不能立刻消费的。leader 会等待该消息被所有 ISR 中的 partition follower 同步后才会更新 HW,此时消息才能被 consumer 消费。

我相信你看完上面的概念还是懵逼的, 好吧, 下面我们就用图来形象话的表示两者的关系吧。

在这里插入图片描述

2.15 zookeeper

Zookeeper 负责维护和协调 broker,负责 Broker Controller 的选举。

在 kafka0.9 之前版本,offset 是由 zk 负责管理的。

总结:zk 负责 Controller 的选举,Controller 负责 leader 的选举。

2.16 Coordinator

Coordinator一般指的是运行在每个broker上的group Coordinator进程,用于管理Consumer Group中的各个成员,主要用于offset位移管理和Rebalance。一个Coordinator可以同时管理多个消费者组。

2. 17 Rebalance

当消费者组中的数量发生变化,或者topic中的partition数量发生了变化时,partition的所有权会在消费者间转移,即partition会重新分配,这个过程称为再均衡Rebalance。

再均衡能够给消费者组及broker带来高性能、高可用性和伸缩,但在再均衡期间消费者是无法读取消息的,即整个broker集群有小一段时间是不可用的。因此要避免不必要的再均衡。

2.18 offset commit

Consumer从broker中取一批消息写入buffer进行消费,在规定的时间内消费完消息后,会自动将其消费消息的offset提交给broker,以记录下哪些消息是消费过的。当然,若在时限内没有消费完毕,其是不会提交offset的。

3. kafka的工作原理和过程

3.1 消息写入算法

消息发送者将消息发送给broker, 并形成*终的可供消费者消费的log, 是已给比较复杂的过程:

  • producer先从zookeeper中找到该partition的leader
  • producer将消息发送给该leader
  • leader将消息接入本地的log, 并通知ISR的followers
  • ISR中的followers从leader中pull消息, 写入本地log后向leader发送ack
  • leader收到所有ISR中的followers的ack后, 增加HW并向producer发送ack, 表示消息写入成功

3.2 消息路由策略

在通过 API 方式发布消息时,生产者是以 Record 为消息进行发布的。Record 中包含 key 与 value,value 才是我们真正的消息本身,而 key 用于路由消息所要存放的 Partition。消息 要写入到哪个 Partition 并不是随机的,而是有路由策略的。

  • 若指定了 partition,则直接写入到指定的 partition;
  • 若未指定 partition 但指定了 key,则通过对 key 的 hash 值与 partition 数量取模,该取模
  • 结果就是要选出的 partition 索引;
  • 若 partition 和 key 都未指定,则使用轮询算法选出一个 partition。

3.3 HW截断机制

如果 partition leader 接收到了新的消息, ISR 中其它 Follower 正在同步过程中,还未同 步完毕时 leader 宕机。此时就需要选举出新的 leader。若没有 HW 截断机制,将会导致 partition 中 leader 与 follower 数据的不一致。

当原 Leader 宕机后又恢复时,将其 LEO 回退到其宕机时的 HW,然后再与新的 Leader进行数据同步,这样就可以保证老 Leader 与新 Leader 中数据一致了,这种机制称为 HW 截断机制。

3.4 消息发送的可靠性

生产者向 kafka 发送消息时,可以选择需要的可靠性级别。通过 request.required.acks参数的值进行设置。

1、0值

异步发送。生产者向 kafka 发送消息而不需要 kafka 反馈成功 ack。该方式效率*高,但可靠性*低。其可能会存在消息丢失的情况。

  • 在传输过程中会出现消息丢失。
  • 在broker内部会出现消息丢失。
  • 会出现写入到kafka中的消息的顺序与生产顺序不一致的情况。

2、1值

同步发送。生产者发送消息给 kafka,broker 的 partition leader 在收到消息后马上发送 成功 ack(无需等等 ISR 中的 Follower 同步),生产者收到后知道消息发送成功,然后会再发送消息。如果一直未收到 kafka 的 ack,则生产者会认为消息发送失败,会重发消息。

该方式对于 Producer 来说,若没有收到 ACK,一定可以确认消息发送失败了,然后可以 重发;但是,即使收到了 ACK,也不能保证消息一定就发送成功了。故,这种情况,也可能 会发生消息丢失的情况。

3、-1值

同步发送。生产者发送消息给 kafka,kafka 收到消息后要等到 ISR 列表中的所有副本都 同步消息完成后,才向生产者发送成功 ack。如果一直未收到 kafka 的 ack,则认为消息发送 失败,会自动重发消息。该方式会出现消息重复接收的情况。

3.5 消费者消费过程解析

生产者将消息发送到topitc中, 消费者即可对其进行消费, 其消费过程如下:

  1. consumer向broker提交连接请求,其所连接上的broker都会向其发送broker controller的通信URL,即配置文件中的listeners地址;
  2. 当consumer指定了要消费的topic后,会向broker controller发送消费请求;
  3. broker controller会为consumer分配一个或几个partition leader,并将该partition的当前offset发送给consumer;
  4. consumer会按照broker controller分配的partition对其中的消息进行消费;
  5. 当consumer消费完该条消息后,consumer会向broker发送一个消息已经被消费反馈,即该消息的offset;
  6. 在broker接收到consumer的offset后,会更新相应的__consumer_offset中;

以上过程会一直重复,知道消费者停止请求消费;

Consumer可以重置offset,从而可以灵活消费存储在broker上的消息。

3.6 Partition Leader选举范围

当leader宕机后,broker controller会从ISR中挑选一个follower成为新的leader。如果ISR中没有其他副本怎么办?可以通过unclean.leader.election.enable的值来设置leader选举范围。

1、false

必须等到ISR列表中所有的副本都活过来才进行新的选举。该策略可靠性有保证,但可用性低。

2、true

在ISR列表中没有副本的情况下,可以选择任意一个没有宕机的主机作为新的leader,该策略可用性高,但可靠性没有保证。

3.7 重复消费问题的解决方案

1、同一个consumer重复消费

当Consumer由于消费能力低而引发了消费超时,则可能会形成重复消费。

在某数据刚好消费完毕,但是正准备提交offset时候,消费时间超时,则broker认为这条消息未消费成功。这时就会产生重复消费问题。

**其解决方案:**延长offset提交时间。

2、不同的consumer重复消费

当Consumer消费了消息,但还没有提交offset时宕机,则这些已经被消费过的消息会被重复消费。

**其解决方案:**将自动提交改为手动提交。

3.8 从架构设计上解决kafka重复消费的问题

其实在开发的时候, 我们在设计程序的时候, 比如考虑到网络故障等一些异常的情况, 我们都会设置消息的重试次数,

可能还有其他可能出现消息重复, 那我们应该如何解决呢?

下面提供三个方案:

3.8.1 方案一: 保存并查询

给每个消息都设置一个独一无二的uuid, 所有的消息, 我们都要存一个uuid, 我们在消费消息的时候, 首先去持久化系统中查询一下, 看这个看是否以前消费过, 如没有消费过, 在进行消费, 如果已经消费过, 丢弃就好了, 下图, 表明了这种方案:

在这里插入图片描述

3.8.2 方案二: 利用幂等

幂等(Idempotence)在数学上是这样定义的,如果一个函数 f(x) 满足:f(f(x)) = f(x),则函数 f(x) 满足幂等性。

这个概念被拓展到计算机领域,被用来描述一个操作、方法或者服务。一个幂等操作的特点是,其任意多次执行所产生的影响均与一次执行的影响相同。一个幂等的方法,使用同样的参数,对它进行多次调用和一次调用,对系统产生的影响是一样的。所以,对于幂等的方法,不用担心重复执行会对系统造成任何改变。

我们举个例子来说明一下。在不考虑并发的情况下,“将 X 老师的账户余额设置为 100 万元”,执行一次后对系统的影响是,X 老师的账户余额变成了 100 万元。只要提供的参数 100万元不变,那即使再执行多少次,X 老师的账户余额始终都是 100万元,不会变化,这个操作就是一个幂等的操作。

再举一个例子,“将 X 老师的余额加 100 万元”,这个操作它就不是幂等的,每执行一次,账户余额就会增加 100 万元,执行多次和执行一次对系统的影响(也就是账户的余额)是不一样的。

所以,通过这两个例子,我们可以想到如果系统消费消息的业务逻辑具备幂等性,那就不用担心消息重复的问题了,因为同一条消息,消费一次和消费多次对系统的影响是完全一样的。也就可以认为,消费多次等于消费一次。

那么,如何实现幂等操作呢?*好的方式就是,从业务逻辑设计上入手,将消费的业务逻辑设计成具备幂等性的操作。但是,不是所有的业务都能设计成天然幂等的,这里就需要一些方法和技巧来实现幂等。

下面我们介绍一种常用的方法:利用数据库的唯一约束实现幂等。

例如,我们刚刚提到的那个不具备幂等特性的转账的例子:将 X 老师的账户余额加 100 万元。在这个例子中,我们可以通过改造业务逻辑,让它具备幂等性。

首先,我们可以限定,对于每个转账单每个账户只可以执行一次变更操作,在分布式系统中,这个限制实现的方法非常多,*简单的是我们在数据库中建一张转账流水表,这个表有三个字段:转账单 ID、账户 ID 和变更金额,然后给转账单 ID 和账户 ID 这两个字段联合起来创建一个唯一约束,这样对于相同的转账单 ID 和账户 ID,表里至多只能存在一条记录。

这样,我们消费消息的逻辑可以变为:“在转账流水表中增加一条转账记录,然后再根据转账记录,异步操作更新用户余额即可。”在转账流水表增加一条转账记录这个操作中,由于我们在这个表中预先定义了“账户 ID 转账单 ID”的唯一约束,对于同一个转账单同一个账户只能插入一条记录,后续重复的插入操作都会失败,这样就实现了一个幂等的操作。

在这里插入图片描述

3.8.3 方案三: 设置前提条件

为更新的数据设置前置条件另外一种实现幂等的思路是,给数据变更设置一个前置条件,如果满足条件就更新数据,否则拒*更新数据,在更新数据的时候,同时变更前置条件中需要判断的数据。

这样,重复执行这个操作时,由于*次更新数据的时候已经变更了前置条件中需要判断的数据,不满足前置条件,则不会重复执行更新数据操作。

比如,刚刚我们说过,“将 X 老师的账户的余额增加 100 万元”这个操作并不满足幂等性,我们可以把这个操作加上一个前置条件,变为:“如果X老师的账户当前的余额为 500万元,将余额加 100万元”,这个操作就具备了幂等性。

对应到消息队列中的使用时,可以在发消息时在消息体中带上当前的余额,在消费的时候进行判断数据库中,当前余额是否与消息中的余额相等,只有相等才执行变更操作。

但是,如果我们要更新的数据不是数值,或者我们要做一个比较复杂的更新操作怎么办?用什么作为前置判断条件呢?更加通用的方法是,给你的数据增加一个版本号属性,每次更数据前,比较当前数据的版本号是否和消息中的版本号一致,如果不一致就拒*更新数据,更新数据的同时将版本号 +1,一样可以实现幂等。

在这里插入图片描述

4 . kafka集群搭建

我们在工作中, 为了保证环境的高可用, 防止单点, kafka都是以集群的方式出现的, 下面就带领大家一起搭建一套kafka集群环境

我们在官网下载kafka, 下载地址为: http://kafka.apache.org/downloads, 下载我们需要的版本, 推荐使用稳定的版本

4.1 搭建集群

1、下载并解压

  1. cd /usr/local/src
  2. wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.4.0/kafka_2.112.4.0.tgz
  3. mkdir /data/servers
  4. tar xzvf kafka_2.112.4.0.tgz -C /data/servers/
  5. cd /data/servers/kafka_2.112.4.0

2、修改配置文件

kafka的配置文件$KAFKA_HOME/config/server.properties, 主要修改一下下面几项:

  1. # 确保每个机器上的id不一样
  2. broker.id=0
  3. # 配置服务端的监控地址
  4. listeners=PLAINTEXT://192.168.51.128:9092
  5. # kafka 日志目录
  6. log.dirs=/data/servers/kafka_2.112.4.0/logs
  7. # kafka设置的partitons的个数
  8. num.partitions=1
  9. # zookeeper的连接地址, 如果有自己的zookeeper集群, 请直接使用自己搭建的zookeeper集群
  10. zookeeper.connect=192.168.51.128:2181

因为我自己是本机做实验, 所有使用的是一个主机的不同端口,在线上,,就是不同的机器,大家参考即可。

我们这里使用kafka的zookeeper,只启动一个节点, 但是正真的生产过程中,是需要zookeeper集群,自己搭建就好,后期我们也会出zookeeper的教程,大家请关注就好了。

3、拷贝3份配置文件

  1. # 创建对应的日志目录
  2. mkdir -p /data/servers/kafka_2.112.4.0/logs/9092
  3. mkdir -p /data/servers/kafka_2.112.4.0/logs/9093
  4. mkdir -p /data/servers/kafka_2.112.4.0/logs/9094
  5. # 拷贝三份配置文件
  6. cp server.properties server_9092.properties
  7. cp server.properties server_9093.properties
  8. cp server.properties server_9094.properties

修改不同端口对应的文件:

  1. # 9092的id为0, 9093的id为1, 9094的id为2
  2. broker.id=0
  3. # 配置服务端的监控地址, 分别在不通的配置文件中写入不同的端口
  4. listeners=PLAINTEXT://192.168.51.128:9092
  5. # kafka 日志目录, 目录也是对应不同的端口
  6. log.dirs=/data/servers/kafka_2.112.4.0/logs/9092
  7. # kafka设置的partitons的个数
  8. num.partitions=1
  9. # zookeeper的连接地址, 如果有自己的zookeeper集群, 请直接使用自己搭建的zookeeper集群
  10. zookeeper.connect=192.168.51.128:2181

4、修改zookeeper的配置文件

  1. dataDir=/data/servers/zookeeper
  2. server.1=192.168.51.128:2888:3888

然后创建zookeeper的myid文件

echo "1"> /data/servers/zookeeper/myid

5、启动zookeeper

使用kafka内置的zookeeper

  1. cd /data/servers/kafka_2.112.4.0/bin
  2. zookeeper-server-start.sh -daemon ../config/zookeeper.properties
  3. netstat -anp |grep 2181

6、启动kafka

  1. ./kafka-server-start.sh -daemon ../config/server_9092.properties
  2. ./kafka-server-start.sh -daemon ../config/server_9093.properties
  3. ./kafka-server-start.sh -daemon ../config/server_9094.properties

4.2 kafka的操作

1. topic

我们先来看一下创建topic常用的参数吧

–create 创建topic

–delete 删除topic

–alter 修改topic的名字或者partition个数

–list 查看topic

–describe 查看topic的详细信息

–topic <String: topic> 指定topic的名字

–zookeeper <String: hosts> 指定zookeeper的连接地址,

​ 参数提示并不赞成这样使用

​ DEPRECATED, The connection string for
​ the zookeeper connection in the form
​ host:port. Multiple hosts can be
​ given to allow fail-over.

–bootstrap-server <String: server to connect to>: 指定kafka的连接地址, 推荐使用这个,

​ 参数的提示信息显示

​ REQUIRED: The Kafka server to connect

  1. to. In case of providing this, a
  2. direct Zookeeper connection won‘t be
  3. required.

–replication-factor <Integer: replication factor> : 对于每个partiton的备份个数

​ The replication factor for each
​ partition in the topic being
​ created. If not supplied, defaults
​ to the cluster default.

–partitions <Integer: # of partitions>: 指定该topic的分区的个数

示例:

  1. cd /data/servers/kafka_2.112.4.0/bin
  2. # 创建topic test1
  3. kafka-topics.sh –create –bootstrap-server=192.168.51.128:9092,10.231.128.96:9093,192.168.51.128:9094 –replication-factor 1 –partitions 1 –topic test1
  4. # 创建topic test2
  5. kafka-topics.sh –create –bootstrap-server=192.168.51.128:9092,10.231.128.96:9093,192.168.51.128:9094 –replication-factor 1 –partitions 1 –topic test2
  6. # 查看topic
  7. kafka-topics.sh –list –bootstrap-server=192.168.51.128:9092,10.231.128.96:9093,192.168.51.128:9094

2、自动创建topic

我们在工作中, 如果我们不想去管理topic, 可以通过kafka的配置文件来管理, 我们可以让kafka自动创建topic, 需要在我们的kafka配置文件中加入如下配置文件

auto.create.topics.enable=true

如果删除topic想达到物理删除的目的, 也是需要配置的

delete.topic.enable=true

3、发送消息

他们可以通过客户端的命令生产消息

先来看看kafka-console-producer.sh常用的几个参数吧

–topic <String: topic> 指定topic

–timeout <Integer: timeout_ms> 超时时间

–sync 异步发送消息

–broker-list <String: broker-list> 官网提示: REQUIRED: The broker list string in the form HOST1:PORT1,HOST2:PORT2. 这个参数是必须的

kafka-console-producer.sh --broker-list 192.168.51.128:9092,192.168.51.128:9093,192.168.51.128:9094 --topic test1

4、消费消息

我们也还是先来看看kafka-console-consumer.sh的参数吧

–topic <String: topic> 指定topic

–group <String: consumer group id> 指定消费者组

–from-beginning : 指定从开始进行消费, 如果不指定, 就从当前进行消费

–bootstrap-server : kafka的连接地址

kafka-console-consumer.sh --bootstrap-server 192.168.51.128:9092,192.168.51.128:9093,192.168.51.128:9094 --topic test1 ---beginning

在这里插入图片描述

4.3 kafka的日志

kafka的日志分两种:

*种日志: 是我们的kafka的启动日志, 就是我们排查问题, 查看报错信息的日志,

第二种日志:就是我们的数据日志, kafka是我们的数据是以日志的形式存在存盘中的, 我们第二种所说的日志就是我们的partiton与segment

那我们就来说说备份和分区吧

我们创建一个分区, 一个备份, 那么test就应该在三台机器上或者三个数据目录只有一个test-0, (分区的下标是从0开始的)

如果我们创建N个分区, 我们就会在三个服务器上发现, test_0-n

如果我们创建M个备份, 我们就会在发现, test_0 到test_n 每一个都是M个

5. kafaka API

5.1 使用kafaka原生的api

1.消费者自动提交:

定义自己的生产者

  1. import org.apache.kafka.clients.producer.Callback;
  2. import org.apache.kafka.clients.producer.KafkaProducer;
  3. import org.apache.kafka.clients.producer.ProducerRecord;
  4. import org.apache.kafka.clients.producer.RecordMetadata;
  5. import java.util.Properties;
  6. /**
  7. * @ClassName MyKafkaProducer
  8. * @Description TODO
  9. * @Author lingxiangxiang
  10. * @Date 3:37 PM
  11. * @Version 1.0
  12. **/
  13. public class MyKafkaProducer {
  14. private org.apache.kafka.clients.producer.KafkaProducer<Integer, String> producer;
  15. public MyKafkaProducer() {
  16. Properties properties = new Properties();
  17. properties.put(“bootstrap.servers”, “192.168.51.128:9092,192.168.51.128:9093,192.168.51.128:9094”);
  18. properties.put(“key.serializer”, “org.apache.kafka.common.serialization.IntegerSerializer”);
  19. properties.put(“value.serializer”, “org.apache.kafka.common.serialization.StringSerializer”);
  20. // 设置批量发送
  21. properties.put(“batch.size”, 16384);
  22. // 批量发送的等待时间50ms, 超过50ms, 不足批量大小也发送
  23. properties.put(“linger.ms”, 50);
  24. this.producer = new org.apache.kafka.clients.producer.KafkaProducer<Integer, String>(properties);
  25. }
  26. public boolean sendMsg() {
  27. boolean result = true;
  28. try {
  29. // 正常发送, test2是topic, 0代表的是分区, 1代表的是key, hello world是发送的消息内容
  30. final ProducerRecord<Integer, String> record = new ProducerRecord<Integer, String>(“test2”, 0, 1, “hello world”);
  31. producer.send(record);
  32. // 有回调函数的调用
  33. producer.send(record, new Callback() {
  34. @Override
  35. public void onCompletion(RecordMetadata recordMetadata, Exception e) {
  36. System.out.println(recordMetadata.topic());
  37. System.out.println(recordMetadata.partition());
  38. System.out.println(recordMetadata.offset());
  39. }
  40. });
  41. // 自己定义一个类
  42. producer.send(record, new MyCallback(record));
  43. } catch (Exception e) {
  44. result = false;
  45. }
  46. return result;
  47. }
  48. }

生产者测试类:

在生产者测试类中,自己遇到一个坑, 就是*后自己没有加sleep, 就是怎么检查自己的代码都没有问题, 但是*后就是没法发送成功消息, *后加了一个sleep就可以了, 因为主函数main已经执行完退出, 但是消息并没有发送完成, 需要进行等待一下.当然, 你在生产环境中可能不会遇到这样问题, 呵呵, 代码如下:

  1. import static java.lang.Thread.sleep;
  2. /**
  3. * @ClassName MyKafkaProducerTest
  4. * @Description TODO
  5. * @Author lingxiangxiang
  6. * @Date 3:46 PM
  7. * @Version 1.0
  8. **/
  9. public class MyKafkaProducerTest {
  10. public static void main(String[] args) throws InterruptedException {
  11. MyKafkaProducer producer = new MyKafkaProducer();
  12. boolean result = producer.sendMsg();
  13. System.out.println(“send msg “ + result);
  14. sleep(1000);
  15. }
  16. }

消费者类:

  1. import kafka.utils.ShutdownableThread;
  2. import org.apache.kafka.clients.consumer.ConsumerRecord;
  3. import org.apache.kafka.clients.consumer.ConsumerRecords;
  4. import org.apache.kafka.clients.consumer.KafkaConsumer;
  5. import java.util.Arrays;
  6. import java.util.Collections;
  7. import java.util.Properties;
  8. /**
  9. * @ClassName MyKafkaConsumer
  10. * @Description TODO
  11. * @Author lingxiangxiang
  12. * @Date 4:12 PM
  13. * @Version 1.0
  14. **/
  15. public class MyKafkaConsumer extends ShutdownableThread {
  16. private KafkaConsumer<Integer, String> consumer;
  17. public MyKafkaConsumer() {
  18. super(“KafkaConsumerTest”, false);
  19. Properties properties = new Properties();
  20. properties.put(“bootstrap.servers”, “192.168.51.128:9092,192.168.51.128:9093,192.168.51.128:9094”);
  21. properties.put(“group.id”, “mygroup”);
  22. properties.put(“enable.auto.commit”, “true”);
  23. properties.put(“auto.commit.interval.ms”, “1000”);
  24. properties.put(“session.timeout.ms”, “30000”);
  25. properties.put(“heartbeat.interval.ms”, “10000”);
  26. properties.put(“auto.offset.reset”, “earliest”);
  27. properties.put(“key.deserializer”, “org.apache.kafka.common.serialization.IntegerDeserializer”);
  28. properties.put(“value.deserializer”, “org.apache.kafka.common.serialization.StringDeserializer”);
  29. this.consumer = new KafkaConsumer<Integer, String>(properties);
  30. }
  31. @Override
  32. public void doWork() {
  33. consumer.subscribe(Arrays.asList(“test2”));
  34. ConsumerRecords<Integer, String>records = consumer.poll(1000);
  35. for (ConsumerRecord record : records) {
  36. System.out.println(“topic = “ + record.topic());
  37. System.out.println(“partition = “ + record.partition());
  38. System.out.println(“key = “ + record.key());
  39. System.out.println(“value = “ + record.value());
  40. }
  41. }
  42. }

消费者的测试类:

  1. /**
  2. * @ClassName MyConsumerTest
  3. * @Description TODO
  4. * @Author lingxiangxiang
  5. * @Date 4:23 PM
  6. * @Version 1.0
  7. **/
  8. public class MyConsumerTest {
  9. public static void main(String[] args) {
  10. MyKafkaConsumer consumer = new MyKafkaConsumer();
  11. consumer.start();
  12. System.out.println(“==================”);
  13. }
  14. }

在这里插入图片描述

在这里插入图片描述

2. 消费者同步手动提交

前面的消费者都是以自动提交 offset 的方式对 broker 中的消息进行消费的,但自动提交 可能会出现消息重复消费的情况。所以在生产环境下,很多时候需要对 offset 进行手动提交, 以解决重复消费的问题。

手动提交又可以划分为同步提交、异步提交,同异步联合提交。这些提交方式仅仅是 doWork()方法不相同,其构造器是相同的。所以下面首先在前面消费者类的基础上进行构造 器的修改,然后再分别实现三种不同的提交方式。

同步提交方式是,消费者向 broker 提交 offset 后等待 broker 成功响应。若没有收到响 应,则会重新提交,直到获取到响应。而在这个等待过程中,消费者是阻塞的。其严重影响了消费者的吞吐量。

修改前面的MyKafkaConsumer.java, 主要修改下面的配置:

  1. import kafka.utils.ShutdownableThread;
  2. import org.apache.kafka.clients.consumer.ConsumerRecord;
  3. import org.apache.kafka.clients.consumer.ConsumerRecords;
  4. import org.apache.kafka.clients.consumer.KafkaConsumer;
  5. import java.util.Arrays;
  6. import java.util.Collections;
  7. import java.util.Properties;
  8. /**
  9. * @ClassName MyKafkaConsumer
  10. * @Description TODO
  11. * @Author lingxiangxiang
  12. * @Date 4:12 PM
  13. * @Version 1.0
  14. **/
  15. public class MyKafkaConsumer extends ShutdownableThread {
  16. private KafkaConsumer<Integer, String> consumer;
  17. public MyKafkaConsumer() {
  18. super(“KafkaConsumerTest”, false);
  19. Properties properties = new Properties();
  20. properties.put(“bootstrap.servers”, “192.168.51.128:9092,192.168.51.128:9093,192.168.51.128:9094”);
  21. properties.put(“group.id”, “mygroup”);
  22. // 这里要修改成手动提交
  23. properties.put(“enable.auto.commit”, “false”);
  24. // properties.put(“auto.commit.interval.ms”, “1000”);
  25. properties.put(“session.timeout.ms”, “30000”);
  26. properties.put(“heartbeat.interval.ms”, “10000”);
  27. properties.put(“auto.offset.reset”, “earliest”);
  28. properties.put(“key.deserializer”, “org.apache.kafka.common.serialization.IntegerDeserializer”);
  29. properties.put(“value.deserializer”, “org.apache.kafka.common.serialization.StringDeserializer”);
  30. this.consumer = new KafkaConsumer<Integer, String>(properties);
  31. }
  32. @Override
  33. public void doWork() {
  34. consumer.subscribe(Arrays.asList(“test2”));
  35. ConsumerRecords<Integer, String>records = consumer.poll(1000);
  36. for (ConsumerRecord record : records) {
  37. System.out.println(“topic = “ + record.topic());
  38. System.out.println(“partition = “ + record.partition());
  39. System.out.println(“key = “ + record.key());
  40. System.out.println(“value = “ + record.value());
  41. //手动同步提交
  42. consumer.commitSync();
  43. }
  44. }
  45. }

3、消费者异步手工提交

手动同步提交方式需要等待 broker 的成功响应,效率太低,影响消费者的吞吐量。异步提交方式是,消费者向 broker 提交 offset 后不用等待成功响应,所以其增加了消费者的吞吐量。

  1. import kafka.utils.ShutdownableThread;
  2. import org.apache.kafka.clients.consumer.ConsumerRecord;
  3. import org.apache.kafka.clients.consumer.ConsumerRecords;
  4. import org.apache.kafka.clients.consumer.KafkaConsumer;
  5. import java.util.Arrays;
  6. import java.util.Collections;
  7. import java.util.Properties;
  8. /**
  9. * @ClassName MyKafkaConsumer
  10. * @Description TODO
  11. * @Author lingxiangxiang
  12. * @Date 4:12 PM
  13. * @Version 1.0
  14. **/
  15. public class MyKafkaConsumer extends ShutdownableThread {
  16. private KafkaConsumer<Integer, String> consumer;
  17. public MyKafkaConsumer() {
  18. super(“KafkaConsumerTest”, false);
  19. Properties properties = new Properties();
  20. properties.put(“bootstrap.servers”, “192.168.51.128:9092,192.168.51.128:9093,192.168.51.128:9094”);
  21. properties.put(“group.id”, “mygroup”);
  22. // 这里要修改成手动提交
  23. properties.put(“enable.auto.commit”, “false”);
  24. // properties.put(“auto.commit.interval.ms”, “1000”);
  25. properties.put(“session.timeout.ms”, “30000”);
  26. properties.put(“heartbeat.interval.ms”, “10000”);
  27. properties.put(“auto.offset.reset”, “earliest”);
  28. properties.put(“key.deserializer”, “org.apache.kafka.common.serialization.IntegerDeserializer”);
  29. properties.put(“value.deserializer”, “org.apache.kafka.common.serialization.StringDeserializer”);
  30. this.consumer = new KafkaConsumer<Integer, String>(properties);
  31. }
  32. @Override
  33. public void doWork() {
  34. consumer.subscribe(Arrays.asList(“test2”));
  35. ConsumerRecords<Integer, String>records = consumer.poll(1000);
  36. for (ConsumerRecord record : records) {
  37. System.out.println(“topic = “ + record.topic());
  38. System.out.println(“partition = “ + record.partition());
  39. System.out.println(“key = “ + record.key());
  40. System.out.println(“value = “ + record.value());
  41. //手动同步提交
  42. // consumer.commitSync();
  43. //手动异步提交
  44. // consumer.commitAsync();
  45. // 带回调公共的手动异步提交
  46. consumer.commitAsync((offsets, e) -> {
  47. if(e != null) {
  48. System.out.println(“提交次数, offsets = “ + offsets);
  49. System.out.println(“exception = “ + e);
  50. }
  51. });
  52. }
  53. }
  54. }

5.2 springboot使用kafka

现在大家的开发过程中, 很多都用的是springboot的项目, 直接启动了, 如果还是用原生的API, 就是有点low了啊, 那kafka是如何和springboot进行联合的呢?

1. maven配置

  1. <!– https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients –>
  2. <dependency>
  3. <groupId>org.apache.kafka</groupId>
  4. <artifactId>kafka-clients</artifactId>
  5. <version>2.1.1</version>
  6. </dependency>

2. 添加配置文件

在application.properties中加入如下配置信息:

  1. # kafka 连接地址
  2. spring.kafka.bootstrap-servers = 192.168.51.128:9092,10.231.128.96:9093,192.168.51.128:9094
  3. # 生产者
  4. spring.kafka.producer.acks = 0
  5. spring.kafka.producer.key-serializer = org.apache.kafka.common.serialization.StringSerializer
  6. spring.kafka.producer.value-serializer = org.apache.kafka.common.serialization.StringSerializer
  7. spring.kafka.producer.retries = 3
  8. spring.kafka.producer.batch-size = 4096
  9. spring.kafka.producer.buffer-memory = 33554432
  10. spring.kafka.producer.compression-type = gzip
  11. # 消费者
  12. spring.kafka.consumer.group-id = mygroup
  13. spring.kafka.consumer.auto-commit-interval = 5000
  14. spring.kafka.consumer.heartbeat-interval = 3000
  15. spring.kafka.consumer.key-deserializer = org.apache.kafka.common.serialization.StringDeserializer
  16. spring.kafka.consumer.value-deserializer = org.apache.kafka.common.serialization.StringDeserializer
  17. spring.kafka.consumer.auto-offset-reset = earliest
  18. spring.kafka.consumer.enable-auto-commit = true
  19. # listenner, 标识消费者监听的个数
  20. spring.kafka.listener.concurrency = 8
  21. # topic的名字
  22. kafka.topic1 = topic1

3. 生产者

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.kafka.core.KafkaTemplate;
  4. @Service
  5. @Slf4j
  6. public class MyKafkaProducerServiceImpl implements MyKafkaProducerService {
  7. @Resource
  8. private KafkaTemplate<String, String> kafkaTemplate;
  9. // 读取配置文件
  10. @Value(“${kafka.topic1}”)
  11. private String topic;
  12. @Override
  13. public void sendKafka() {
  14. kafkaTemplate.send(topic, “hell world”);
  15. }
  16. }

4. 消费者

  1. @Component
  2. @Slf4j
  3. public class MyKafkaConsumer {
  4. @KafkaListener(topics = ${kafka.topic1})
  5. public void listen(ConsumerRecord<?, ?> record) {
  6. Optional<?> kafkaMessage = Optional.ofNullable(record.value());
  7. if (kafkaMessage.isPresent()) {
  8. log.info(“—————– record =” + record);
  9. log.info(“—————— message =” + kafkaMessage.get());

Gartner:阿里云蝉联全球第三、亚太*

国际研究机构Gartner发布*新云计算市场追踪数据,阿里云亚太市场排名*,全球市场排名第三。阿里云亚太市场份额从26%上涨至28%,接近亚马逊和微软总和;全球市场份额从7.7%上涨至9.1%,进一步拉开与第四名谷歌差距,挤压亚马逊份额。

%title插图%num

数据显示,2019年全球云计算IaaS市场持续快速增长,同比增长37.3%,总体市场规模达445亿美元。全球市场3A格局稳固,但亚马逊市场份额被微软和阿里云挤压,从2018年48%下降到45%。阿里云排名第三,市场份额增速*快,从2018年的7.7%,上涨至9.1%。

相比全球,亚太市场增长更快,云计算市场规模同比增长达50%。在亚太市场上,阿里云排名*,市场份额进一步上涨,从2018年的26%上升至28.2%,接近亚马逊和微软总和。同期,亚马逊份额从去年18%下降至17%。

近日,阿里云宣布未来3年投入2000亿,用于云操作系统、服务器、芯片、网络等重大核心技术研发攻坚和面向未来的数据中心建设。3年再投2000亿意味着阿里云的数据中心和服务器规模再翻3倍,冲刺全球*大的云基础设施。

金融时报评论认为,阿里云近年来在中国市场份额不断稳固,2019年第四季度中国市场占比达46%。新冠疫情刺激了市场对远程工作背后的云基础设施与技术的需求,疫情之后,企业和机构将大幅加快上云脚步。

分析师普遍认为,阿里云进一步扩大云基础设施和核心技术投入,“未来数年内赶上亚马逊是大概率事件”。

 

《2021中国数据资产化工具市场研究报告》隆重发布

早在五年前,数据是21世纪“新石油”的口号就已响彻行业。

在2020年4月,我国首次将“数据”与土地、劳动力、资本、技术并列为五大生产要素,并提出要“加快培育数据要素市场,完善数据要素的市场化配置机制”。企业作为市场主体,如何在数据爆炸时代发挥数据要素价值、真正为自身发展带来切实助力,已经成为企业数字化转型升级中的大课题。

当前,数据要素的重要意识已经深入企业内部,但从数据要素到数据资产化的过程中,企业面临诸多困扰:数据要素如何采集?如何存储与保障数据安全?如何进行数据的处理与分析?如何建立数据要素全流程管理过程?形成数据资产后如何发挥数据资产的价值来驱动决策?数据资产如何实现变现?数据资产如何发挥核心价值……

为深度解析这些问题,推动中国企业数据资产化管理工具市场健康发展,海比研究院、中国软件网联合中国软件行业协会,经过多方走访调研,正式推出《2021中国数据资产化工具市场研究报告》。3月18日,《2021中国数据资产化工具市场研究报告》发布论坛在北京香格里拉酒店圆满举行,本次发布论坛邀请多位业内专家出席活动,就数据资产化的产生背景、发展历程、典型工具、行业概况、技术水平、市场规模、竞争格局等方面深度解析,共绘数据资产化工具市场未来。

%title插图%num

01、数据要素资产包即将出现

从上世纪90年代开始,数据资产化工具就在为企业提供数据存储、查询等基础数据分析手段。随着中国市场互联网化的蓬勃发展,以及云计算、大数据、人工智能等技术的成熟与应用,带动中国企业数字化水平不断提高。在当前数字化、智能化不断融合的趋势下,用户数据分析和数据决策的需求全面爆发,带动各类数据资产化工具纷纷出现。

%title插图%num

中国软件网、海比研究院总裁 曹开彬

中国软件网、海比研究院总裁曹开彬在致辞中表示,数据要素和数据资产是当前的热点话题,也是产业的重要方向。在调研过程中,海比研究院发现这个市场存在两个问题。一是数据资产化是什么样的过程,很多用户并不了解;二是每一个环节需要什么样的工具,用户也不够清楚。为此,海比研究院推出这份报告,其初衷是希望通过系统梳理和分析,对数据资产化及相关工具形成更为清晰的认知,赋能产业健康发展。

针对数据要素未来方向,海比研究院提出,随着企业数字化水平的不断提高,企业数据要素资源的累积逐步增多,促使企业对这些海量数据要素进行整合与管理以发挥数据要素的价值,从而催生数据资产化过程的发生。在数据资产化过程中,企业需要大量工具以发挥对数据要素的全流程整合,形成数据要素资产包,进而达成统一管理、使用和销售变现。

02、企业数据要素进入数据资产化阶段

数据要素发展已经历起步、成长、变革和融合四个阶段,每个阶段企业对数据要素的使用需求不同。起步阶段以满足企业基本数据存储查询功能位置,而成长阶段则以满足数据的分析处理为主,变革阶段则更多关注业务数据化方面的需求,在数据要素进入融合阶段时,用户需求则分为智能决策和数据资产化与管理变现两大路径。

在数据资产形成阶段,*大的特点就是将过去不同来源渠道的数据进行整合,将源数据、数据采集、存储、分析、管理与应用的各个环节捏合成为一个整体,从而形成基于企业/机构自身数据资源的数据资产包。

海比研究院将数据要素的全流程整合过程称之为数据资产化,而将数据资产化过程中所需要的源数据、数据采集、存储、处理、应用的一切软件产品和服务,统称为数据资产化工具。

数据资产化工具包含了*终用户在数据要素管理过程中的全部软件产品和服务,在各个数据资产化的价值链中都有典型的工具,例如数据存储类有数据库、数据仓库等,数据处理类有用户分析平台等,决策应用类有数据中台、商业智能BI等。

%title插图%num

海比研究院研究总监 宋涛

海比研究院研究总监宋涛介绍,根据报告,2020年,我国数据资产化市场规模为280亿元,未来五年复合增长率达41%。当前,数据要素市场整体发展已进入变革期,未来数据资产化与管理变现将迎来发展机遇期。

从工具提供者角度分析,厂商数据存储和数据采集两项技术能力,是被用户公认的成熟度*高的两项。而预测分析、机器学习等先进技术融合程度方面,供需双方差异较大。这表明,用户在先进技术方面有更高的需求没有被满足,这是厂商今后发展所要关注的课题。

03、数据资产化工具市场蓬勃发展

%title插图%num

阿里巴巴集团阿里云智能数据库产品事业部OLAP&生态工具产品负责人、高级产品专家 蔡冬者

阿里巴巴集团阿里云智能数据库产品事业部OLAP&生态工具产品负责人、高级产品专家蔡冬者在主题发言中表示,随着数字化转型进程加速,企业的数据来源、存储、处理、增长速度发生巨大变化,传统数据分析系统在成本、规模、数据多样性等方面面临很大的挑战。基于“数据库大数据一体化”的演进趋势,阿里云推出了以云原生数据仓库AnalyticDB及云原生数据湖分析DLA为核心的云原生数据分析系统,帮助企业在数字原生时代加速业务数智化。

%title插图%num

东软软件产品事业本部平台产品事业部总经理 黄治纲

东软软件产品事业本部平台产品事业部总经理黄治纲认为,数据标准化、流程规范化、监管智能化、数据资产化、治理常态化是实现数据价值的增值以及数据资产管理工具能力的评价标准。针对这五项标准,东软形成了汇、管、用、评的特色数据管理体系,东软提供数据开放能力,可以帮助用户更好更快地享受到数据资产价值

%title插图%num

百分点科技集团智慧政务产品与服务部总经理 贾喜顺

百分点科技集团智慧政务产品与服务部总经理贾喜顺以《知识图谱在数据治理中的应用和价值》为题进行分享。百分点科技创新动态知识图谱和自然语言处理等核心技术,拥有强大的知识表示和动态本体构建能力,能够支撑海量数据高性能的准实时处理及探索式数据分析,迅速构建数据分析和应用服务,有效提升大数据分析和精准治理能力,为政府行业提供智能决策支撑。

%title插图%num

明途科技总裁 肖雪松

明途科技创建于2014年,为中国专业的目标大数据厂商。公司总裁肖雪松拥有多年产品经理经验,他谈到,从数据应用层面上来讲,可以将决策服务内容定义为工作目标管理大数据和智能化服务。目前,明途已自主研发出专业的工作目标管理平台、目标绩效管理系统、督查督办管理系统、重点项目管理系统等多个产品方案,在电子政务建设、企事业单位管理、行业领域创新等领域均有应用。

从需求层面来看,大中型企业/机构,尤其是互联网、政府、金融、医疗、制造和教育等行业是市场主要采购者。

GrowingIO 是基于用户数据构建的新一代业务增长平台、国内*的数据运营解决方案供应商。GrowingIO 为产品、运营、市场、数据团队及管理者提供产品分析、智能运营、广告分析等一系列产品及咨询服务,从而优化产品体验、提升运营效率、提高广告投放效果,帮助企业用数据精准、高效驱动增长。

北京微金时代RDP报表开发平台操作简单,只需点击拖曳分析指标,系统就可自动生成所需报表,*大地方便用户进行数据分析操作,有效助力科学决策。

日志易代表就谈到,在金融机构,业务应用系统每天产生海量日志数据,现在通过日志易全流程数据治理,可以对数据进行统计分析,运维效率大大提升。

观远数据针对传统零售在渠道管理中管控难、层级密、数量多等特点,协助用户搭建数据平台,以分析各渠道销售关键指标,实现经销体系与品牌总部的数字化互融连通。

%title插图%num

04、为数据价值落地做好准备

在圆桌论坛环节,中国软件网、海比研究院总裁曹开彬与北京市大数据中心开放部负责人穆勇,以及多位行业专家以《数据资产化工具的发展现状、面临问题及其解决方式》为题进行探讨。

%title插图%num

嘉宾们认为,在数字经济发展的时代背景下,数据流动、流通和大规模应用对数据加工处理提出了更为专业的要求,市场的分工会越来越细。从数据到数据资源,从资源到资产的路径还很长,现在的工具和方法还有很大提升空间。针对促进数据流通,政府内部可以靠计划经济、指令性进行使用;企业和社会之间,就要靠数据交易,这些方面所需要的工具也需要进一步开发。

下一步,数据资产化工具的发展会更加注重区块链等新技术应用,同时,数据资产化工具不会局限于数据处理本身,还需要与业务架构打通。工具厂商从客户应用场景构建完整生态,不断强化行业化,提供包括咨询在内的组合服务,将成为衡量自身竞争力的关键要素。

此外,数据安全、隐私保护都被各方所关注,国家在产业引导、立法方面已经采取举措,这将有力促进数据有序流动,带动更多数据价值实现全面落地。

%title插图%num

本次论坛在报告发布、主题演讲、圆桌论坛之外,还开辟了网络直播、市场调查通道、需求对接等内容。海比研究院表示,无论是以在线教育、智慧医疗、直播带货为代表的新模式、新业态,还是“让数据多跑路、群众少跑腿”的政务服务,数据已融入社会发展的方方面面。希望本次数字资产化报告成为行业发展的新起点,带动更多资源加大数据资产价值分析,促进工具高效选型,有效落地数据资源管理与变现。

文章来源:中国软件网(http://www.soft6.com)

解析云原生与云计算本质区别,别再傻傻分不清楚了!

云应用程序是热门话题。很多时候,我们会遇到像云原生应用程序云计算应用程序这样的术语。首先,很少有人同时使用这两个术语。但两者之间存在着模糊的界线云原生和云计算的区别到底是什么呢?为什么它如此重要?让我们来看看!

首先,让我们看看分析师社区对云应用程序的看法。根据IDC的研究报告,到2022年,90%的新应用将具有微服务架构,这些架构可提高设计,调试,更新和利用第三方代码的能力,35%的生产应用将是云原生的。

现在,微服务架构是云原生应用程序所使用的。换句话说,这些应用程序诞生于云,作为封装在容器并部署在云中的微服务。未来一定属于云原生应用程序。那么什么是云计算应用程序呢?

云计算是企业长期使用的一个比较老的术语。这些支持云计算的应用程序是在静态(内部)环境中开发的,是典型传统或支持云功能的传统企业软件。

%title插图%num

云原生应用程序是在微服务体系结构(称为微服务)上开发的,微服务体系结构被设计为服务于特定的目的一个独立模块。但云计算应用程序是在每个模块相互依赖的传统基础设施系统上开发的。它们通常是静态的,对这样的应用程序进行升级意味着对整个应用程序进行更改。

云计算应用程序在数据使用受到限制时非常有用。如今,企业在数字时代竞争。每个企业都有大量的数据,他们需要对这些数据进行分析以便获得进一步决策所需的具体信息。云原生应用程序需要满足这些需求,因为它们是动态编排的,并且通过利用云的全部功能来支持全面虚拟化。换句话说,这些云原生应用程序的*新出现是企业在日常运营中进行数字化转型的原因。

为了进一步讨论,让我们来看看云原生和云计算之间的主要区别。

%title插图%num

起源

云原生应用程序源于云原生。如前所述,它们构建并部署在云中,真正地访问了云基础设施的强大功能。

云计算应用程序通常是在内部使用传统基础设施开发的,并且经过调整后可以在云中远程访问。

%title插图%num

设计

云原生应用程序被设计为多租户实例托管(微服务架构)。

云计算应用程序在内部服务器上运行,因此它们没有任何多租户实例。

%title插图%num

便捷性

云原生应用程序是高度可扩展性,可以对单个模块进行实时更改,而不会对整个应用程序造成干扰。

云计算应用程序需要手动升级,从而会导致应用程序中断和关闭。

%title插图%num

价格

云原生应用程序不需要任何硬件或软件上的投资,因为它们是在云上进行的,通常可以在被许可方获得,因此使用起来相对便宜。

云计算应用程序通常比较昂贵,因为它们需要进行基础升级以适应不断变化的需求。

%title插图%num

%title插图%num

实现

由于不需要进行硬件或软件配置,云原生应用程序很容易快速实现。云计算应用程序需要定制特定的安装环境。

以上几点展示了云原生应用程序相对于云计算应用程序的明显优势。这主要是因为云原生应用程序在快节奏的业务环境中为企业运行打下了坚实的基础。由于社会政治或经济原因的不断变化的业务需求,可以在基于云的本机架构上构建的业务应用程序中快速适应或实现。

集成平台是云原生解决方案的主要应用之一。 典型的中小型企业在各个部门处理成千上万的应用程序,例如采购,物流,运输,HR <财务,法律,销售,市场营销等。在这些应用程序之间需要无缝集成以推动数字化转型。

基于云原生架构的集成平台可以实时连接许多应用程序,系统和设备(托管在云中或本地)。这种混合集成平台具有高度可扩展性,有助于业务流程自动化。

%title插图%num

结论

数字化的颠覆将会持续下去。云原生架构为企业的数字转型之旅奠定了坚实的基础,使企业更接近数字技术。不断变化的业务需求正在向定制的云应用程序(根据所需的业务用例进行定制)转变。有了可供使用的云原生架构,企业当然可以更多地关注其战略需求,从而利用现有的*佳商业机会实现进一步的增长和繁荣。

原文:https://www.comparethecloud.net/articles/cloud-native-vs-cloud-enabled-are-you-using-the-right-term/

Manjaro 个人感觉是*好用的 Linux 系统

体验了几天,感觉比 Debian 系好用,软件包丰富,基于 Arch Linux 的发行版,一个字,野~

Linux manjaro Arch debian107 条回复 • 2021-07-02 14:14:26 +08:00
1 2
2
❮ ❯
silkriver 101
silkriver 4 天前
@skiy 可以参看这个短视频 https://www.bilibili.com/video/BV1Gv41177GE
christopheredwar 102
christopheredwar 4 天前 via Android
@EscYezi Pop!_OS 的理念就是开箱即用,这也是我选择的原因
DipperRoy 103
DipperRoy 4 天前
文档全抄 arch 还不承认自己是 arch 不懂这是什么自欺欺人的手法
hdfg159 104
hdfg159 4 天前
引战帖子
哈哈哈,linux mint *好用
err1y 105
err1y 3 天前 via iPhone
@love gentoo 安装完成之后稳定且反应速度*快。我有以下几台电脑:
二手的 xps13-9343 ( i5-4200u,8g 内存,gentoo 系统+i3wm )

thinkpad t470p ( i7-7700hq,16g 内存,windows 10 )

rmbp15 ( 4770hq,16g 内存,macos )

台式机( i7-4790k,16g 内存,windows10 )

所有机器里面 xps13 是性能*差的,但是 xps13 却是软件打开速度反应速度*快的,对比 node 的执行速度(使用 openpgpjs 创建证书,cpu 密集操作),node 的单核执行速度也是*快的。

其实哪个平台如果自己去编译软件的话,速度应该都差不多,但是 gentoo 的优点就在于,你别的平台一般都会选择二进制版本,gentoo 一般来讲都会用源码自行编译(除了 chrome 这种大型浏览器直接选择二进制,我自己试过编译耗时 16 小时,8g 内存不够,还得加 16g 的 swap,8g 的 swap 都卡死机了)。

而 gentoo 从内核到开发工具到界面全都是本机编译的,效率没得说(编译大火炉)。

在 xps13 的配置( 8g 内存)下,gentoo 下开 chrome 浏览器页面大约能比 arch 多开个 5-10 个页面(个人体验,没有精准对比)
err1y 106
err1y 3 天前 via iPhone
@ScepterZ fcitx5+肥猫词库体验非常棒
ScepterZ 107
ScepterZ 2 天前
@err1y 不支持双拼,而且各种小 bug,难以描述的那种,比如在 xxx 界面失效之类的,win 也有,但是少多了

红米笔记本 air 使用 Linux ,启动时内核会卡住 30 秒,求解决方案或思路

新买了台红米 air 笔记本,cpu 是 i7-10510Y,希望可以日常使用 Linux,尝试了多个发行版基本都能正常使用,唯一的问题就是启动时,当在 GRUB 选择系统页面选择系统后,画面会停留在 GURB 主题背景页面长达 30 秒,然后才能继续开机流程。

尝试了*新的 Ubuntu 系统,也是类似的问题,唯一的区别是 Ubuntu 下是选择系统后电脑黑屏 30 秒然后出现加载信息。

查看 dmesg 信息可以看到如下错误:

[ 0.244480] Simple Boot Flag at 0x44 set to 0x1 │
[ 0.244480] ACPI: bus type PCI registered │
[ 0.244480] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 │
[ 0.244480] PCI: MMCONFIG for domain 0000 [bus 00-ff] at [mem 0xe0000000-0xefffffff] (base 0xe0000000) │
[ 0.244480] PCI: MMCONFIG at [mem 0xe0000000-0xefffffff] reserved in E820 │
[ 0.244480] PCI: Using configuration type 1 for base access │
[ 0.244621] ENERGY_PERF_BIAS: Set to ‘normal’, was ‘performance’ │
[ 0.248307] Kprobes globally optimized │
[ 0.248314] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages │
[ 0.248314] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages │
[ 0.248314] ACPI: Added _OSI(Module Device) │
[ 0.248314] ACPI: Added _OSI(Processor Device) │
[ 0.248314] ACPI: Added _OSI(3.0 _SCP Extensions) │
[ 0.248314] ACPI: Added _OSI(Processor Aggregator Device) │
[ 0.248314] ACPI: Added _OSI(Linux-Dell-Video) │
[ 0.248314] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio) │
[ 0.248314] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics) │
[ 0.358456] ACPI: 17 ACPI AML tables successfully acquired and loaded │
[ 0.362525] ACPI: EC: EC started │
[ 0.362527] ACPI: EC: interrupt blocked │

[ 30.376923] No Local Variables are initialized for Method [ECMD] │

[ 30.376927] Initialized Arguments for Method [ECMD]: (1 arguments defined for method invocation) │
[ 30.376928] Arg0: 0000000036f30172 Integer 000000000000001A │

[ 30.376940] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC.ECMD due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376960] fbcon: Taking over console │
[ 30.376972] ACPI Error: Aborting method \_TZ.FNCL due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376986] ACPI Error: Aborting method \_TZ.FN00._OFF due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376997] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC._REG due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.377037] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62 │
[ 30.377038] ACPI: EC: Boot ECDT EC used to handle transactions │
[ 30.379873] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored │
[ 30.426569] ACPI: Dynamic OEM Table Load: │
[ 30.426598] ACPI: SSDT 0xFFFF89BC00C45800 000507 (v02 PmRef Cpu0Ist 00003000 INTL 20160527) │
[ 30.429939] ACPI: \_PR_.PR00: _OSC native thermal LVT Acked │
[ 30.433359] ACPI: Dynamic OEM Table Load: │
[ 30.433378] ACPI: SSDT 0xFFFF89BC011D2C00 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160527) │
[ 30.436652] ACPI: Dynamic OEM Table Load: │
[ 30.436670] ACPI: SSDT 0xFFFF89BC0148D6C0 0000BA (v02 PmRef Cpu0Hwp 00003000 INTL 20160527) │
[ 30.439724] ACPI: Dynamic OEM Table Load: │
[ 30.439742] ACPI: SSDT 0xFFFF89BC00C41800 000628 (v02 PmRef HwpLvt 00003000 INTL 20160527) │
[ 30.443600] ACPI: Dynamic OEM Table Load: │
[ 30.443622] ACPI: SSDT 0xFFFF89BC011C1000 000D14 (v02 PmRef ApIst 00003000 INTL 20160527) │
[ 30.448401] ACPI: Dynamic OEM Table Load: │
[ 30.448419] ACPI: SSDT 0xFFFF89BC011D0000 000317 (v02 PmRef ApHwp 00003000 INTL 20160527) │
[ 30.451771] ACPI: Dynamic OEM Table Load: │
[ 30.451788] ACPI: SSDT 0xFFFF89BC011D2800 00030A (v02 PmRef ApCst 00003000 INTL 20160527) │
[ 30.461796] ACPI: Interpreter enabled
通过传递 acpi=off 参数给内核可以跳过卡住的过程,但是开机后触摸板不可使用,且发热严重,根据日志错误信息查阅大量资料后,基本都是说升级 BIOS 以解决 ACPI 的错误,但是这款笔记本没有 BIOS 更新而且很有可能以后也不会有,所以求助各位大神,有没有什么解决这个问题的方法或者思路?

第 1 条附言 · 3 天前
感谢各位大佬提供的线索和思路,更新下我这边的进度: 昨晚尝试了安装4.x的内核,发现启动时就不会卡那30秒了,虽然本子的触摸板、喇叭和麦克风都不能用了,但也说明确实可以通过修改kernel来解决/绕过/缓解这个问题。

下载了5.12的内核源码,通过搜索 “AE_AML_LOOP_TIMEOUT” 这个错误的定义,顺藤摸瓜找到如下定义: root/include/acpi/acconfig.h

/* Maximum time (default 30s) of While() loops before abort */

#define ACPI_MAX_LOOP_TIMEOUT 30
所以在出现某种错误的时候才会有卡住30秒的表现。 虽然本人能力有限可能无法解决问题,但是猜测把这里的值改小,应该缩短加载内核时卡住的时间,只要影响不大我也就能接受这样用下去了……

第 2 条附言 · 2 天前
汇报下上面修改方法的效果: 果然如预期一样,把超时时间从30秒改为3秒之后,启动信息如下:

[ 0.246981] ACPI: Added _OSI(Processor Device)
[ 0.246981] ACPI: Added _OSI(3.0 _SCP Extensions)
[ 0.246981] ACPI: Added _OSI(Processor Aggregator Device)
[ 0.246981] ACPI: Added _OSI(Linux-Dell-Video)
[ 0.246981] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
[ 0.246981] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
[ 0.359506] ACPI: 17 ACPI AML tables successfully acquired and loaded
[ 0.363549] ACPI: EC: EC started
[ 0.363550] ACPI: EC: interrupt blocked

[ 3.375610] No Local Variables are initialized for Method [ECMD]

[ 3.375613] Initialized Arguments for Method [ECMD]: (1 arguments defined for method invocation)
[ 3.375615] Arg0: 0000000095332ad2 <Obj> Integer 000000000000001A

[ 3.375626] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC.ECMD due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375646] fbcon: Taking over console
[ 3.375657] ACPI Error: Aborting method \_TZ.FNCL due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375671] ACPI Error: Aborting method \_TZ.FN00._OFF due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375682] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC._REG due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375723] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[ 3.375724] ACPI: EC: Boot ECDT EC used to handle transactions
[ 3.378597] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored
修改前的开机耗时:

Startup finished in 2.553s (firmware) + 12.865s (loader) + 35.965s (kernel) + 19.797s (userspace) = 1min 11.181s
graphical.target reached after 19.790s in userspace
修改后:

Startup finished in 2.553s (firmware) + 7.104s (loader) + 10.335s (kernel) + 12.147s (userspace) = 32.141s
graphical.target reached after 12.139s in userspace
先这样用了,有空再慢慢折腾,看看以后会不会官方更新BIOS或者内核升级可以彻底解决问题~~

acpi osi error intl42 条回复 • 2021-07-04 23:08:45 +08:00
feelinglucky 1
feelinglucky 4 天前
看起来是 ACPI 的问题,试试 BIOS 里面设置 XHCI Handoff 为 Enabled 看看?
debuggerx 2
debuggerx 4 天前
@feelinglucky 笔记本 BIOS 里什么选项都没有,只有个安全启动开关和 usb 充电选项,也都切换试过了,没用 /(ㄒoㄒ)/~~
generic 3
generic 4 天前
内核命令行参数 acpi_osi=Linux 试一下?
debuggerx 4
debuggerx 4 天前
@generic 试过了的,没有效果。。。
kokutou 5
kokutou 4 天前
试试 archlinux 带的是*新的内核.
iceecream 6
iceecream 4 天前
只能等 bios 和 EC 更新了
scybhe 7
scybhe 4 天前 via Android
试试禁用独显?来自 https://bbs.archlinux.org/viewtopic.php?id=237867
shayu*0001 8
shayu*0001 4 天前
输入 systemd-analyze blame

看看哪个占用了*长时间
ihipop 9
ihipop 4 天前 via Android
*新内核也不行的话,试试 acpi osi 改 Windows 呢?
germain 10
germain 4 天前
grub (modprobe.blacklist) 里面 block 你的 nv 的 module 就行了。

xiadong1994 11
xiadong1994 4 天前 via iPhone
https://unix.stackexchange.com/questions/592694/acpi-errors-preventing-boot-when-using-kernel-version-5
redeemer 12
redeemer 4 天前 via iPhone
好像是 EC 的 interrupt blocked 占用了 30 秒。是不是内核没有适配你这个笔记本 EC 的驱动啊
imnpc 13
imnpc 4 天前
看日志 应该是 BIOS 配置的时候没有考虑到 Linux 或者没有做*新匹配
正常出厂的时候会针对 windows linux 的一些不同做好匹配的
他这个笔记本可能只考虑支持 windows
debuggerx 14
debuggerx 4 天前
@kokutou 回头试试编译和*新内核看看情况会不会好点吧
debuggerx 15
debuggerx 4 天前
@iceecream 空等啥时候是个头啊 T_T 有啥反馈途径能联系到开发么 小米社区现在基本就是废的。。。
debuggerx 16
debuggerx 4 天前
@shayu*0001 systemd-analyze blame 是看开启启动服务占用时长的 我是加载内核的时候就出问题咯
debuggerx 17
debuggerx 4 天前
@ihipop 试了几个,也是没有效果,Windows 2009/2012/2015 等等。。
debuggerx 18
debuggerx 4 天前
@germain 核显轻薄本,没有独显的……
debuggerx 19
debuggerx 4 天前
@xiadong1994 这个我也搜到过,可是我的机器没独显的……
debuggerx 20
debuggerx 4 天前
@redeemer 对的,我猜也是这样,现在就在想有没有啥改善的方法,只要能跳过这个恶心的 30 秒就行,其他使用起来感觉都还好。
debuggerx 21
debuggerx 4 天前
@imnpc 翻车了 T_T 趁着 618 买了这台红米和宏碁的 swift3 pro,就想对比着选个跑 Linux 更完美的,结果 swift 那边直接装不上,折腾了好几天没解决,红米这边只是会开机卡一会儿,我就以为只是小问题好解决……结果现在过了 7 天无理由退货,才发现问题没有那么简单,只能硬着头皮解决了……
aneostart173 22
aneostart173 4 天前
11 代 intel 大部分 linux 发行版都有问题,据说是 intel 新驱动的锅。
germain 23
germain 4 天前
@debuggerx 不好意思没细看 log,看着差不多就回了。 你这能退货就赶紧退货吧。BOIS 的锅一般不是其它软件能解决的。

https://bugzilla.kernel.org/show_bug.cgi?id=109511
debuggerx 24
debuggerx 4 天前
@germain 看#21,已经超过退货时间了 T_T 而且这台本子除了这个问题 其他方面我还都挺满意的……
这个 bug 处理链接我也看过了,可我还没找到一个能和红米笔记本的开发进行沟通的有效途径,目前的想法是看看通过编译自定义内核能不能绕过或者缓解这个问题。
germain 25
germain 4 天前
@debuggerx 你可以尝试一下 Enable “EC read/write access through /sys/kernel/debug/ec”

CONFIG_ACPI_EC_DEBUGFS: 默认关闭 │
libook 26
libook 4 天前
笔记本硬件有很多是专用硬件,有的不够开放,相应的会难以适配 Linux,这方面 Ubuntu 出了个认证项目(可以去 Ubuntu 官网查),通过 Ubuntu 认证的才会保证跑 Ubuntu 没问题,其他的设备基本都是看运气。

红米本还是个冷门本吧,这东西是销量越高相应的 Linux 适配资料就越多,前提是能 Hack,有的*度封闭的设备完全封禁了适配 Linux 的门路。

看有什么需求必须用 Linux,如果仅仅是想用 Linux 开发环境开发一些应用级别的项目,其实可以用 Win10+WSL2,这块越来越成熟了,我现在开发 Web 全栈项目 WSL2 是完全能胜任的。

不过如果开发系统级别的项目和硬件项目的话 WSL 可能无法满足需求,此时可以考虑虚拟机,只不过会比较耗电,但能解决所有硬件适配问题。
generic 27
generic 4 天前
@debuggerx 我红米 pro15 amd 版也有问题,比如特定内核版本上才能 suspend-resume 成功,比如合上屏幕不产生事件。bios 设置也是什么选项都没有。要 Linux 兼容性还是 dell 或者联想好一点。
generic 28
generic 4 天前
@debuggerx 硬核搞法就是自己去改 bios acpi 字节码: https://wiki.archlinux.org/title/DSDT
shayu*0001 29
shayu*0001 3 天前
@debuggerx 恩,没仔细看。EC 是 Embedded Controller,这个东西是很多低级功能的掌控者,电压控制,休眠,部分外设都是通过它来控制的,现在的 UEFI   BIOS,好多都把 EC 的 Firmware 版本单独列出来了。比如联想现在发布 Thinkpad BIOS:

<1.52>
UEFI: 1.52 / ECP: 1.20
-[重要] 安全修复地址 LEN-22133 推测执行侧信道变体 4and 3a (CVE-2018-3639, CVE-2018-3640).有关更多信息请参阅联想安全咨询页面:( https://support.lenovo.com/product_security/home)

<1.51>
UEFI: 1.51 / ECP: 1.20
– [重要] 安全补丁修复 LEN-19568 Intel Active Management Technology MEBx Access Control Bypass.

<1.50>
UEFI: 1.50 / ECP: 1.20
– [重要] 解决 CVE-2017-5715.

前面是 UEFI,后面这个 ECP 就是 Embedded Controller Program 的缩写。很多高阶的电源管理功能,比如 USB 口关机给外设充电,限制电池充电上限,都是放在 ECP 里面控制的。这个如果是 ECP 里面的 Bug,你确实只能等厂家修复,个人没办法。有的笔记本提供降级功能,可以试着降回去再看看。

现在计算机需要的功能太多,随之带来的 BIOS 也变得太复杂。
sprite82 30
sprite82 3 天前
退不了了,那就直接 win+wsl 或者直接 VMware 资源都给虚拟机
debuggerx 31
debuggerx 3 天前
@germain #25 感谢!有时间试试这个慢慢调,现在准备直接粗暴一点,把那个 AE_AML_LOOP_TIMEOUT 改小试试
debuggerx 32
debuggerx 3 天前
@libook 就是习惯 Linux 了吧,顺手,Deepin 快 10 年的老用户了~
主要是过去 5 年用的小米笔记本 air13,体验很棒(因为当时 deepin 有给专门适配过),这次就误以为自家的红米也能愉快 Linux 了。。。
debuggerx 33
debuggerx 3 天前
@generic 试了下修改 DSDT 的教程,发现反编译哪一步就过不去,貌似小米的本子不是用的 Intel/Microsoft 的编译器,而是 XMCC ? 现在还是准备从 kernel 下手了。
debuggerx 34
debuggerx 3 天前
@shayu*0001 是的,谢谢,感觉确实个人没法彻底解决,只能想办法看能不能尽量优化了
generic 35
generic 3 天前 via Android
@debuggerx 你参考我这个试试 https://zhuanlan.zhihu.com/p/385750248
不过我的问题有明确的报错,你是卡住超时,估计比较难定位。
danc 36
danc 3 天前
我是 i7-10750H 装的 ubuntu 20.04 ,适配的还挺好的,唯有键盘灯颜色目前还没得调整。还有,如果是单核显说着混合模式,关机时会卡主 30s,这个倒影响不大。
danc 37
danc 3 天前
@danc 如果是单开核显,或者混合模式
danc 38
danc 3 天前
对了,还有一些软件方面的问题。在混合模式下,大部分应用启动时可以选择“使用独立显卡启动”,vscode“使用独立显卡启动”代码编辑区域是黑屏
debuggerx 39
debuggerx 2 天前
@generic 感谢,试了下你的思路,然而没能找到问题代码,情况没有改善
james122333 40
james122333 2 天前
所以 uefi 十分讨厌
而 arm 设备搞签名验证的也是
levinit 41
levinit 2 天前
新本子,上新内核 用 arch 之类的
liuxu 42
liuxu 14 小时 50 分钟前
ubuntu21.04 还有问题话基本就只能等更新内核了

Linux 问题请教。局域网内多个不同 ip+相同端口都指向了同一个服务

局域网( 10.10.10.0/24 )内

软路由是中心网关,ip 是 10.10.10.1,有 qbittorrent 服务,监听在 8080 端口。
一台旧的 thinkpad 笔记本跑了一些服务。ip 是 10.10.10.3,也有 qbittorrent 服务,监听在 8080 端口。
fx N1,ip 是 10.10.10.4,通过 docker 安装了 phpmyadmin 。现在这个容器在宿主机上的监听端口也是 8080 。(没想到没想到,fx 是违 jin 词,打出来提示“抱歉,能不能不要在这里讨论这个”)
问题来了,我访问 10.10.10.1:8080 、10.10.10.3:8080 、10.10.10.4:8080 都指向了 10.10.10.1:8080 这个页面,登录进去也是软路由上 qbit 做种的数据???这是为什么啊……

后来我把 thinkpad 机器上的 qbittorrent 监听端口改成了 8082,访问 10.10.10.3:8082 终于成功(是这台机器上的做种数据了)。但是访问 10.10.10.3:8080 依然成功,且指向 10.10.10.1:8080

诡异的事情,求助大佬们

软路由( 10.10.10.1 )上
root@dkRouter:~# lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qbittorre 9152 ptpt 54u IPv6 21614 0t0 TCP *:8080 (LISTEN)

root@dkRouter:~# netstat -anp |grep 8080
tcp 0 0 :::8080 :::* LISTEN 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56367 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56363 TIME_WAIT –
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56374 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56330 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56355 ESTABLISHED 9152/qbittorrent-no
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56361 TIME_WAIT –
tcp 0 0 ::ffff:10.10.10.1:8080 ::ffff:10.10.10.168:56359 TIME_WAIT –
thinkpad ( 10.10.10.3 )上
root@dk-tpt400:~# lsof -i:8080

root@dk-tpt400:~# lsof -i:8082
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qbittorre 864 dk 26u IPv6 25624 0t0 TCP *:8082 (LISTEN)

root@dk-tpt400:~# netstat -anp |grep 8080

root@dk-tpt400:~# netstat -anp |grep 8082
tcp6 0 0 :::8082 :::* LISTEN 864/qbittorrent-nox
fx N1 ( 10.10.10.4 )上
root@n1-armbian:/# lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 5867 root 4u IPv6 885545 0t0 TCP *:http-alt (LISTEN)

root@n1-armbian:/# netstat -anp |grep 8080
tcp6 0 0 :::8080 :::* LISTEN 5867/docker-proxy
第 1 条附言 · 2 天前
应该是破案了,是upnp 的锅

20210702175400.png

删掉应该就可以了。不过这条是如何生成的,还是不懂。

第 2 条附言 · 2 天前
楼主还是没说清,抱歉。

20210702180103.png

MiniUPnP 的 ACL 中的一条规则导致了如此滑稽的剧情……

第 3 条附言 · 2 天前
见10楼第二张图片,miniupnpd链

tcp协议,dpt:8080 to 10.10.10.1:8080

ps: dpt 应该是 destination port 的意思 (有误请大家指正)

那局域网内如果有主机开机了获取到了ip地址,我访问 10.10.10.x:8080 都会转发到10.10.10.1:8080 且不论 10.10.10.x 这台主机是否有在监听8080端口。

第 4 条附言 · 2 天前
删掉*条附言中框框里的重定向规则就好了

都不用重启防火墙,那边实时删掉了对应的规则

感谢楼里几位大佬相助

ffff 10.10.10.1 TCP 10.10.10.16810 条回复 • 2021-07-02 17:51:52 +08:00
AllenHua 1
AllenHua 2 天前
查了一下 nginx 和 dnsmasq 的配置,也没有发现线索。

其他的话,想不出来运行的程序中可能还有造成这个情况的了
Tink 2
Tink 2 天前 via Android
感觉问题在软路由上,等大佬
AllenHua 3
AllenHua 2 天前
@Tink #2 谢谢大佬回复。

等我晚上回去把 nginx 的配置和 dnsmasq 的配置贴上来。
Nitroethane 4
Nitroethane 2 天前
* 一般情况下以太网中同网段通信的时候流量是不经过路由器的。比如说 10.10.10.3 要发数据包给 10.10.10.4,那么 3 先会发送 ARP 查询的广播包来查询 IP 10.10.10.4 对应的 MAC 地址,然后直接通过 MAC 地址通信(这里描述不是很严谨,数据包只是通过路由器转发,而不会被路由)。(有误请纠正)
* 检查一下软路由的 iptables 。
* 在软路由上用 tcpdump 抓包看看。
weyou 5
weyou 2 天前 via Android
检查软路由 firewall 配置,感觉上是你给.1 添加过端口转发规则并且误把 LAN zone 包含进来了
AllenHua 6
AllenHua 2 天前
@Nitroethane #4 感谢指点

关于*点,应该是这样。计算机网络中学到的就是,10.10.10.0/24 和 10.10.11.0/24 是两个不同的 network,不同的网络才会使路由器的路由功能参与到其中工作。而同网段的设备间通过 arp 地址解析协议,ip 和 mac 地址之间进行转换,只会用到路由器的 package 转发功能。
第二点和第三点不是很会用。tcpdump 用过一次 哈哈。总之非常醍醐灌顶的回复。感谢

就*点,

我现在 macbook ( 10.10.10.168 ) 访问 N1 的 phpmyadmin 服务( 10.10.10.4:8080 ),首先问局域网内谁拥有 10.10.10.4 这个 ip 地址,然后就找对应 mac 地址……难道就找错了人?

我忘了提及一点,10.10.10.3 和 10.10.10.4 这两台机器在 openwrt 中设置了静态地址绑定。

“`
# cat /etc/config/dhcp

config dnsmasq
option domainneeded ‘1’
option localise_queries ‘1’
option rebind_protection ‘1’
option rebind_localhost ‘1’
option local ‘/lan/’
option domain ‘lan’
option expandhosts ‘1’
option authoritative ‘1’
option readethers ‘1’
option leasefile ‘/tmp/dhcp.leases’
option nonwildcard ‘1’
option localservice ‘1’
option filter_aaaa ‘1’
option port ’53’
list server ‘127.0.0.1#53’
option resolvfile ‘/tmp/resolv.conf.auto’

config dhcp ‘lan’
option interface ‘lan’
option start ‘100’
option limit ‘150’
option leasetime ’12h’
option ra_slaac ‘1’
list ra_flags ‘managed-config’
list ra_flags ‘other-config’

config dhcp ‘wan’
option interface ‘wan’
option ignore ‘1’

config odhcpd ‘odhcpd’
option maindhcp ‘0’
option leasefile ‘/tmp/hosts/odhcpd’
option leasetrigger ‘/usr/sbin/odhcpd-update’
option loglevel ‘4’

config srvhost
option srv ‘_vlmcs._tcp’
option target ‘dkRouter’
option port ‘1688’
option class ‘0’
option weight ‘100’

config host
option name ‘t400’
option dns ‘1’
option mac ’00:1c:25:a2:54:c6′
option ip ‘10.10.10.3’
option leasetime ‘infinite’
“`

config host
option name ‘t400’
option dns ‘1’
option mac ’00:1c:25:a2:54:c6′
option ip ‘10.10.10.3’
option leasetime ‘infinite’

可以看到 mac 地址 00:1c:25:a2:54:c6 和 ip 地址 10.10.10.3 做了永久绑定,leasetime 是 infinite 。

fx n1 同理,也做了绑定
AllenHua 7
AllenHua 2 天前
@AllenHua #6 又有另外一个现象存在。thinkpad 和 n1 上对应服务我换了一个端口(比如从 8080 换成 8082 )就直接可以访问了。就 8080 有这个现象
Nitroethane 8
Nitroethane 2 天前
@AllenHua #6 很明显,大概率就是软路由上的 iptables 配置了转发规则,把目的端口为 8080 的所有数据包都转发给了 10.10.10.1,直接查软路由上 iptables 的配置,尤其是所有表的 FORWARD 链
AllenHua 9
AllenHua 2 天前
@weyou #5 刚刚远程访问了下家里 openwrt 软路由,检查了下 firewall 应该没有相关配置。端口转发也是空的

![20210702174534.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174534.png)
![20210702174619.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174619.png)
![20210702174654.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174654.png)
![20210702174711.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702174711.png)
AllenHua 10
AllenHua 2 天前
@Nitroethane #8

很惊喜,防火墙页面搜到了这两条

![20210702175120.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702175120.png)
![20210702175140.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210702175140.png)

aliyun 服务器本地磁盘损坏导致数据丢失问题

2019 年初采购的一台带 GPU 的 aliyun 服务器,年费用 3-4 万,当时可能是为了高 io 的性能,数据盘选择了本地磁盘,没选择云磁盘,为这次事故埋下了巨大隐患

昨天 22:11 收到 aliyun 短信报警,磁盘故障,ssh 已无法连接,部分应用还在跑,部分无响应,控制台重启后自动停止,损坏的磁盘挂载目录是 /home,数据众多,出于对大厂的信任,没有太多备份

与工单客服交涉,本地磁盘无备份,损坏了数据丢失无法找回,且在用户协议里写了本地磁盘损坏导致的损失不赔偿

教训:数据无价,定时多重异地备份,不能嫌麻烦,即便是大厂服务器

请教:现在该咋办,工单客服重复表示数据丢失无法找回,请重置示例,是否可以要求提供磁盘自行取出数据?客服确认那是一块单独的物理磁盘,磁盘损坏了

磁盘 损坏 aliyun 备份25 条回复 • 2021-07-05 13:04:27 +08:00
xmumiffy 1
xmumiffy 1 天前 via Android
快照也没开?那就没救了啊
echo1937 2
echo1937 1 天前 via iPhone
如果没记错的话,虚拟机实例的本地磁盘,一旦重启数据就丢失的,这是多心大才会在本地盘上放数据啊?

出于对大厂的信任就更没道理了,云服务商的磁盘也是地球科技,也会坏掉啊。
cucldk 3
cucldk 1 天前
@xmumiffy 本地磁盘不支持快照
cucldk 4
cucldk 1 天前
@echo1937 重启没事,当年买的时候没有重点关注本地磁盘和云磁盘的区别,后来慢慢忘了这茬了
eason1874 5
eason1874 1 天前
本地盘就是物理机,不算云,单点故障是迟早的事,指南都会提示不要单盘存储长期数据,这点是你们大意了,没办法了。

找阿里云看他们能不能帮忙从物理盘恢复数据吧。如果他们不提供这项服务,或者商量能不能直接把硬盘寄给你,你自己找人搞
yitingbai 6
yitingbai 1 天前 ❤️ 15
我要杠一下, 我认为没有备份的数据不算重要数据
CEBBCAT 7
CEBBCAT 1 天前 via Android
@yitingbai 杠到马肚脐眼上了,更常见的是楼主这样的数据备份意识不高的普通用户
love 8
love 1 天前
本地盘 RAID 都没有的吗?
yuguorui96 9
yuguorui96 1 天前
2l 说的没毛病
fredcc 10
fredcc 1 天前 ❤️ 1
就 1 楼和 4 楼回复的使用习惯,不看官方文档的用法。可能不久以后会再来发一帖又丢数据了

lhx2008 11
lhx2008 1 天前
云硬盘都是三副本,基本没啥问题,本地盘一般都做了 RAID,也还行,本地单盘还是挺危险的
opengps 12
opengps 1 天前
这似乎是没办法的结果,本地盘如果要追求*限性能,就不适合多副本。
虽然会有 raid 方案,但是其配置追求*限性能往往采用 raid0 这种顶级的高效率优先方案。
楼主尝试下一个方案:跟阿里云索要这块物理磁盘,看看能否得到支持,如果能拿到物理磁盘,说不定某些高级修复技术可以实现大部分数据的恢复
wtks1 13
wtks1 1 天前 via Android
还是要靠备份,云硬盘也不靠谱啊,我记得上次哪家公司不就被坑了
Showfom 14
Showfom 1 天前
巨大隐患?自己不备份怪谁呢,不备份的数据一律都默认是不重要的数据
villivateur 15
villivateur 1 天前 via Android ❤️ 1
云服务我觉得知道得有一个 raid1 吧?阿里云没有?
villivateur 16
villivateur 1 天前 via Android
@villivateur 至少得有
leafre 17
leafre 1 天前
警告
使用本地盘存储数据有丢失数据的风险,例如 ECS 实例所在物理机发生硬件故障时。请勿在本地盘上存储需要长期保存的业务数据。
建议您在应用层做数据冗余,保证数据的可用性。您可以使用部署集将业务涉及到的几台 ECS 实例分散部署在不同的物理服务器上,保证业务的高可用性和底层容灾能力。具体操作,请参见创建部署集。
如果您的应用无数据可靠性架构设计,强烈建议您在 ECS 实例中同时使用云盘或者备份服务,提高数据可靠性。更多信息,请参见云盘概述或什么是混合云备份。
cucldk 18
cucldk 1 天前
@villivateur 客服答复没有
cucldk 19
cucldk 1 天前
@opengps 嗯,正在工单索要,客服在跟后台申请,等答复,不知道会不会给
salmon5 20
salmon5 1 天前
这个真心不怪阿里云,用户协议已经说的很清楚了;
想保险省事用云盘,3 副本;
想便宜+保险本地盘+主从或者副本集;
想便宜就本地盘裸奔;
RAID 就是个不伦不类的东西;
salmon5 21
salmon5 1 天前
RAID 需要依托硬件结合,这个和云的理念是背道而驰的。
云上很简单:云盘 3 副本;本地盘用户自己做冗余;就这么简单。
salmon5 22
salmon5 23 小时 2 分钟前
我再强调下,免得楼主的标题误导别人:是云使用不当,导致数据丢失;并不是云的问题;
lesismal 23
lesismal 22 小时 33 分钟前
即使使用云盘,重要数据也应当自己备份。
并不是云的问题+1
YaakovZiv 24
YaakovZiv 18 小时 38 分钟前
如果是我,我就不取数据了。
1 、硬盘申请来回邮寄需要花钱和走阿里内部的申请流程。坏盘是否可以留在客户手里。
2 、数据恢复是找专业公司还是自己尝试,这里有费用,时间,也有二次损坏的风险。
3 、不知道数据有多大容量。如果超过 1T,早些部署新的业务开始跑服务。减少业务暂停带来的损失。
现在是两部分损失。即将产生的业务需求无法响应的损失。已经发生的硬盘损坏的损失。我会考虑先减小其中一个损失,避免俩损失加一起,被公司内有心人直接把我干走了。
guo4224 25
guo4224 50 分钟前
连阿里的硬盘都想要,你是有法院判决还是啥…

问问大家关于 PING 的小白问题

假设在节点 A 可以 PING 通节点 B 且节点 B 可以 PING 通节点 A 的情况下,从节点 A 看 PING 节点 B 的延迟和从节点 B 看 PING 节点 A 的延迟一定是一样的吗?

节点 ping 延迟 小白14 条回复 • 2021-07-05 13:29:39 +08:00
asyqm 1
asyqm 2 小时 44 分钟前
感觉不一定一样吧。网络双向速度不一定是对称的。如果同样规模的网络拥堵+非对称速度,那延迟就不一样了。
745839 2
745839 2 小时 40 分钟前
不一定。虽然互通,但是,A 去 B 的路由,和 B 去 A 的不一定一样,延时也会根据链路开销有关系。
myd 3
myd 2 小时 31 分钟前
楼上说的有道理。

网络是动态的:
1. A -> B 的路由会变,B -> A 的路由也会变。
2. 网络拥挤程度也是动态的。

如果来回链路一样,没有网络拥挤,延迟应该是一样的。
hungrybirder 4
hungrybirder 2 小时 29 分钟前
不一定一样啊,来回的路由(线路)可能不同。
aitaii 5
aitaii 2 小时 16 分钟前
得看 A 到 B 的路由,B 到 A 的路由,可以用 tracert 看一下
yanzhiling2001 6
yanzhiling2001 2 小时 12 分钟前
不一样,来回线路不同,ping 结果也不会一样。BGP 动态路由 /负载均衡了解一下
xJogger 7
xJogger 2 小时 10 分钟前 via Android
国庆的前几天的时候,一般是进景点堵,出景点不堵。
网络上也有类似的现象。
另外就是 ping 走的协议和开网页走的协议不一样,所以 ping 的速度和开网页的速度也可能不一样。
个人粗浅理解,欢迎指正。
CRVV 8
CRVV 2 小时 2 分钟前
ping 测的是来回的时间不是单程的时间,和来回链路一不一样没关系。
另外测量单程时间需要两边先对表,ping 根本没有这种高端功能。

> 从节点 A 看 PING 节点 B 的延迟和从节点 B 看 PING 节点 A 的延迟一定是一样的吗

跑一次 ping,基本上每个包的延迟都不一样,所以你要怎么定义 “一定一样” ?
只能说两个方向上用 ping 的测出来的时间是数据包经过了相同的路径花的时间。
但中间的路由器也许会做一些操作让这两种情况的数据包通过的路径不一样。

所以说这些都是没谱的事情,答案当然是不一定一样
raaaaaar 9
raaaaaar 1 小时 46 分钟前 via Android
了解下分组交换,互联网不是像电线网那样是电路交换,线路不建立连接,所以每次走的路由都可能不一样
no1xsyzy 10
no1xsyzy 1 小时 17 分钟前
你就是同样 A > ping B 都会不一样。
还有路由协议启动较慢的问题,*次 ping 可能延迟比之后高得多。

除此以外,还可能遇到软件造成的不同延迟。比如 A 在硬件层面**响应** ICMP,B 在软件层面**响应** ICMP,那就会造成差异。A ping B 会往 B 的 CPU 走一圈。

@CRVV 因为相对论的关系,光速造成延迟还少的对表是科学上没有实证意义的行为,工程上是如何宽松限制的?

zhoudaiyu 11
zhoudaiyu 54 分钟前
@asyqm #1
@745839 #2
@myd #3
@hungrybirder #4
@aitaii #5
@yanzhiling2001 #6
@xJogger #7
@CRVV #8
@raaaaaar #9
@no1xsyzy #10

学到了很多,谢谢大家!如果假定 A 到 B 和 B 到 A 的路由是一样的,A 和 B 硬件和软件性能是相同的,且整个链路只有 A 和 B 两台节点,那是不是 A->B 和 B->A 的延迟近乎就是相同的了?
no1xsyzy 12
no1xsyzy 34 分钟前
@zhoudaiyu 要科学上准确地描述的话,应当是叫「简并」
你做的是测量而不是计算,测量是有误差和不确定度的。除此以外的话,你确实可以说
『 A ping B 和 B ping A 测量的是两个简并的实量』
包括在同一个交换机下接 N 个设备,这 N 个设备间互 ping 也是简并的。
aqqwiyth 13
aqqwiyth 34 分钟前
没有其他干扰的话, 理论上讲是一致的
jorneyr 14
jorneyr 13 分钟前
网络有上下行之别

红米笔记本 air 使用 Linux ,启动时内核会卡住 30 秒,求解决方案或思路

新买了台红米 air 笔记本,cpu 是 i7-10510Y,希望可以日常使用 Linux,尝试了多个发行版基本都能正常使用,唯一的问题就是启动时,当在 GRUB 选择系统页面选择系统后,画面会停留在 GURB 主题背景页面长达 30 秒,然后才能继续开机流程。

尝试了*新的 Ubuntu 系统,也是类似的问题,唯一的区别是 Ubuntu 下是选择系统后电脑黑屏 30 秒然后出现加载信息。

查看 dmesg 信息可以看到如下错误:

[ 0.244480] Simple Boot Flag at 0x44 set to 0x1 │
[ 0.244480] ACPI: bus type PCI registered │
[ 0.244480] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 │
[ 0.244480] PCI: MMCONFIG for domain 0000 [bus 00-ff] at [mem 0xe0000000-0xefffffff] (base 0xe0000000) │
[ 0.244480] PCI: MMCONFIG at [mem 0xe0000000-0xefffffff] reserved in E820 │
[ 0.244480] PCI: Using configuration type 1 for base access │
[ 0.244621] ENERGY_PERF_BIAS: Set to ‘normal’, was ‘performance’ │
[ 0.248307] Kprobes globally optimized │
[ 0.248314] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages │
[ 0.248314] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages │
[ 0.248314] ACPI: Added _OSI(Module Device) │
[ 0.248314] ACPI: Added _OSI(Processor Device) │
[ 0.248314] ACPI: Added _OSI(3.0 _SCP Extensions) │
[ 0.248314] ACPI: Added _OSI(Processor Aggregator Device) │
[ 0.248314] ACPI: Added _OSI(Linux-Dell-Video) │
[ 0.248314] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio) │
[ 0.248314] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics) │
[ 0.358456] ACPI: 17 ACPI AML tables successfully acquired and loaded │
[ 0.362525] ACPI: EC: EC started │
[ 0.362527] ACPI: EC: interrupt blocked │

[ 30.376923] No Local Variables are initialized for Method [ECMD] │

[ 30.376927] Initialized Arguments for Method [ECMD]: (1 arguments defined for method invocation) │
[ 30.376928] Arg0: 0000000036f30172 Integer 000000000000001A │

[ 30.376940] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC.ECMD due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376960] fbcon: Taking over console │
[ 30.376972] ACPI Error: Aborting method \_TZ.FNCL due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376986] ACPI Error: Aborting method \_TZ.FN00._OFF due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376997] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC._REG due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.377037] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62 │
[ 30.377038] ACPI: EC: Boot ECDT EC used to handle transactions │
[ 30.379873] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored │
[ 30.426569] ACPI: Dynamic OEM Table Load: │
[ 30.426598] ACPI: SSDT 0xFFFF89BC00C45800 000507 (v02 PmRef Cpu0Ist 00003000 INTL 20160527) │
[ 30.429939] ACPI: \_PR_.PR00: _OSC native thermal LVT Acked │
[ 30.433359] ACPI: Dynamic OEM Table Load: │
[ 30.433378] ACPI: SSDT 0xFFFF89BC011D2C00 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160527) │
[ 30.436652] ACPI: Dynamic OEM Table Load: │
[ 30.436670] ACPI: SSDT 0xFFFF89BC0148D6C0 0000BA (v02 PmRef Cpu0Hwp 00003000 INTL 20160527) │
[ 30.439724] ACPI: Dynamic OEM Table Load: │
[ 30.439742] ACPI: SSDT 0xFFFF89BC00C41800 000628 (v02 PmRef HwpLvt 00003000 INTL 20160527) │
[ 30.443600] ACPI: Dynamic OEM Table Load: │
[ 30.443622] ACPI: SSDT 0xFFFF89BC011C1000 000D14 (v02 PmRef ApIst 00003000 INTL 20160527) │
[ 30.448401] ACPI: Dynamic OEM Table Load: │
[ 30.448419] ACPI: SSDT 0xFFFF89BC011D0000 000317 (v02 PmRef ApHwp 00003000 INTL 20160527) │
[ 30.451771] ACPI: Dynamic OEM Table Load: │
[ 30.451788] ACPI: SSDT 0xFFFF89BC011D2800 00030A (v02 PmRef ApCst 00003000 INTL 20160527) │
[ 30.461796] ACPI: Interpreter enabled
通过传递 acpi=off 参数给内核可以跳过卡住的过程,但是开机后触摸板不可使用,且发热严重,根据日志错误信息查阅大量资料后,基本都是说升级 BIOS 以解决 ACPI 的错误,但是这款笔记本没有 BIOS 更新而且很有可能以后也不会有,所以求助各位大神,有没有什么解决这个问题的方法或者思路?

acpi osi error intl28 条回复 • 2021-07-01 13:29:07 +08:00
feelinglucky 1
feelinglucky 20 小时 1 分钟前
看起来是 ACPI 的问题,试试 BIOS 里面设置 XHCI Handoff 为 Enabled 看看?
debuggerx 2
debuggerx 19 小时 56 分钟前
@feelinglucky 笔记本 BIOS 里什么选项都没有,只有个安全启动开关和 usb 充电选项,也都切换试过了,没用 /(ㄒoㄒ)/~~
generic 3
generic 19 小时 31 分钟前
内核命令行参数 acpi_osi=Linux 试一下?
debuggerx 4
debuggerx 19 小时 20 分钟前
@generic 试过了的,没有效果。。。
kokutou 5
kokutou 19 小时 12 分钟前
试试 archlinux 带的是*新的内核.
iceecream 6
iceecream 19 小时 8 分钟前
只能等 bios 和 EC 更新了
scybhe 7
scybhe 18 小时 22 分钟前 via Android
试试禁用独显?来自 https://bbs.archlinux.org/viewtopic.php?id=237867
shayu*0001 8
shayu*0001 17 小时 7 分钟前
输入 systemd-analyze blame

看看哪个占用了*长时间
ihipop 9
ihipop 15 小时 16 分钟前 via Android
*新内核也不行的话,试试 acpi osi 改 Windows 呢?
germain 10
germain 14 小时 18 分钟前
grub (modprobe.blacklist) 里面 block 你的 nv 的 module 就行了。

xiadong1994 11
xiadong1994 8 小时 52 分钟前 via iPhone
https://unix.stackexchange.com/questions/592694/acpi-errors-preventing-boot-when-using-kernel-version-5
redeemer 12
redeemer 6 小时 30 分钟前 via iPhone
好像是 EC 的 interrupt blocked 占用了 30 秒。是不是内核没有适配你这个笔记本 EC 的驱动啊
imnpc 13
imnpc 5 小时 0 分钟前
看日志 应该是 BIOS 配置的时候没有考虑到 Linux 或者没有做*新匹配
正常出厂的时候会针对 windows linux 的一些不同做好匹配的
他这个笔记本可能只考虑支持 windows
debuggerx 14
debuggerx 3 小时 8 分钟前
@kokutou 回头试试编译和*新内核看看情况会不会好点吧
debuggerx 15
debuggerx 3 小时 6 分钟前
@iceecream 空等啥时候是个头啊 T_T 有啥反馈途径能联系到开发么 小米社区现在基本就是废的。。。
debuggerx 16
debuggerx 3 小时 5 分钟前
@shayu*0001 systemd-analyze blame 是看开启启动服务占用时长的 我是加载内核的时候就出问题咯
debuggerx 17
debuggerx 3 小时 4 分钟前
@ihipop 试了几个,也是没有效果,Windows 2009/2012/2015 等等。。
debuggerx 18
debuggerx 3 小时 3 分钟前
@germain 核显轻薄本,没有独显的……
debuggerx 19
debuggerx 3 小时 3 分钟前
@xiadong1994 这个我也搜到过,可是我的机器没独显的……
debuggerx 20
debuggerx 3 小时 1 分钟前
@redeemer 对的,我猜也是这样,现在就在想有没有啥改善的方法,只要能跳过这个恶心的 30 秒就行,其他使用起来感觉都还好。
debuggerx 21
debuggerx 2 小时 58 分钟前
@imnpc 翻车了 T_T 趁着 618 买了这台红米和宏碁的 swift3 pro,就想对比着选个跑 Linux 更完美的,结果 swift 那边直接装不上,折腾了好几天没解决,红米这边只是会开机卡一会儿,我就以为只是小问题好解决……结果现在过了 7 天无理由退货,才发现问题没有那么简单,只能硬着头皮解决了……
aneostart173 22
aneostart173 2 小时 46 分钟前
11 代 intel 大部分 linux 发行版都有问题,据说是 intel 新驱动的锅。
germain 23
germain 2 小时 31 分钟前
@debuggerx 不好意思没细看 log,看着差不多就回了。 你这能退货就赶紧退货吧。BOIS 的锅一般不是其它软件能解决的。

https://bugzilla.kernel.org/show_bug.cgi?id=109511
debuggerx 24
debuggerx 2 小时 20 分钟前
@germain 看#21,已经超过退货时间了 T_T 而且这台本子除了这个问题 其他方面我还都挺满意的……
这个 bug 处理链接我也看过了,可我还没找到一个能和红米笔记本的开发进行沟通的有效途径,目前的想法是看看通过编译自定义内核能不能绕过或者缓解这个问题。
germain 25
germain 2 小时 9 分钟前
@debuggerx 你可以尝试一下 Enable “EC read/write access through /sys/kernel/debug/ec”

CONFIG_ACPI_EC_DEBUGFS: 默认关闭 │
libook 26
libook 1 小时 20 分钟前
笔记本硬件有很多是专用硬件,有的不够开放,相应的会难以适配 Linux,这方面 Ubuntu 出了个认证项目(可以去 Ubuntu 官网查),通过 Ubuntu 认证的才会保证跑 Ubuntu 没问题,其他的设备基本都是看运气。

红米本还是个冷门本吧,这东西是销量越高相应的 Linux 适配资料就越多,前提是能 Hack,有的*度封闭的设备完全封禁了适配 Linux 的门路。

看有什么需求必须用 Linux,如果仅仅是想用 Linux 开发环境开发一些应用级别的项目,其实可以用 Win10+WSL2,这块越来越成熟了,我现在开发 Web 全栈项目 WSL2 是完全能胜任的。

不过如果开发系统级别的项目和硬件项目的话 WSL 可能无法满足需求,此时可以考虑虚拟机,只不过会比较耗电,但能解决所有硬件适配问题。
generic 27
generic 22 分钟前
@debuggerx 我红米 pro15 amd 版也有问题,比如特定内核版本上才能 suspend-resume 成功,比如合上屏幕不产生事件。bios 设置也是什么选项都没有。要 Linux 兼容性还是 dell 或者联想好一点。
generic 28
generic 21 分钟前
@debuggerx 硬核搞法就是自己去改 bios acpi 字节码: https://wiki.archlinux.org/title/DSDT

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速