zoukankan      html  css  js  c++  java
  • Ubuntu简单安装kafka及使用

    参考地址:https://www.jianshu.com/p/d0e630c8f4ae

    kafka是一个分布式的基于发布订阅模式的消息队列,主要应用于大数据实时处理领域。(kafka是消费者主动拉取生产者的信息)

    作用(所有的消息队列):(1)、解耦:不需要两个应用都同时在线(强依赖);(2)、缓冲:解决生产消息和消费消息的处理速度不一致的情况;(3)、灵活性&削封:在访问量剧增的情况下,可以使关键组件顶住突发的访问压力,而不会造成组件的崩溃;(4)、异步通信:当一些信息不需要立即处理时,可以充当队列,在需要处理的时候从队列中获取。

    (为防止log文件过大导致数据定位效率低下,kafka采取了分片和索引机制,将每个分区分为多个片段(segment),每个segment对应两个文件--.index和.log文件)

    分区原因:

      (1)、方便在集群中扩展。每个分区可以通过调整以适应它所在的机器,而一个topic又可以由多个分区组成,因而整个集群就可以适应任意大小的数据了;

      (2)、可以提高并发。因为可以以分区为单位进行读写了。

    kafka数据可靠性保证(不丢数据):为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个分区收到producer发送的数据之后,都需要向producer发送acks(acknowledgement确认收到),如果producer没有收到acks,将会重新发送数据,否者进行下一轮发送。

    kafka采用所有副本同步完成之后,才发送acks(这样做延迟高,但是重新选举leader时,容忍n台节点的故障,只需要n+1个副本就可以了)。但是可能出现leader收到数据,所有follower都开始同步数据,但有一个follower因为某种

    故障,迟迟不能与leader通信,leader将会一直等下去,为了解决这个问题,leader维护了一个动态的ISR,表示和leader保持同步的follower集合。当ISR中的follower完成数据同步之后,leader就会给producer发送acks,当ISR中的

    follower超过replica.lag.time.max.ms设置的时间,为没有向leader同步数据,则将改follower剔除。leader发生故障后,就会从ISR中重新选举leader。

    对于某些不太重要的参数,可以容忍数据的少量丢失,所以没必要等到ISR中的所有follower同步成功。可以通过ack参数进行配置:

    0:producer不等待acks,延迟低,当broker出现故障可能丢失数据;

    1:producer等待acks,分区的leader写入磁盘成功后返回acks(只等leader写完,不管follower),若在follower同步成功之前leader故障,将会丢数据;

    -1:producer等待acks,分区的leader和ISR中的follower全部写入成功才返回acks,若follower同步完成后,broker发送acks之前,leader故障,将会造成数据重复。

    (消费者消费和kafka存储)kafka数据一致性:(LEO:指的是每个副本最大的offset(偏移量),HW:指的是ISR队列中最小的offset,也就是消费者能见到的最大的offset)

    (1)、follower故障:follower发生故障后会被踢出ISR队列,等follower恢复后,follower会读取本地磁盘记录的挂掉之前的HW,并将log文件高于HW的截掉,然后从HW的位置开始向leader同步,等该follower的LED大于等于该分区的

    HW,即follower追上leader之后,就可以重新加入ISR队列了。

    (2)、leader故障:leader发生故障之后,会从ISR中选出新的leader,然后其余的follower会先将各自log文件高于HW的部分截掉,接着从新的leader同步数据。

    注意:这只能保证副本之间的数据一致性,不能保证数据不丢失或者不重复。

     kafka的幂等性:(无论producer发送多少次,broker只会存储一次)

    kafka中设置enable.idempotence设置为true时,即可保证幂等性,此时acks默认是-1了。开启幂等性之后,producer会在初始化的时候分配一个PID,发往同一个分区的信息会携带一个seqNumber,而broker端

    会对<PID,Partiton,SeqNumber>做缓存,当具有相同的SeqNumber消息时,broker之后保存一条。但是PID每次重启都会变化,不同的分区也具有 不同的主键,所有幂等性无法保证跨分区回话的幂等性。

    一、下载 kafka 二进制安装包

    下载地址: http://kafka.apache.org/downloads

    二、上传 kafka 压缩包到虚拟机中并解压到指定文件夹

    tar -xzf kafka_2.11-2.3.0.tgz 

    三、启动 kafka 服务

    kafka需要使用Zookeeper,首先需要启动Zookeeper服务,如果没有的话,可以使用kafka自带的脚本启动一个简单的单一节点Zookeeper实例:

    bin/zookeeper-server-start.sh config/zookeeper.properties &
    (使用 bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 以守护进程启动)

    如果已经启动了 zookeeper,则直接运行下面的命令:

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

    停止 kafka 服务则运行下面命令:

    bin/kafka-server-stop.sh config/server.properties

    四、kafka 简单使用

    4.1、创建一个主题

    首先创建一个名为test的topic,只使用单个分区和一个复本

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

    4.2、删除主题

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

     上面的提示表示该主题仅仅标记为“待删除”,至于topic是否被真正删除取决于broker端(server.properties)的参数设置delete.topic.enable,若设置为false,那么即使运行了上面的命令,主题也不会被删除。需要说明的是主题的删除时异步的,就算将delete.topic.enable

    设置为true,当执行了上面的命令后,也需要根据主题的分片依次进行删除。

    4.3、查看主题

    bin/kafka-topics.sh --list --zookeeper localhost:2181

    4.4、发送消息

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

    4.5、接收消息

    启动一个消费者,消费者会接收到消息

     bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

    五、 搭建一个多个broker的集群

    刚才只是启动了单个broker,现在启动有3个broker组成的集群,这些broker节点也都是在本机上的:

    首先为每个节点编写配置文件:

    cp config/server.properties config/server_1.properties
    cp config/server.properties config/server_2.properties

    在拷贝出的新文件中添加以下参数:server_1.properties

     broker.id=1
      port=9093
      log.dir=/tmp/kafka-logs-1

    broker.id在集群中唯一的标注一个节点,因为在同一个机器上,所以必须制定不同的端口和日志文件,避免数据被覆盖。

    刚才已经启动可Zookeeper和一个节点,现在启动另外两个节点:

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

    创建一个拥有3个副本的topic:

     bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic zx_test

    现在我们搭建了一个集群,怎么知道每个节点的信息呢?运行“"describe topics”命令就可以了:

    bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic zx_test

    下面解释一下这些输出。第一行是对所有分区的一个描述,然后每个分区都会对应一行,因为我们只有一个分区所以下面就只有一行。

    leader:负责处理消息的读和写,leader是从所有节点中随机选择的.
    replicas:列出了所有的副本节点,不管节点是否在服务中.
    isr:是正在服务中的节点.

    在我们的例子中,节点1是作为leader运行。

     向topic发送消息:

     bin/kafka-console-producer.sh --broker-list localhost:9092 --topic zx_test

    消费这些消息:(三个副本,任意一个端口即可)

     bin/kafka-console-consumer.sh --bootstrap-server localhost:9092/9093/9094 --topic zx_test--from-beginning

    测试一下容错能力:Broker 1作为leader运行,现在我们kill掉它:

    ps -ef|grep server-1.properties
    kill -9 xxxx

    另外一个节点被选做了leader,node 1 不再出现在 ISR副本列表中:

    虽然最初负责续写消息的leader down掉了,但之前的消息还是可以消费的。

  • 相关阅读:
    最富有客户的资产总量
    无重叠区间
    工作流分析推荐
    sharepoint外包和定制开发公司分析比较及推荐
    sharepoint开发企业信息门户系统分析及公司推荐
    北京sharepoint开发公司比较推荐
    国内市场主流专业的sharepoint开发公司分析比较及推荐
    北京工作流软件公司分析比较和推荐
    国内市场主流专业的工作流(bpm)软件分析、比较及推荐
    Hibernate的多对多实例
  • 原文地址:https://www.cnblogs.com/cq-yangzhou/p/11425047.html
Copyright © 2011-2022 走看看