ubuntu18.04 搭建kafka消息队列的运行开发环境 转载文章

1、搭建zookeeper运行环境 转载文章https://blog.csdn.net/lihao21/article/details/51778255

本文讲述如何安装和部署ZooKeeper。

一、系统要求
ZooKeeper可以运行在多种系统平台上面,表1展示了zk支持的系统平台,以及在该平台上是否支持开发环境或者生产环境。

表1:ZooKeeper支持的运行平台

系统 开发环境 生产环境
Linux 支持 支持
Solaris 支持 支持
FreeBSD 支持 支持
Windows 支持 不支持
MacOS 支持 不支持
ZooKeeper是用Java编写的,运行在Java环境上,因此,在部署zk的机器上需要安装Java运行环境。为了正常运行zk,我们需要JRE1.6或者以上的版本。
对于集群模式下的ZooKeeper部署,3个ZooKeeper服务进程是建议的最小进程数量,而且不同的服务进程建议部署在不同的物理机器上面,以减少机器宕机带来的风险,以实现ZooKeeper集群的高可用。
ZooKeeper对于机器的硬件配置没有太大的要求。例如,在Yahoo!内部,ZooKeeper部署的机器其配置通常如下:双核处理器,2GB内存,80GB硬盘。

二、下载
可以从 https://zookeeper.apache.org/releases.html 下载ZooKeeper,目前最新的稳定版本为 3.4.8 版本,用户可以自行选择一个速度较快的镜像来下载即可。

三、目录
下载并解压ZooKeeper软件压缩包后,可以看到zk包含以下的文件和目录:


图1:ZooKeeper软件的文件和目录

bin目录
zk的可执行脚本目录,包括zk服务进程,zk客户端,等脚本。其中,.sh是Linux环境下的脚本,.cmd是Windows环境下的脚本。
conf目录
配置文件目录。zoo_sample.cfg为样例配置文件,需要修改为自己的名称,一般为zoo.cfg。log4j.properties为日志配置文件。
lib
zk依赖的包。
contrib目录
一些用于操作zk的工具包。
recipes目录
zk某些用法的代码示例
四、单机模式
ZooKeeper的安装包括单机模式安装,以及集群模式安装。

单机模式较简单,是指只部署一个zk进程,客户端直接与该zk进程进行通信。
在开发测试环境下,通过来说没有较多的物理资源,因此我们常使用单机模式。当然在单台物理机上也可以部署集群模式,但这会增加单台物理机的资源消耗。故在开发环境中,我们一般使用单机模式。
但是要注意,生产环境下不可用单机模式,这是由于无论从系统可靠性还是读写性能,单机模式都不能满足生产的需求。

4.1 运行配置
上面提到,conf目录下提供了配置的样例zoo_sample.cfg,要将zk运行起来,需要将其名称修改为zoo.cfg。
打开zoo.cfg,可以看到默认的一些配置。

tickTime
时长单位为毫秒,为zk使用的基本时间度量单位。例如,1 * tickTime是客户端与zk服务端的心跳时间,2 * tickTime是客户端会话的超时时间。
tickTime的默认值为2000毫秒,更低的tickTime值可以更快地发现超时问题,但也会导致更高的网络流量(心跳消息)和更高的CPU使用率(会话的跟踪处理)。
clientPort
zk服务进程监听的TCP端口,默认情况下,服务端会监听2181端口。
dataDir
无默认配置,必须配置,用于配置存储快照文件的目录。如果没有配置dataLogDir,那么事务日志也会存储在此目录。
4.2 启动
在Windows环境下,直接双击zkServer.cmd即可。在Linux环境下,进入bin目录,执行命令

./zkServer.sh start
1
这个命令使得zk服务进程在后台进行。如果想在前台中运行以便查看服务器进程的输出日志,可以通过以下命令运行:

./zkServer.sh start-foreground
1
执行此命令,可以看到大量详细信息的输出,以便允许查看服务器发生了什么。

使用文本编辑器打开zkServer.cmd或者zkServer.sh文件,可以看到其会调用zkEnv.cmd或者zkEnv.sh脚本。zkEnv脚本的作用是设置zk运行的一些环境变量,例如配置文件的位置和名称等。

