Kafka壓測— 搞垮kafka的方法(轉)


分布式系統故障場景梳理方法:

場景梳理邏輯關系:

  • 單點硬件故障→單點進程故障類型→集群影響→集群故障場景

  • 第三方依賴故障→集群依賴關系→集群影響→集群故障場景

  • 業務場景→集群負載/錯誤影響→集群故障場景

Kafka故障場景

Kafka故障的定義是什么?

故障場景

  • 單點硬件故障→集群故障場景

  • 第三方依賴故障→集群故障場景

  • 業務場景→集群故障場景

 

Kafka壓測

Kafka數據丟失:

Kafka什么情況下一定會丟失數據?

Kafka什么情況的一定不會丟失數據?

Kafka數據寫入降低百毫秒級?

Kafka的Topic分片規模的設置與延遲的關系?

 

80%通用場景 + 20%業務特性 = 相對完善和通用的故障場景
要區分現象和原因,列舉的是現象而非原因
chaosmonkey 第一版里面有一些破壞性的shell腳本可以用

節點故障
各個角色單獨關閉至少一台機器,直至服務故障(線下)
各個角色同時關閉一台機器
任意一個交換機故障

單機資源:CPU、MEM、NET、DISK、IO、Ulimit
磁盤
磁盤空間寫滿
磁盤故障(只讀)
磁盤IO飽和

節點故障,網絡分區,丟包和慢速網絡————目的是找出RabbitMQ集群丟失消息的方式和時間

第三方依賴:數據庫、緩存、共享存儲、上下游、DNS、LB、基礎設施等

業務特性
集群Topic leader丟失
集群中的單個Topic分區異常的多
集群中總的分區過多
集群出現大面積的分區遷移

容量
數據寫入量——單條record信息過大
消息寫入量——批量消息過多

Kafka故障因子來自如下幾個方面:

  • 生產者外部—每秒數據寫入量(控制參數:record batch-size和throughput,thread_pool)
  • 自身內部—磁盤空間,節點數丟失,業務飽和度(分片數量,IO飽和度,內存不足?)
  • 依賴關系模塊—Zookeeper問題

Kafka故障指標:

  • 功能不可用
  • 出現消息丟失——Topic沒有leader
  • 消息延遲——大於100ms

以此梳理出Kafka的故障場景:

  1. 數據寫入量——單條record信息過大
  2. 消息寫入量——批量消息過多
  3. 集群磁盤空間被寫滿——單機被打滿后集群會做什么事情
  4. 集群節點丟失1/5
  5. 集群節點丟失1/3
  6. 集群節點丟失1/2
  7. 集群Topic leader丟失
  8. 集群中的單個Topic分區異常的多
  9. 集群中總的分區過多
  10. 集群出現大面積的分區遷移——磁盤IO飽和
  11. 集群磁盤故障
  12. Zookeeper集群功能不可用

12-1.ZK集群節點丟失1/2

12-2.ZK集群被頻繁請求

12-3.ZK集群leader選舉

故障場景演練

  1. 數據寫入量——單條record信息過大

考慮如下場景的比較,比較消息寫入延遲率

(1)topic:test1(6,1),–record-size=838860(0.8M)–throughput 4096

(1)topic:test1(6,1),–record-size=4(KB)–throughput 4096

考慮到集群默認有消息最大請求限制(message.max.bytes=1000000,1MB以內)。

org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.

2.消息寫入量——批量消息過多

(1)topic:test1(6,1),–record-size=4(KB),–throughput 1000

(2)topic:test1(6,1),–record-size=4(0.1M),–throughput 100000000

org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.
以及另外一種報錯:
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for test2-0 due to 30001 ms has passed since last append

 

極端場景為:

topic:test1(6,1),–record-size=838860(0.8M),–throughput 100000000

3.

Broker 數據盤沒有空間導致kafka自動關閉

[2018-10-29 16:50:16,939] FATAL [Replica Manager on Broker 0]: Halting due to unrecoverable I/O error while handling produce request: (kafka.server.ReplicaManager) kafka.common.KafkaStorageException: I/O exception in append to log 'test2-0' at kafka.log.Log.append(Log.scala:349) at kafka.cluster.Partition$$anonfun$10.apply(Partition.scala:443) at kafka.cluster.Partition$$anonfun$10.apply(Partition.scala:429) at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:234) at kafka.utils.CoreUtils$.inReadLock(CoreUtils.scala:240) at kafka.cluster.Partition.appendMessagesToLeader(Partition.scala:429) at kafka.server.ReplicaManager$$anonfun$appendToLocalLog$2.apply(ReplicaManager.scala:407) at kafka.server.ReplicaManager$$anonfun$appendToLocalLog$2.apply(ReplicaManager.scala:393) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99) at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99) at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230) at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40) at scala.collection.mutable.HashMap.foreach(HashMap.scala:99) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.AbstractTraversable.map(Traversable.scala:104) at kafka.server.ReplicaManager.appendToLocalLog(ReplicaManager.scala:393) at kafka.server.ReplicaManager.appendMessages(ReplicaManager.scala:330) at kafka.server.KafkaApis.handleProducerRequest(KafkaApis.scala:436) at kafka.server.KafkaApis.handle(KafkaApis.scala:78) at kafka.server.KafkaRequestHandler.run(KafkaRequestHandler.scala:60) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.IOException: No space left on device at sun.nio.ch.FileDispatcherImpl.write0(Native Method) at sun.nio.ch.FileDispatcherImpl.write(FileDispatcherImpl.java:60) at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) at sun.nio.ch.IOUtil.write(IOUtil.java:65) at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:211) at kafka.message.ByteBufferMessageSet.writeFullyTo(ByteBufferMessageSet.scala:304) at kafka.log.FileMessageSet.append(FileMessageSet.scala:354) at kafka.log.LogSegment.append(LogSegment.scala:97) at kafka.log.Log.append(Log.scala:409) ... 22 more

 

 

8.集群中的單個Topic分區異常的多

 

考慮如下場景的比較,比較消息寫入延遲率

(1-1)topic:test1(6000,1),–record-size=838860(0.8M)–throughput 100000000

org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.

(1-2)topic:test1(6000,1),–record-size=838860(0.8M)–throughput 1000000

(1-3)topic:test1(6000,1),–record-size=4(KB)–throughput 100000000

(1-4)topic:test1(6000,1),–record-size=4(KB)–throughput 100000000

10.集群出現大面積的分區遷移——磁盤IO飽和

 

11.Zookeeper集群功能不可用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM