参考地址: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. 10:基于Tomcat部署Web工程

    1创建目录, 2.标识目录java文件,资源文件

  2. C# 获取路径中,文件名、目录、扩展名等

    string path = "C:\\dir1\\dir2\\foo.txt"; string str = "GetFullPath:" + Path.GetF ...

  3. [USACO17DEC]Barn Painting (树形$dp$)

    题目链接 Solution 比较简单的树形 \(dp\) . \(f[i][j]\) 代表 \(i\) 为根的子树 ,\(i\) 涂 \(j\) 号颜色的方案数. 转移很显然 : \[f[i][1]= ...

  4. 整合ssm三大框架使用注解开发查询用户信息

    整合ssm三大框架使用注解开发查询用户信息 一.基础知识准备之spring mvc工作原理 二.分析 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求Hand ...

  5. loj6259「CodePlus 2017 12 月赛」白金元首与独舞

    分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ...

  6. JS-Promise-先上传文件再提交表单

    很久前就使用过 Bootstrap File Input 上传文件,将上传文件返回的信息和表单一并提交回去. 最开始的时候是让用户手动点上传文件,然后再点提交表单: 之后尝试了写在回调里,不过这样会写 ...

  7. 【The type javax.servlet.http.HttpServletRequest cannot be resolved】解决方案

    是缺少serverlet的引用库,解决如下 1.工程右键-properties->java build path 2.在java build path的libraries tab页中选择Add ...

  8. 测开之路六十五:UI测试平台之js

    //添加网址的函数,生成一个输入网址的标签,并且把标签append到id为cases下function browser() { var html = '\ <div class="ro ...

  9. C++输出字符指针指向的地址

    int main() { char *s2 = "jwdajkj"; ]; )); printf("%p,%p\n", s3, s1); cout <&l ...

  10. Linux固定ip配置

    第一步:查看网络信息 [root@localhost ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu ...