kafka部署
1.1软件环境
ZK集群和Java环境。
1.2集群配置
可以是任意台服务器,broker支持横向扩展,典型架构如下:
1.3服务搭建(最新1.0.0版本)
1-使用java -version查看是否有java环境;
2-没有java环境,执行
shell > rpm -ivh jdk-8u111-linux-x64.rpm
shell > java -version
3-下载kafka最新版本
shell > cd /opt/src
shell > cd /opt/src; tar zxf kafka_2.11-1.0.0.tgz
-C /opt
shell > cd /opt/kafka_2.11-1.0.0
4-配置文件:
5-启动并检查服务状态:
进入kafka主程序目录:.
shell > sh ./kafka-server-start.sh -daemon config/server.properties
使用kafka-topics.sh,kafka-console-producer.sh,kafka-console-consumer.sh分别创建话题,生产消息和消费消息,测试集群服务是否正常
1.4服务调优
基本概念:
- Broker
Kafka集群包含一个或多个服务器,这种服务器被称为broker
- Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
- Partition
Parition是物理上的概念,每个Topic包含一个或多个Partition.
- Producer
负责发布消息到Kafka broker
- Consumer
消息消费者,向Kafka broker读取消息的客户端。
- Consumer Group
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
Partition相关调优:
为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。Producer发送消息到broker时,会根据Paritition机制选择将其存储到哪一个Partition。如果Partition机制设置合理,所有消息可以均匀分布到不同的Partition里,这样就实现了负载均衡。如果一个Topic对应一个文件,那这个文件所在的机器I/O将会成为这个Topic的性能瓶颈,而有了Partition后,不同的消息可以并行写入不同broker的不同Partition里,极大的提高了吞吐率。
kafka读写的单位是partition,因此,将一个topic拆分为多个partition可以提高吞吐量。但是,这里有个前提,就是不同partition需 要位于不同的磁盘(可以在同一个机器)。如果多个partition位于同一个磁盘,那么意味着有多个进程同时对一个磁盘的多个文 件进行读写,使得操作系统会对磁盘读写进行频繁调度,也就是破坏了磁盘读写的连续性。因此,建议kafka的虚拟机至少选择6个数据盘,并在server.properties的log.dirs里面把每个磁盘都配置起来,kafka会在新建partition的时候,将新partition分布在partition最少的目录上。partition数量可以在$KAFKA_HOME/config/server.properties中通过配置项num.partitions来指定新建Topic的默认Partition数量,也可以在程序端创建topic的时候指定。
Replica相关调优:
Replica是对Partition数据的备份,当某一个Broker宕机后,那么其上的所有Partition将变得不可用,这时候会由其他Broker上的Replica来进行代替。引入Replication之后,同一个Partition可能会有多个Replica,而这时需要在这些Replica中选出一个Leader,Producer和Consumer只与这个Leader交互,其它Replica作为Follower从Leader中复制数据。为了更好的做负载均衡,Kafka尽量将所有的Partition均匀分配到整个集群上。一个典型的部署方式是一个Topic的Partition数量大于Broker的数量。同时为了提高Kafka的容错能力,也需要将同一个Partition的Replica尽量分散到不同的机器。实际上,如果所有的Replica都在同一个Broker上,那一旦该Broker宕机,该Partition的所有Replica都无法工作,也就达不到HA的效果。同时,如果某个Broker宕机了,需要保证它上面的负载可以被均匀的分配到其它幸存的所有Broker上。同时,Replica的配置将会影响Kafka的性能(每一份数据写几次的问题),官方的建议是将Replica配置为2~3。
Producer相关:
Producer在生产的时候,应通过哈希算法均匀的把消息写入各Partition。设置合理的缓冲区大小(比如32m)。
Comsumer相关:
同一Topic的一条消息只能被同一个Consumer Group内的一个Consumer消费,但多个Consumer Group可同时消费这一消息。这是Kafka用来实现一个Topic消息的广播(发给所有的Consumer)和单播(发给某一个Consumer)的手段。一个Topic可以对应多个Consumer Group。如果需要实现广播,只要每个Consumer有一个独立的Group就可以了。要实现单播只要所有的Consumer在同一个Group里。用Consumer Group还可以将Consumer进行自由的分组而不需要多次发送消息到不同的Topic。Consumer Group是整个Kafka集群全局的,而非某个Topic的。每一个Consumer实例都属于一个Consumer Group,若不指定则属于默认的Group。JVM设置:
GC策略选择G1代替CMS(JDK1.7以上),设置合理的堆大小(4G内存可以设置最大堆内存3G)。关闭JMX。