分布式消息系统之 Kafka

来源:互联网 发布:人工蜂群算法工具箱 编辑:程序博客网 时间:2024/05/16 18:31

我今天要跟大家说的在那个Kafka呢,全名Apache Kafka,是分布式发布-订阅消息系统,它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式,分区化,可复制的提交日志服务。

    Kafka 是一个类似于JMS的消息队列的分布式消息队列系统。 它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些me ta信息。

http://obs-tpgkm.obs.cn-north-1.myhwclouds.com/2017/0608/12/5938d7763bced.png

http://obs-tpgkm.obs.cn-north-1.myhwclouds.com/2017/0608/12/5938d8b2055db.png

Kafka的适应场景:

    1、Messaging: 对于一些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势.不过到目前为止,我们应该很清楚认识到,kafka并没有提供JMS中的"事务性""消息传输担保(消息确认机制)""消息分组"等企业级特性;kafka只能使用作为"常规"的消息系统,在一定程度上,尚未确保消息的发送与接收绝对可靠(比如,消息重发,消息发送丢失等)

    2、Website activity tracking: kafka可以作为"网站活性跟踪"的最佳工具;可以将网页/用户操作等信息发送到kafka中.并实时监控,或者离线统计分析等

    3、Metrics:Kafka通常被用于可操作的监控数据。这包括从分布式应用程序来的聚合统计用来生产集中的运营数据提要。

    4、Log Aggregation:kafka的特性决定它非常适合作为"日志收集中心";application可以将操作日志"批量""异步"的发送到kafka集群中,而不是保存在本地或者DB中;kafka可以批量提交消息/压缩消息等,这对producer端而言,几乎感觉不到性能的开支.此时consumer端可以使Hadoop等其他系统化的存储和分析系统


Kafka运行原理:

    http://obs-tpgkm.obs.cn-north-1.myhwclouds.com/2017/0608/12/5938d97160ab1.png

名词解读:

    Productor:消息生产者,向kafka broker 发消息的客户端

    Consumer:消息消费者,向kafka broker 拉取消息的客户端

    Topic:相当于一个消息队列

    Consumer Group(CG):kafka 实现一个topic消息的广播或者单播Broker:kafka 的实例(一个服务器就是一个broker)

    Partition: Topic 分布到broker 上的分片,是一个有序的队列,partition每条消息都会有一个ID标识(offset)

    Offset : kafka的存储文件都是按照offset.kafka命名的。


kafka 的运行是依赖于ZooKeeper的,那么我们再来看下 Kafka中ZooKeeper的用途

http://obs-tpgkm.obs.cn-north-1.myhwclouds.com/2017/0608/13/5938da6ca9b3b.png

http://obs-tpgkm.obs.cn-north-1.myhwclouds.com/2017/0608/13/5938dabfb7969.pnghttp://obs-tpgkm.obs.cn-north-1.myhwclouds.com/2017/0608/13/5938dae1bf80b.png

kafka的部署网上例子很多,详细参考:http://www.cnblogs.com/luotianshuai/p/5206662.html

下面是我在部署过程中用到的一些常用配置:

    broker配置

    broker.id : 0  #非负整数,用于唯一标识broker

    log.dirs /tmp/kafka-logs  #kafka持久化数据存储的路径,可以指定多个,以逗号分隔

    host.name  #配置该机器的IP地址

    producer配置

    serializer.class kafka.serializer.DefaultEncoder  #消息序列化类实现方式,默认是byte[]数组形式

    producer.type sync  #设置消息发送模式,默认是同步方式, async异步模式下允许消息累计到一定量或一段时间又另外线程批量发送,吞吐量好但丢失数据风险增大

    partitioner.class kafka.producer.DefaultPartitioner  #kafka消息分区策略实现方式,默认是对key进行hash

    consumer配置

    group.id  #指明当前消费进程所属的消费组,一个partition只能被同一个消费组的一个消费者消费

    auto.commit.enable true  #是否自动周期性提交已经拉取到消费端的消息offset

    zookeeper.connection.timeout.ms 6000  #确认zookeeper连接建立操作客户端能等待的最长时间

    

    常用命令:

        启动&停止:

        bin/kafka-server-start.sh -daemon config/server-0.properties (启动)

        bin/kafka-server-stop.sh (停止)

        topic 操作:

        创建:bin/kafka-topics.sh --create --zookeeper 192.168.0.9:2181 --replication-factor 1 --partitions 1 --topic test

        查看明细:bin/kafka-topics.sh --describe --zookeeper 192.168.0.9:2181 --topic test

        修改参数:bin/kafka-topics.sh --zookeeper 192.168.0.9:2181 --partition 4 --topic test --alter

        删除:bin/kafka-topics.sh --zookeeper 192.168.0.9:2181 --delete --topic test

        启动producer脚本:

        bin/kafka-console-producer.sh --broker-list 192.168.0.31:9092 --topic test

        启动consumer脚本:

        bin/kafka-console-consumer.sh --zookeeper 192.168.0.9:2181 --topic test --from-beginning


这一次暂跟大家介绍下kafka的大致内容,下一次再分享kafka的代码实例。

关于kafka的更多学习介绍可参考:

1. 《Kafka剖析(一):Kafka背景及架构介绍》

2. 《Kafka设计解析(二):Kafka High Availability (上)》

3. 《Kafka设计解析(二):Kafka High Availability (下)》

4. 《Kafka设计解析(四):Kafka Consumer解析》

5. 《Kafka设计解析(五):Kafka Benchmark》

6. 《Kafka学习整理三(borker(0.9.0及0.10.0)配置)》

7. 《Using the High Level Consumer》

8. 《Using SimpleConsumer》

9. 《Consumer Client Re-Design》

10. 《Message Delivery Semantics》

11. 《Kafka Detailed Consumer Coordinator Design》

12. 《Kafka Client-side Assignment Proposal》

13. 《Kafka和DistributedLog技术对比》

14. 《kafka安装和启动》

15. 《kafka consumer防止数据丢失》


原创粉丝点击