背景
为了实现 kafka 集群的大批量数据的实时性处理,需要多个 logstash 将其入 es,需要测试 logstash 的 loadbalance 和 HA 能力,因此设计以下测试场景。
Kafka 集群——单节点 logstash
kafka topic
# 创建 topic
bin/kafka-topics.sh --create --bootstrap-server 10.124.5.222:9092 --replication-factor 3 --partitions 1 --topic test-for-cluster
# 查看 topic 信息
# 集群的话,只用写一个节点即可查询该 topic 所有信息
bin/kafka-topics.sh --describe --bootstrap-server 10.124.5.222:9092 --topic test-for-cluster
# Topic: test-for-cluster TopicId: 7pUGR0RYTSO0pfLDcN6BnA PartitionCount: 1 ReplicationFactor: 3
# Configs: Topic: test-for-cluster Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
PartitionCount:partition 个数。
ReplicationFactor:副本个数。
Partition:partition 编号,从 0 开始递增。
Leader:当前 partition 起作用的 breaker.id。
Replicas: 当前副本数据所在的 breaker.id,是一个列表,排在最前面的其作用。
Isr:当前 kakfa 集群中可用的 breaker.id 列表。
从上述信息中可以得知,topic test-for-cluster 起作用的 leader partition 是在 broker1 上,也就是 10.124.5.190
。因此,在测试的时候,将 logstash 的 bootstrap_servers 指向 10.124.5.190
,然后将该 broker 中断进行测试。
Kafka producer
import json
from datetime import datetime
import time
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='10.124.5.191:9092',
value_serializer=lambda msg: json.dumps(msg).encode(),
api_version=(2, 13))
topic = 'test-for-cluster'
for i in range(0, 100):
data = {
'num': i,
'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
print(data)
producer.send(topic, data)
time.sleep(1)
Logstash 配置
input{
kafka{
bootstrap_servers => "10.124.5.190:9092"
client_id => "node0"
group_id => "kafka2es"
auto_offset_reset => "latest"
consumer_threads => 1
decorate_events => "true"
topics => ["test-for-cluster"]
type => "kafka2es"
}
}
filter {
json {
source => "message"
}
}
output{
elasticsearch{
hosts => ["10.124.5.222:9200"]
data_stream