系统运维的过程当中,每个细节都值得咱们关注nginx
下图为咱们的基本日志处理架构web
全部日志由Rsyslog或者Filebeat收集,而后传输给Kafka,Logstash做为Consumer消费Kafka里边的数据,分别写入Elasticsearch和Hadoop,最后使用Kibana输出到web端供相关人员查看,或者是由Spark接手进入更深层次的分析数据库
在以上整个架构中,核心的几个组件Kafka、Elasticsearch、Hadoop天生支持高可用,惟独Logstash是不支持的,用单个Logstash去处理日志,不只存在处理瓶颈更重要的是在整个系统中存在单点的问题,若是Logstash宕机则将会致使整个集群的不可用,后果可想而知json
如何解决Logstash的单点问题呢?咱们能够借助Kafka的Consumer Group来实现bootstrap
为了便于理解,我么先介绍一下Kafka里边几个重要的角色:tomcat
Broker: 一台kafka服务器就是一个broker,一个kafka集群由多个broker组成,上图中的kafka集群有3台kafka服务器组成,也就是有3个broker,一个broker上能够有多个topicbash
Topic: 是个逻辑上的概念,用来区分不一样的消息类别,相似于数据库中的表,能够将一组相同的数据发送给一个Topic,在日志处理中一般会将不一样类型的日志写入不一样的Topic,例如nginx日志写入名字为nginx_log
的topic,tomcat日志写入名字为tomcat_log
的topic,topic上图中没有标出,咱们能够理解为图上的三个partition构成了一个topic服务器
Partition: 是kafka数据存储的基本物理单元,同一个Topic的数据能够被存储在一个或多个partition中,例如上图中的一个topic数据被存储在了partition1,partition2,partition3中,一般咱们设置一个topic下partition的数量为broker的整数倍,这样一来数据可以均匀分布,二来能够同时利用集群下的全部服务器资源架构
Producer: 生产者,向kafka写数据的服务,例如filebeat运维
Consumer: 消费者,去kafka取数据的服务,例如logstash
Consumer Group: 也是个逻辑上的概念,为一组consumer的集合,同一个topic的数据会广播给不一样的group,同一个group中只有一个consumer能拿到这个数据
也就是说对于同一个topic,每一个group均可以拿到一样的全部数据,可是数据进入group后只能被其中的一个consumer消费,基于这一点咱们只须要启动多个logstsh,并将这些logstash分配在同一个组里边就能够实现logstash的高可用了
input {
kafka {
bootstrap_servers => "10.8.9.2:9092,10.8.9.3:9092,10.8.9.4:9092"
topics => ["ops_coffee_cn"]
group_id => "groupA"
codec => "json"
}
}
复制代码
以上为logstash消费kafka集群的配置,其中加入了group_id
参数,group_id
是一个的字符串,惟一标识一个group,具备相同group_id
的consumer构成了一个consumer group,这样启动多个logstash进程,只须要保证group_id
一致就能达到logstash高可用的目的,一个logstash挂掉同一Group内的logstash能够继续消费
除了高可用外同一Group内的多个Logstash能够同时消费kafka内topic的数据,从而提升logstash的处理能力,但须要注意的是消费kafka数据时,每一个consumer最多只能使用一个partition,当一个Group内consumer的数量大于partition的数量时,只有等于partition个数的consumer能同时消费,其余的consumer处于等待状态
例如一个topic下有3个partition,那么在一个有5个consumer的group中只有3个consumer在同时消费topic的数据,而另外两个consumer处于等待状态,因此想要增长logstash的消费性能,能够适当的增长topic的partition数量,但kafka中partition数量过多也会致使kafka集群故障恢复时间过长,消耗更多的文件句柄与客户端内存等问题,也并非partition配置越多越好,须要在使用中找到一个平衡
kafka中partition数量能够在建立topic时指定:
# bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --create --topic ops_coffee --partitions 3
Created topic "ops_coffee".
复制代码
--partitions: 指定分区数,若是不指定默认会使用配置文件中num.partitions
配置的数量
也能够手动修改partition的数量:
# bin/kafka-topics.sh --alter --zookeeper 127.0.0.1:2181 --partitions 5 --topic ops_coffee
Adding partitions succeeded!
复制代码
注意partition的数量只能增长不能减小
若是想要知道topic的partition信息,能够经过如下命令查看topic详情:
# bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --describe --topic ops_coffee
Topic:ops_coffee PartitionCount:3 ReplicationFactor:2 Configs:
Topic: ops_coffee Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2
Topic: ops_coffee Partition: 1 Leader: 2 Replicas: 2,3 Isr: 2,3
Topic: ops_coffee Partition: 2 Leader: 3 Replicas: 3,1 Isr: 3,1
复制代码
至此对kafka consumer group有了更深刻的了解,能够在具体的使用中游刃有余
相关文章推荐阅读: