• kafka学习笔记


    最近在做一个项目,需要将运营商提供的原始数据从FTP服务器自动获取并通过脚本解压和xml解析之后存入kafka集群中,下面是在做的过程中有关kafka的学习记录。

    Partitions

    1、kafka基于文件存储.通过分区,可以将日志内容分散到多个server,来避免文件尺寸达到单机磁盘的上限,每个partiton都会被当前server(kafka实例)保存

    2、可以将一个topic切分多任意多个partitions,来消息保存/消费的效率.此外越多的partitions意味着可以容纳更多的consumer,有效提升并发消费的能力

    每个partition都有一个server"leader"eader负责所有的读写操作,如果leader失效,那么将会有其他follower来接管(成为新的leader)follower只是单调的和leader跟进,同步消息即可。由此可见作为leaderserver承载了全部的请求压力,因此从集群的整体考虑,有多少个partitions就意味着有多少个"leader",kafka会将"leader"均衡的分散在每个实例上,来确保整体的性能稳定。

    Producer

    Producer将消息发布到指定的Topic,同时Producer也能决定将此消息归属于哪个partition;比如基于"round-robin"方式或者通过其他的一些算法等。

    producer将会和Topic下所有partition leader保持socket连接;消息由producer直接通过socket发送到broker,中间不会经过任何"路由层".事实上,消息被路由到哪个partition,producer客户端决定.比如可以采用"random""key-hash""轮询",如果一个topic中有多个partitions,那么在producer端实现"消息均衡分发"是必要的

    其中partition leader的位置(host:port)注册在zookeeper,producer作为zookeeper client,已经注册了watch用来监听partition leader的变更事件。

    Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance

    Consumer

    本质上kafka只支持Topic。每个consumer属于一个consumer group;反过来说,每个group中可以有多个consumer。发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。

    如果所有的consumer都具有相同的group,这种情况和queue模式很像;消息将会在consumers之间负载均衡。如果所有的consumer都具有不同的group,那这就是"发布-订阅";消息将会广播给所有的消费者。

    kafka,一个partition中的消息只会被group中的一个consumer消费;每个groupconsumer消息消费互相独立;我们可以认为一个group是一个"订阅",一个Topic中的每个partions,只会被一个"订阅者"中的一个consumer消费,不过一个consumer可以消费多个partitions中的消息.kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的.事实上,Topic角度来说,消息仍不是有序的。kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。

    consumer端向broker发送"fetch"请求,并告知其获取消息的offset;此后consumer将会获得一定条数的消息;consumer端也可以重置offset来重新消费消息。

    消息传送机制

    对于JMS实现,消息传输担保非常直接:有且只有一次(exactly once).kafka中稍有不同:

        1) at most once: 最多一次,这个和JMS"非持久化"消息类似.发送一次,无论成败,将不会重发.

        2) at least once: 消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功.

        3) exactly once: 消息只会发送一次.

        at most once: 消费者fetch消息,然后保存offset,然后处理消息;client保存offset之后,但是在消息处理过程中出现了异常,导致部分消息未能继续处理.那么此后"未处理"的消息将不能被fetch,这就是"at most once".

        at least once: 消费者fetch消息,然后处理消息,然后保存offset.如果消息处理成功之后,但是在保存offset阶段zookeeper异常导致保存操作未能执行成功,这就导致接下来再次fetch时可能获得上次已经处理过的消息,这就是"at least once",原因offset没有及时的提交给zookeeperzookeeper恢复正常还是之前offset状态.

        exactly once: kafka中并没有严格的去实现(基于2阶段提交,事务),我们认为这种策略在kafka中是没有必要的.

    通常情况下"at-least-once"是我们首选.(相比at most once而言,重复接收数据总比丢失数据要好).

    复制备份

    kafka将每个partition数据复制到多个server,任何一个partition有一个leader和多个follower(可以没有);备份的个数可以通过broker配置文件来设定.leader处理所有的read-write请求,follower需要和leader保持同步.Followerconsumer一样,消费消息并保存在本地日志中;leader负责跟踪所有的follower状态,如果follower"落后"太多或者失效,leader将会把它从replicas同步列表中删除.当所有的follower都将一条消息保存成功,此消息才被认为是"committed",那么此时consumer才能消费它.即使只有一个replicas实例存活,仍然可以保证消息的正常发送和接收,只要zookeeper集群存活即可.(不同于其他分布式存储,比如hbase需要"多数派"存活才行)

        当leader失效时,需在followers中选取出新的leader,可能此时follower落后于leader,因此需要选择一个"up-to-date"follower.选择follower时需要兼顾一个问题,就是新leaderserver上所已经承载的partition leader的个数,如果一个server上有过多的partition leader,意味着此server将承受着更多的IO压力.在选举新leader,需要考虑到"负载均衡".

    测试命令

    下面这些测试命令是在我自己的集群里面测试用的,里面的namenode1是hadoop集群中的一个主机名,该主机运行zookeepeer

    //删除topic,注意需要在server.properties中添加delete.topic.enable=true属性

    bin/kafka-topics.sh --delete --zookeeper namenode1:2181 --topic test

    //创建topic

    bin/kafka-topics.sh --create --zookeeper namenode1:2181 --replication-factor 3 --partitions 3 --topic test

    //打开kafka

    bin/kafka-server-start.sh config/server.properties &

    //查看队列明细

    bin/kafka-topics.sh --describe test --zookeeper datanode1:2181

    //发送消息

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

    //接收消息

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

  • 相关阅读:
    Android之旅十六 android中各种资源的使用
    XTU OJ 1207 Welcome to XTCPC (字符串签到题)
    scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战
    【云图】怎样设置支付宝里的家乐福全国连锁店地图?
    怎样在QML中使用multitouch
    软件project师周兆熊给IT学子的倾情奉献
    Linux系统下怎样配置SSH?怎样开启SSH?
    数学之路-python计算实战(4)-Lempel-Ziv压缩(2)
    Day5上午解题报告
    一份只有巨佬才能看懂的代码
  • 原文地址:https://www.cnblogs.com/xiaoxiongbb/p/5061593.html
Copyright © 2020-2023  润新知