4.3 连接
如果是连接同一台主机上的zk进程,那么直接运行bin/目录下的zkCli.cmd(Windows环境下)或者zkCli.sh(Linux环境下),即可连接上zk。
直接执行zkCli.cmd或者zkCli.sh命令默认以主机号 127.0.0.1,端口号 2181 来连接zk,如果要连接不同机器上的zk,可以使用 -server 参数,例如:

bin/zkCli.sh -server 192.168.0.1:2181
1
五、集群模式
单机模式的zk进程虽然便于开发与测试,但并不适合在生产环境使用。在生产环境下,我们需要使用集群模式来对zk进行部署。

注意
在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。如果只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能构成一个quorum的大多数。因此,部署2个进程甚至比单机模式更不可靠,因为2个进程其中一个不可用的可能性比一个进程不可用的可能性还大。

5. 1 运行配置
在集群模式下,所有的zk进程可以使用相同的配置文件(是指各个zk进程部署在不同的机器上面),例如如下配置:

tickTime=2000
dataDir=/home/myname/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.229.160:2888:3888
server.2=192.168.229.161:2888:3888
server.3=192.168.229.162:2888:3888

initLimit
ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。
当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。initLimit配置follower与leader之间建立连接后进行同步的最长时间。
syncLimit
配置follower和leader之间发送消息,请求和应答的最大时间长度。
tickTime
tickTime则是上述两个超时配置的基本单位,例如对于initLimit,其配置值为5,说明其超时时间为 2000ms * 5 = 10秒。
server.id=host:port1:port2
其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。
host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。
dataDir
其配置的含义跟单机模式下的含义类似,不同的是集群模式下还有一个myid文件。myid文件的内容只有一行,且内容只能为1 - 255之间的数字,这个数字亦即上面介绍server.id中的id,表示zk进程的id。
注意
如果仅为了测试部署集群模式而在同一台机器上部署zk进程,server.id=host:port1:port2配置中的port参数必须不同。但是,为了减少机器宕机的风险,强烈建议在部署集群模式时,将zk进程部署不同的物理机器上面。

5.2 启动
假如我们打算在三台不同的机器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一个zk进程,以构成一个zk集群。
三个zk进程均使用相同的 zoo.cfg 配置:

tickTime=2000
dataDir=/home/myname/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.229.160:2888:3888
server.2=192.168.229.161:2888:3888
server.3=192.168.229.162:2888:3888

在三台机器dataDir目录( /home/myname/zookeeper 目录)下,分别生成一个myid文件,其内容分别为1,2,3。然后分别在这三台机器上启动zk进程,这样我们便将zk集群启动了起来。

5.3 连接
可以使用以下命令来连接一个zk集群:

bin/zkCli.sh -server 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181
1
成功连接后,可以看到如下输出:

2016-06-28 19:29:18,074 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4
Welcome to ZooKeeper!
2016-06-28 19:29:18,146 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.229.162/192.168.229.162:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2016-06-28 19:29:18,161 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@852] - Socket connection established to 192.168.229.162/192.168.229.162:2181, initiating session
2016-06-28 19:29:18,199 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 192.168.229.162/192.168.229.162:2181, sessionid = 0x3557c39d2810029, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED) 0]

图2:客户端连接zk集群的输出日志

从日志输出可以看到,客户端连接的是192.168.229.162:2181进程(连接上哪台机器的zk进程是随机的),客户端已成功连接上zk集群。

参考资料
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html
《ZooKeeper分布式系统开发实战》课程,主讲人:玺感
《ZooKeeper分布式过程协同技术详解》,Flavio Junqueira等著,谢超等译
百度百科有关quorum的解释,http://baike.baidu.com/link?url=pqWrzgH-_VhMLnscR1iRTpPjovfyhxG-8Qs9HxGutiGi5bhnA_lX_pmabLQ-3MiDeigcHRFMYSbFg90RAYVAta
《Zookeeper 安装和配置》,http://coolxing.iteye.com/blog/1871009
————————————————
版权声明:本文为CSDN博主「haozlee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lihao21/article/details/51778255

 

2、搭建kafka运行开发环境

1.下载安装
1.1.下载
下载路径

http://kafka.apache.org/downloads
或者使用命令下载

