参考地址: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掉了,但之前的消息还是可以消费的。

Ubuntu简单安装kafka及使用的更多相关文章

  1. Ubuntu 简单安装和配置 GitLab

    使用的 Ubuntu Server 16.04 LTS 版本,服务器托管在 Azure 上,用的 1 元试用 1 个月服务器订阅(1500 元额度). 安装命令(推荐使用): curl -sS htt ...

  2. Ubuntu 简单安装 Docker

    服务器版本 Ubuntu 16.04 LTS. 1. 普通安装 安装命令: 更新程序包索引,以及添加使用 HTTPS 传输的软件包以及 CA 证书. $ sudo apt-get update $ s ...

  3. Ubuntu下安装Kafka Manager

    参考 : kafka管理器kafka-manager部署安装 下载Kafka Manager,并进行打包,由于Kafka manager是由scala写的,所以需要由sbt的支持 git clone ...

  4. ubuntu简单安装apache

    环境: ubuntu 目标: 1.安装web服务器apache 2.打开浏览器,访问自己的web服务器,看到 Hello,World! 开始动手了! 安装sudo apt-get install ap ...

  5. ubuntu 简单安装配置gitlab

    安装 gitlab-ce 社区版 依赖 sudo apt-get install curl openssh-server ca-certificates postfix 添加gitlab包服务并安装 ...

  6. Ubuntu Docker 简单安装 GitLab

    相关博文: Ubuntu 简单安装 Docker Ubuntu 简单安装和配置 GitLab 服务器版本 Ubuntu 16.04 LTS. 1. 安装和配置 安装命令: sudo docker ru ...

  7. Ubuntu下安装和使用zookeeper和kafka

    1.在清华镜像站下载kafka_2.10-0.10.0.0.tgz 和 zookeeper-3.4.10.tar.gz 分别解压到/usr/local目录下 2.进入zookeeper目录,在conf ...

  8. Ubuntu下安装MySQL及简单操作

    Ubuntu上安装MySQL非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client ...

  9. ubuntu虚拟机安装简单pxe服务器

    安装环境: vmware2台虚拟机,一台用来做pxe服务器(安装tftp.dhcp.apache2等服务),另一台用来做安装测试. 虚拟机的网络配置:dhcp的虚拟网络为192.168.10.100/ ...

随机推荐

  1. Django ormmodel模型字段参考文章

    Model 字段参考 (Model field reference)¶ 本文档包含所有 字段选项 (field options) 的内部细节和 Django 已经提供的 field types . 参 ...

  2. redis学习 --Hash

    一:我们可以将Redis中的Hash类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Age等.如果H ...

  3. C# 中获取路径

    string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名. string str2=Environm ...

  4. 万能的gitignore文件模版

    ## .gitignore for Grails 1.2 and 1.3 # .gitignore for maven target/ *.releaseBackup # web applicatio ...

  5. 代理池抓取基础版-(python协程)--抓取网站(西刺-后期会持续更新)

    # coding = utf- __autor__ = 'litao' import urllib.request import urllib.request import urllib.error ...

  6. crazyflie四轴飞行器

    源地址:http://www.bitcraze.se/2013/02/pre-order-has-started/ Crazyflie是一个开源的纳米四旋翼 来几张靓照 开发平台是开源的,所以原理图和 ...

  7. 《图解设计模式》读书笔记4-1 Bridge模式

    目录 概念 代码 角色 类图 想法 概念 Bridge模式即桥接模式.顾名思义,这个模式的作用是将类的功能层次结构和类的实现层次结构连接起来. 功能层次结构 Something -SomethingG ...

  8. Fedora 的截屏功能

    写写博客少不了截图,Windows 上使用微信的快捷键 Ctrl+A 截图并且可以随意编辑是挺方便的,开始在 Linux 上还没有找到这样的软件,只找到了不支持编辑的简单截图软件. 1. 使用 Scr ...

  9. upc组队赛17 Stone Game【极小值】

    Stone Game 题目链接 题目描述 Alice and Bob are always playing game! The game today is about taking out stone ...

  10. Git009--分支管理&创建与合并分支

    Git--分支管理&创建与合并分支 一.分支管理 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578 ...