参考地址: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. 19 如何在String和Byte[]对象之间进行转换?

  2. Harbor在安装前的几个注意点

    由于Harbor有1.8后和前的配置不一样,决定先安装1.8,结果报错如下 [root@localhost harbor]# ./install.sh [Step 0]: checking insta ...

  3. Cluster基础(四):创建RHCS集群环境、创建高可用Apache服务

    一.创建RHCS集群环境 目标: 准备四台KVM虚拟机,其三台作为集群节点,一台安装luci并配置iSCSI存储服务,实现如下功能: 使用RHCS创建一个名为tarena的集群 集群中所有节点均需要挂 ...

  4. [CSP-S模拟测试]:题(DP)

    题目描述 由于出题人赶时间所以没办法编故事来作为背景.一开始有$n$个苹果,$m$个人依次来吃苹果,第$i$个人会尝试吃$u_i$或$v_i$号苹果,具体来说分三种情况.$\bullet 1.$两个苹 ...

  5. jsplumb+dragable+vue(一)

    基于vue的jsplumb,支持拖拽生成节点,节点双击展示更多信息,节点连线,删除节点,删除连线,重绘连接图,当前页面刷新连接图,根据json画连接图等功能 本章主要讲 拖拽生成节点 获取链接图的信息 ...

  6. PHP读取XML文件数据获取节点值

    最近在接入渠道的时候遇到接口返回是xml数据.现在接口数据返回json数据格式比较常见. 如何获取xml里面真正数据? 对象结果集合单个值的强制转换处理.(直接代码说明) demo示例:  创建xml ...

  7. Windows7系统C盘空间不足

    C盘要满了,用WizTree发现:;两个大文件, ①睡眠有关的,用命令提示符(管理员身份运行), 命令窗口中输入 powercfg -h off,即可关闭休眠功能,同时 Hiberfil.sys 文件 ...

  8. Skyline(6.x)-二次开发手册使用技巧

    毕业设计选择 Skyline 的 Web 端二次开发,由于以前没有接触过 ActiveX 控件的使用,二次开发手册是英文的读起来有点吃力,并且 IE 直接控制台输出 ActiveX 控件创建的对象看不 ...

  9. Js定义一个表单并提交

    Js定义一个表单 var form = $("<form>"); //定义一个form表单 form.attr('style', 'display:none'); // ...

  10. SqlSession 内部运行

    <深入浅出MyBatis技术原理与实战>p150页 SqlSession内部运行图 四大对象在流程中的操作. 1.准备sql.StatementHandler 的prepare方法进行sq ...