wget https://mirror-hk.koddos.net/apache/kafka/2.8.0/kafka_2.13-2.8.0.tgz
1.2.安装
tar -zxvf kafka_2.13-2.8.0.tgz
1
2.修改Kafka的配置
2.1.修改文件的位置
vi ./kafka_2.13-2.8.0/config/server.properties
1
2.2.修改配置
broker.id=0
port=9000
host.name=localhost
log.dirs=/home/XXX/kafka_2.13-2.8.0/logs
zookeeper.connect=localhost:2181
1
2
3
4
5
2.3.说明
broker.id 默认值为-1,只有大于等于0的时候,才会正常启动
port 为当前Kafka的端口
host.name 单机可直接用localhost
log.dirs 为保存日志的地方,需要新建一个文件夹
zookeeper.connect zookeeper的连接ip和端口
2.4.新建日志文件夹
mkdir /home/XXX/kafka_2.13-2.8.0/logs
1
该文件夹为2.2配置中日志值

3.修改ZooKeeper配置
3.1.修改位置
在config/zookeeper.properties进行修改

3.2.修改配置
dataDir=/home/XXX/kafka/zookeeper/datas
dataLogDir=/home/XXX/kafka/zookeeper/logs
clientPort=2181
maxClientCnxns=100
tickTime=2000
initLimit=10
1
2
3
4
5
6
3.3.说明
dataDir - - -zookeeper数据储存的位置
dataLogDir - - - zookeeper日志储存的位置
clientPort - - - zookeepr 的端口,和步骤2中的配置对应
maxClientCnxns - - - 最大的连接数
tickTime - - - zookeeper服务器之间或客户端之间维持心跳的时间间隔
initLimit - - - zookeeper 接受客户端初始化连接时,最长能忍受多少个心跳时间间隔
3.4.创建文件夹
mkdir /home/XXX/kafka_2.13-2.8.0/zookeeper
mkdir /home/XXX/kafka_2.13-2.8.0/zookeeper/datas
mkdir /home/XXX/kafka_2.13-2.8.0/zookeeper/logs
1
2
3
4.启动Kafka
4.1.创建文件并赋予执行权限
touch /home/XXX/kafka_2.13-2.8.0/kafka_start.sh
chmod u+x /home/XXX/kafka_2.13-2.8.0/kafka_start.sh
1
2
4.2.编写Shell脚本
#!bin/bash
# 先启动zookeeper
/home/XXX/kafka/bin/zookeeper-server-start.sh /home/XXX/kafka/config/zookeeper.properties & sleep 3
# 后启动kafka
/home/XXX/kafka/bin/kafka-server-start.sh /home/XXX/kafka/config/server.properties &
1
2
3
4
5
4.3.执行脚本
sh /home/XXX/kafka_2.13-2.8.0/kafka_start.sh
1
5.关闭Kafka
5.1.创建文件并赋予执行权限
touch /home/XXX/kafka_2.13-2.8.0/kafka_stop.sh
chmod u+x /home/XXX/kafka_2.13-2.8.0/kafka_stop.sh
1
2
5.2.编写Shell脚本
#!bin/bash
/home/XXX/kafka_2.13-2.8.0//bin/kafka-server-stop.sh
sleep 3
/home/XXX/kafka_2.13-2.8.0//bin/zookeeper-server-stop.sh &
1
2
3
4
5.3.执行脚本
sh /home/XXX/kafka_2.13-2.8.0/kafka_stop.sh
1
6.启动并创建Topic
执行脚本启动

sh /home/XXX/kafka_2.13-2.8.0/kafka_start.sh
1
执行命令创建Topic

./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic MyTopic
1
7.测试
7.1.创建生产者
./kafka-console-producer.sh --broker-list localhost:9000 --topic MyTopic
1
说明:

/kafka-console-producer.sh 为生产者的执行文件
–broker-list 后面跟随的IP和端口,对应的我们在第2步骤修改的IP和端口
–topic 后面跟的是创建的topic
7.2.创建消费者
./kafka-console-consumer.sh --bootstrap-server localhost:9000 --topic MyTopic --from-beginning
1
说明:

/kafka-console-consumer.sh 为消费者的执行文件
–bootstrap-server 后面跟随的IP和端口,对应的我们在第2步骤修改的IP和端口
–topic 后面跟的是创建的topic
–from-beginning 读取历史未消费的数据,如果不需要历史数据,可以不需要
————————————————
版权声明:本文为CSDN博主「hello_fracong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37356874/article/details/116267765

 

  • 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掉了,但之前的消息还是可以消费的。

  •  
posted @ 2022-10-28 09:59  eastgeneral  阅读(112)  评论(0编辑  收藏  举报