本次需要完成的任务在上一篇博客的基础上持续添加软件zookeeper和kafka,指定zookeeper的端口为12181,kafka端口为19092,新建一个kafka的topic:audit,设置该topic分区数量为2,最后设置kafka的日志最大留存时间为48小时,kafka分区最大留存大小为2Gb。
一、zookeeper 简单介绍
Apache ZooKeeper是Apache软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。Apache ZooKeeper是一种开源软件,可实现弹性和高度可靠的分布式协调。它通常用于分布式系统中,以管理配置信息,命名服务,分布式同步,仲裁和状态。此外,分布式系统依靠ZooKeeper来实现共识,领导者选举和组管理。
ZooKeeper的架构通过冗余服务实现高可用性。因此,如果第一次无应答,客户端就可以询问另一台ZooKeeper主机。ZooKeeper节点将它们的数据存储于一个分层的命名空间,非常类似于一个文件系统或一个前缀树结构。客户端可以在节点读写,从而以这种方式拥有一个共享的配置服务。
ZooKeeper在Java中运行,版本1.6或更高版本(JDK 6或更高版本)。它作为ZooKeeper服务器的集合运行。三个ZooKeeper服务器是整体的最小建议大小,ZooKeeper通常部署在专用的RHEL上,具有双核处理器,2GB RAM和80GB硬盘。ZooKeeper在生产环境中通常采用集群部署,集群数量使用奇数个机器,例如,使用四台机器,ZooKeeper只能处理单台机器的故障; 如果两台机器出现故障,其余两台机器不会占多数。但是,有了五台机器,ZooKeeper可以处理两台机器的故障。
二、zookeeper安装步骤
本项目用于开发测试,所以安装采用单机独立模式,在独立模式下设置ZooKeeper服务器非常简单。服务器包含在单个JAR文件中,因此安装包括创建配置。下载一个稳定的ZooKeeper版本,将其解压缩到指定目录下以root身份进入目录后完成安装配置工作。
1、安装jdk环境
创建java安装目录,并将jdk包解压缩到安装目录
mkdir /usr/local/java && tar xvf /home/app/jdk-8u181-linux-x64.tar.gz -C /usr/local/java
配置/etc/profile文件,在最后添加下面的配置变量

