kafka特点:
1解耦性:生产者和消费者分离,生产者完全不需要关注生产的消息有多少消费者消费,什么时候消费完,消费者也只需通过制定端口和topic来消费数据就OK了
2与其它消息订阅系统相比(例如rabbit mq),同一条消息可以被不同分组的多个消费者消费,互不影响
3消息序列化到磁盘,不怕丢失,可以设置一个过期时间log.retention.hours/minutes/ms,解决数据量过多的问题(新版本kafka需要管理工具来改变默认参数)
4扩展性:增加broker扩展kafka服务器性能,一个broker失效消息会自动转移到其它broker上
zookeeper依赖性:保存kafka元数据,路径为zookeeper.host:2181/kafkadir(kafkadir是为了zookeeper集群可以共享给其它应用程序)
zookeeper群组:一致性协议,选举机制。一般奇数台zookeeper机器,3个或5个(2n-1和2n个机器都只能承受n个机器失效,所以选2n-1),
但是不建议超过7个,否则一致性协议导致整个群组性能降低
(一致性协议:ZBA算法-原子消息广播算法,群组的机器要启动时或者崩溃后要选举leader,启动后要leader通过广播消息和follower保持状态同步)
zookeeper配置:
datadir=/var/lib/zookeerper
port=2181
server.1=bigdata-01:2888:3888
server.2=bigdata-02:2888:3888
server.3=bigdata-03:2888:3888
kafk分区数选择:
根据数据量和吞吐量进行选择,
消费者把数据写入数据库的上限是50M/s,所以如果消费速率需求是1T,那么需要20个分区
生产者的生产效率通常大于消费者,可以多考虑一些吞吐量
每个broker的分区数量也有一个上限,过多分区会占用较多内存
kafka broker配置:所有broker的id在集群中必须唯一,每个kafka broker的配置包括所有brokers和相同的zookeeper connect
port=9092
broker.id=1
zookeeper.connect=bigdata-01:2181/kafkadir;bigdata-02:2181/kafkadir;bigdata-03:2181/kafkadir
port=9092
broker.id=2
zookeeper.connect=bigdata-01:2181/kafkadir;bigdata-02:2181/kafkadir;bigdata-03:2181/kafkadir
port=9092
broker.id=3
zookeeper.connect=bigdata-01:2181/kafkadir;bigdata-02:2181/kafkadir;bigdata-03:2181/kafkadir
消费kafka的偏移量offset可以选择提交到zookeeper或者kafka集群服务器,一般考虑放在kafka服务器减少zookeeper压力,
zookeeper虽然技术上可以实现但一般也不建议共享给其它应用程序,因为kafka对zookeeper群组的延迟比较敏感