export JAVA_HOME=/usr/local/java/jdk1.8.0_181
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${PATH}
当前环境引用环境变量
source /etc/profile
检验java环境安装效果
2、创建zookeeper安装目录并将zookeeper打包文件解压缩到指定目录
mkdir /usr/local/zk && tar xvf /home/app/zookeeper-3.4.14.tar.gz -C /usr/local/zk
3、创建zookeeper的配置文件,修改zookeeper启动端口为12181
cp zoo_sample.cfg zoo.cfg && vi zoo.cfg
conf/zoo.cfg:
tickTime=2000
dataDir=/var/zookeeper
clientPort=12181
tickTime
ZooKeeper使用的基本时间单位(以毫秒为单位)。它用于做心跳,最小会话超时将是tickTime的两倍。
DATADIR
存储内存数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。
CLIENTPORT
侦听客户端连接的端口
4、启动单节点zookeeper
bin/zkServer.sh start
5、检验zookeeper配置
jps -V && netstat -ntlp | grep 12181
使用zookeeper客户端登陆12181测试
bin/zkCli.sh -server localhost:12181
三、kafka简单介绍
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,[3]这使它作为企业级基础设施来处理流式数据非常有价值。此外,Kafka可以通过Kafka Connect连接到外部系统(用于数据输入/输出),并提供了Kafka Streams——一个Java流式处理库。
kafka架构图
Kafka架构的主要术语包括Topic、Record和Broker。Topic由Record组成,Record持有不同的信息,而Broker则负责复制消息
- Kafka作为一个集群运行在一个或多个可跨多个数据中心的服务器上。
- Kafka集群以称为主题的类别存储记录流。
- 每条记录由一个键,一个值和一个时间戳组成。
- Topic 用来对消息进行分类,每个进入到Kafka的信息都会被放到一个Topic下
- Broker 用来实现数据存储的主机服务器
- Partition 每个Topic中的消息会被分为若干个Partition,以提高消息的处理效率
- Producer 消息的生产者
- Consumer 消息的消费者
- Consumer Group 消息的消费群组
Kafka有四个主要API:
- 生产者API:支持应用程序发布Record流。
- 消费者API:支持应用程序订阅Topic和处理Record流。
- Stream API:将输入流转换为输出流,并产生结果。
- Connector API:执行可重用的生产者和消费者API,可将Topic链接到现有应用程序。
Kafka存储的消息来自任意多被称为“生产者”(Producer)的进程。数据从而可以被分配到不同的“分区”(Partition)、不同的“Topic”下。在一个分区内,这些消息被索引并连同时间戳存储在一起。其它被称为“消费者”(Consumer)的进程可以从分区查询消息。Kafka运行在一个由一台或多台服务器组成的集群上,并且分区可以跨集群结点分布。
四、kafka安装步骤
1、解压缩kafka安装文件到指定安装目录下
tar -xvzf /home/app/kafka_2.11-1.0.0.tgz -C /usr/local/
2、进入kafka安装目录修改config目录下的server.properties文件配置
cd /usr/local/kafka_2.11-1.0.0
sed 's/zookeeper.connect=localhost:2181/zookeeper.connect=localhost:12181/g' -i config/server.properties
vi config/server.properties
listeners=PLAINTEXT://:19092
kafka默认监听端口为9092,根据项目要求需要手工修改为19092,kafka需要zookeeper配合,由于前面的zookeeper监听端口修改为12181,所以也需要把kafka配置文件中zookeeper相关端口修改为12181。
3、修改kafka最大日志留存时间为48小时,分区最大留存大小为2G
sed 's/log.retention.hours=168/log.retention.hours=48/g' -i config/server.properties
sed 's/#log.retention.bytes=1073741824/log.retention.bytes=2147483648/g' -i config/server.properties
4、启动kafka服务器
bin/kafka-server-start.sh config/server.properties &
5、验证kafka启动端口
jps -V && netstat -ntlp | grep 19092
发现kafka启动的进程号一致即可证明kafka启动监听端口为19092
6、创建消息主题audit,设置2个分区
bin/kafka-topics.sh --create --zookeeper localhost:12181 --replication-factor 1 --partitions 2 --topic audit
Created topic "audit".
[2019-08-07 21:59:37,043] INFO [ReplicaFetcherManager on broker 0] Removed fetcher for partitions audit-1,audit-0 (kafka.server.ReplicaFetcherManager)
[2019-08-07 21:59:37,116] INFO Loading producer state from offset 0 for partition audit-1 with message format version 2 (kafka.log.Log)
[2019-08-07 21:59:37,128] INFO Completed load of log audit-1 with 1 log segments, log start offset 0 and log end offset 0 in 40 ms (kafka.log.Log)
[2019-08-07 21:59:37,133] INFO Created log for partition [audit,1] in /tmp/kafka-logs with properties {compression.type -> producer, message.format.version -> 1.0-IV0, file.delete.delay.ms -> 60000, max.message.bytes -> 1000012, min.compaction.lag.ms -> 0, message.timestamp.type -> CreateTime, min.insync.replicas -> 1, segment.jitter.ms -> 0, preallocate -> false, min.cleanable.dirty.ratio -> 0.5, index.interval.bytes -> 4096, unclean.leader.election.enable -> false, retention.bytes -> 2147483648, delete.retention.ms -> 86400000, cleanup.policy -> [delete], flush.ms -> 9223372036854775807, segment.ms -> 604800000, segment.bytes -> 1073741824, retention.ms -> 172800000, message.timestamp.difference.max.ms -> 9223372036854775807, segment.index.bytes -> 10485760, flush.messages -> 9223372036854775807}. (kafka.log.LogManager)
[2019-08-07 21:59:37,134] INFO [Partition audit-1 broker=0] No checkpointed highwatermark is found for partition audit-1 (kafka.cluster.Partition)
[2019-08-07 21:59:37,138] INFO Replica loaded for partition audit-1 with initial high watermark 0 (kafka.cluster.Replica)
[2019-08-07 21:59:37,140] INFO [Partition audit-1 broker=0] audit-1 starts at Leader Epoch 0 from offset 0. Previous Leader Epoch was: -1 (kafka.cluster.Partition)
[2019-08-07 21:59:37,159] INFO Loading producer state from offset 0 for partition audit-0 with message format version 2 (kafka.log.Log)
[2019-08-07 21:59:37,160] INFO Completed load of log audit-0 with 1 log segments, log start offset 0 and log end offset 0 in 3 ms (kafka.log.Log)
[2019-08-07 21:59:37,162] INFO Created log for partition [audit,0] in /tmp/kafka-logs with properties {compression.type -> producer, message.format.version -> 1.0-IV0, file.delete.delay.ms -> 60000, max.message.bytes -> 1000012, min.compaction.lag.ms -> 0, message.timestamp.type -> CreateTime, min.insync.replicas -> 1, segment.jitter.ms -> 0, preallocate -> false, min.cleanable.dirty.ratio -> 0.5, index.interval.bytes -> 4096, unclean.leader.election.enable -> false, retention.bytes -> 2147483648, delete.retention.ms -> 86400000, cleanup.policy -> [delete], flush.ms -> 9223372036854775807, segment.ms -> 604800000, segment.bytes -> 1073741824, retention.ms -> 172800000, message.timestamp.difference.max.ms -> 9223372036854775807, segment.index.bytes -> 10485760, flush.messages -> 9223372036854775807}. (kafka.log.LogManager)
[2019-08-07 21:59:37,162] INFO [Partition audit-0 broker=0] No checkpointed highwatermark is found for partition audit-0 (kafka.cluster.Partition)
[2019-08-07 21:59:37,162] INFO Replica loaded for partition audit-0 with initial high watermark 0 (kafka.cluster.Replica)
[2019-08-07 21:59:37,162] INFO [Partition audit-0 broker=0] audit-0 starts at Leader Epoch 0 from offset 0. Previous Leader Epoch was: -1 (kafka.cluster.Partition)
7、显示消息主题audit的详情,验证分区是否设置为2
bin/kafka-topics.sh --describe --zookeeper localhost:12181
这是输出的解释。第一行给出了所有分区的摘要,每个附加行提供有关一个分区的信息。由于此主题只有两个分区,因此有两行。
- “leader”是负责给定分区的所有读写的节点。每个节点将成为随机选择的分区部分的领导者。
- “replicas”是复制此分区日志的节点列表,无论它们是否为领导者,或者即使它们当前处于活动状态。
- “isr”是“同步”复制品的集合。这是副本列表的子集,该列表当前处于活跃状态并且已经被领导者捕获。
8、通过kafka消息生产者产生消息,启动消费者接收消息
生产者产生消息:
bin/kafka-console-producer.sh --broker-list localhost:19092 --topic audit
>this is a message
>hello world kafka!
消费者接收消息:
bin/kafka-console-consumer.sh --bootstrap-server localhost:19092 --topic audit --from-beginning
hello world kafka!
this is a message