kafka总结

kafka总结(新手)

基本概念

通信: 各组件通过TCP进行通信,确保集群中的各台机器相互连通。

Topic: 主题,每条发布到kafka集群的消息属于的类别,即kafka是面向topic的。

Broker: kafka的服务器,每部署一台kafka就是一个broker。

Producer & Consumer: 生产者和消费者。一般消息系统都有生产者和消费者的概念。生产者产生消息,即把消息放入Topic中,而消费者则从Topic中获取消息处理。一个生产者可以向多个Topic发送消息,一个消费者也可以同时从几个Topic接收消息。同样的,一个Topic也可以被多个消费者来接收消息。

Offset: 偏移量,消息在各自partition中唯一的ID

Partition: 分区,或者说分组。分组是Kafka提升吞吐量的一个关键设计。这样可以让消费者多线程并行接收消息。创建Topic时可指定Parition数量。一个Topic可以分为多个Partition,也可以只有一个Partition。每一个Partition是一个有序的,不可变的消息序列。每一个消息在各自的Partition中有唯一的ID。这些ID是有序的。称之为offset,offset在不同的Partition中是可以重复的,但是在一个Partition中是不可能重复的。越大的offset的消息是最新的。Kafka只保证在每个Partition中的消息是有序的,就会带来一个问题,即如果一个Consumer在不同的Partition中获取消息,那么消息的顺序也许是和Producer发送到Kafka中的消息的顺序是不一致的。kafka 分配的单位是 partition。

Consumer group: 每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。如果Consume的线程个数大于partition的个数,则会出现消费者空闲的情况。

replica: 副本,partition 的副本,保障 partition 的高可用。

leader & follower: 在一个集群中,只有一个leader,可以有多个follower。

Zookeeper: Kafka的运行依赖于Zookeeper。Topic、Consumer、Patition、Broker等注册信息都存储在ZooKeeper中。

特性

高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒

可扩展性:kafka集群支持热扩展

持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失

容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)

高并发:支持数千个客户端同时读写

设计思想

consumegroup:消费者可以组成一个组,每条消息只能够被同组的一个消费者消费,如果一条消息想被多个消费者消费的话,消费者必须在不同的组中。

消息状态:在kafka中,消息的状态保存在消费者中,broker不关心消息被哪个消费者消费了,只会记录offset的值。

消息持久化:Kafka中会把消息持久化到本地文件系统中,并且保持极高的效率。

消息有效期:Kafka会长久保留其中的消息,以便consumer可以多次消费,当然其中很多细节是可配置的。

批量发送:Kafka支持以消息集合为单位进行批量发送,以提高push效率。

push-and-pull :Kafka中的Producer和consumer采用的是push-and-pull模式,即Producer只管向broker push消息,consumer只管从broker pull消息,两者对消息的生产和消费是异步的。

Kafka集群中broker之间的关系:是主从关系,各个broker在集群中地位一样,我们可以随意的增加或删除任何一个broker节点。

负载均衡方面: Kafka提供了一个 metadata API来管理broker之间的负载(对Kafka0.8.x而言,对于0.7.x主要靠zookeeper来实现负载均衡)。

同步异步:Producer采用异步push方式,极大提高Kafka系统的吞吐率(可以通过参数控制是采用同步还是异步方式)。

分区机制partition:Kafka的broker端支持消息分区,Producer可以决定把消息发到哪个分区,在一个分区中消息的顺序就是Producer发送消息的顺序,一个主题中可以有多个分区,具体分区的数量是可配置的。分区的意义很重大,后面的内容会逐渐体现。

离线数据装载:Kafka由于对可拓展的数据持久化的支持,它也非常适合向Hadoop或者数据仓库中进行数据装载。

插件支持:现在不少活跃的社区已经开发出不少插件来拓展Kafka的功能,如用来配合Storm、Hadoop、flume相关的插件。

架构组件

Kafka中发布订阅的对象是topic。我们可以为每类数据创建一个topic,把向topic发布消息的客户端称作producer,从topic订阅消息的客户端称作consumer。Producers和consumers可以同时从多个topic读写数据。一个kafka集群由一个或多个broker服务器组成,它负责持久化和备份具体的kafka消息。

topic:消息存放的目录即主题

Producer:生产消息到topic的一方(发送消息的一方)

Consumer:订阅topic消费消息的一方(接收处理消息的一方)

Broker:Kafka的服务实例就是一个broker

Topic&Partition

消息发送时都被发送到一个topic,其本质就是一个目录,而topic由是由一些Partition Logs(分区日志)组成,其组织结构如下图所示:

每个partition中的消息都是有顺序的,每条消息都又自己的offset

Kafka集群会保存所有的消息,不管消息有没有被消费;
我们可以设定消息的过期时间,只有过期的数据才会被自动清除以释放磁盘空间。比如我们设置消息过期时间为2天,那么这2天内的所有消息都会被保存到集群中,数据只有超过了两天才会被清除。

Kafka需要维持的元数据只有一个–消费消息在Partition中的offset值,Consumer每消费一个消息,offset就会加1。其实消息的状态完全是由Consumer控制的,Consumer可以跟踪和重设这个offset值,这样的话Consumer就可以读取任意位置的消息。

把消息日志以Partition的形式存放有多重考虑,第一,方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;第二就是可以提高并发,因为可以以Partition为单位读写了。

zookeeper的作用

kafka将元数据信息保存到了zookeeper中,但是发送给topic的数据是不保存到zookeeper的。kafka使用zookeeper实现动态集群的扩展,不需要更改生产者和消费者的配置,broker会在zookeeper中注册并保持相关的元数据。其中记录着Topic/Partion与broker的映射关系:每一个Topic的每一个Partion,得知道其对应的broker列表是什么,其中leader是谁,follower是谁。

Zookeeper 主要用来跟踪Kafka 集群中的节点状态, 以及Kafka Topic, message 等等其他信息. 同时, Kafka 依赖于Zookeeper, 没有Zookeeper 是不能运行起来Kafka 的.

Controller 选举:

Controller 是一个特殊的Broker, 其负责所有Partition 的leader/follower 关系.

Zookeeper 负责从Broker 中选举出一个作为Controller, 并确保其唯一性. 同时, 当Controller 宕机时, 选举一个新的.

集群 membership:

记录集群中都有哪些活跃着的Broker.

Topic 配置:

有哪些Topic, Topic 都有哪些Partition, Replica 存放在哪里, Leader 是谁.

配额(0.9.0+):

记录每个客户能够读写的数据量.

ACLs(0.9.0+):

记录对Topic 的读写控制.

high-level consumer(已废弃):

记录consumer group 及其成员和offset 信息.

PS: 在运行过程中, 如果先关闭掉了Zookeeper, 然后再去关闭Kafka, 会发现Kafka 后台一直结束不掉, 这是因为Kafka 会被block 在与Zookeeper 的重连过程中. 解决方法是重启Zookeeper , 然后先关闭Kafka 再关闭Zookeeper.

zookeeper环境搭建

首先,确保安装了jdk

将下载的zookeeper解压
zookeeper下载地址

配置zoo.cfg文件,配置项及配置示例如下所示。

注:配置文件中的“=”符号后不要有空格

修改完成zoo.cfg文件后再dataDir配置的目录下创建myid文件,文件中只需写在server.XXX部分填写的XXX即可。myid文件中的内容和集群中其他机器填写的不能相同。
创建完成之后启动,验证。

如果启动出现

  • java.io.IOException:Connection reset by peer

    • 出现原因:配置文件中的maxClientCnxns设置过小。
    • 解决办法:将zookeeper中的maxClientCnxns数改大即可。
  • Exception in thread “main” Java.lang.NoSuchMethodError: method java.lang.management.ManagementFactory.getPlatformMBeanServer with signature ()Ljavax.management.MBeanServer; was not found.
    • 出现原因:java版本与使用的zookeeper版本不匹配。
    • 解决办法:修改jdk版本并确认jdk版本是否支持zookeeper。

zookeeper配置项详解

参数名参数说明
clientPort客户端连接server的端口,即对外服务端口,一般设置为2181吧
dataDir存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能。
tickTimeZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime。
dataLogDir事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能
globalOutstandingLimit最大请求堆积数。默认是1000。ZK运行的时候, 尽管server已经没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,以提高吞吐性能。当然,为了防止Server内存溢出,这个请求堆积数还是需要限制下的。
preAllocSize预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。
snapCount每进行snapCount次事务日志输出后,触发一次快照(snapshot), 此时,ZK会生成一个snapshot.*文件,同时创建一个新的事务日志文件log.*。默认是100000.(真正的代码实现中,会进行一定的随机数处理,以避免所有服务器在同一时间进行快照而影响性能)
traceFile用于记录所有请求的log,一般调试过程中可以使用,但是生产环境不建议使用,会严重影响性能。
maxClientCnxns单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。
clientPortAddress对于多网卡的机器,可以为每个IP指定不同的监听端口。默认情况是所有IP都监听 clientPort指定的端口。 New in 3.3.0
minSessionTimeoutmaxSessionTimeoutSession超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime 这个范围
fsync.warningthresholdms事务日志输出时,如果调用fsync方法超过指定的超时时间,那么会在日志中输出警告信息。默认是1000ms。
autopurge.purgeInterval在上文中已经提到,3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。
autopurge.snapRetainCount这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
initLimitFollower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许Follower在initLimit时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了。
syncLimit在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果Leader发出心跳包在syncLimit之后,还没有从Follower那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题。
leaderServes默认情况下,Leader是会接受客户端连接,并提供正常的读写服务。但是,如果你想让Leader专注于集群中机器的协调,那么可以将这个参数设置为no,这样一来,会大大提高写操作的性能。
server.x=[hostname]:nnnnn[:nnnnn]这里的x是一个数字,与myid文件中的id是一致的。右边可以配置两个端口,第一个端口用于Follower和Leader之间的数据同步和其它通信,第二个端口用于Leader选举过程中投票通信。
group.x=nnnnn[:nnnnn]weight.x=nnnnn对机器分组和权重设置
cnxTimeoutLeader选举过程中,打开一次连接的超时时间,默认是5s
skipACL对所有客户端请求都不作ACL检查。如果之前节点上设置有权限限制,一旦服务器上打开这个开头,那么也将失效。
forceSync这个参数确定了是否需要在事务日志提交的时候调用FileChannel.force来保证数据完全同步到磁盘。
jute.maxbuffer每个节点最大数据量,是默认是1M。这个限制必须在server和client端都进行设置才会生效。

zookeeper配置文件示例

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/opt/zookeeper-3.4.6/data

clientPort=2181

// maxClientCnxns=60

// autopurge.snapRetainCount=3

server.0=dbslave0:2888:3888

server.1=dbslave1:2888:3888

server.2=dbslave2:2888:3888

zookeeper常用命令

启动zookeeper:
bin/zookeeper-server-start.sh start

停止zookeeper:
bin/zookeeper-server-stop.sh

查看zookeeper日志:
tail -100f logs/zookeeper.out

测试zookeeper之间是否连通组成集群:
bin/zookeeper-server-start.sh status

kafka环境搭建

在进行kafka搭建前确认zookeeper已经搭建完成

  1. 修改环境变量,将kafka的路径添加到环境变量中。例如:

    修改环境变量

    vim ~/.bash_profile

    KAFKA_HOME=解压出的kafka目录

    export KAFKA_HOME

    添加KAFKA_HOME到PATH

    PATH=xxx:KAFKA_HOME/bin(注:xxx为之前PATH中有的内容,只需在后边追加KAFKA_HOME/bin即可)

    保存环境变量

    source ~/.bash_profile
  2. 修改解压出的kafka的conf目录下的server.properties 示例配置文件:

    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    # 
    #    http://www.apache.org/licenses/LICENSE-2.0
    # 
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    # see kafka.server.KafkaConfig for additional details and defaults
    ############################# Server Basics #############################
    # The id of the broker. This must be set to a unique integer for each broker.
    broker.id=0
    ############################# Socket Server Settings #############################
    # The port the socket server listens on
    port=9092
    # Hostname the broker will bind to. If not set, the server will bind to all interfaces
    #host.name=localhost
    host.name=192.168.40.50
    # Hostname the broker will advertise to producers and consumers. If not set, it uses the
    # value for "host.name" if configured.  Otherwise, it will use the value returned from
    # java.net.InetAddress.getCanonicalHostName().
    #advertised.host.name=<hostname routable by clients>
    # The port to publish to ZooKeeper for clients to use. If this is not set,
    # it will publish the same port that the broker binds to.
    #advertised.port=<port accessible by clients>
    # The number of threads handling network requests
    num.network.threads=3
    # The number of threads doing disk I/O
    num.io.threads=8
    # The send buffer (SO_SNDBUF) used by the socket server
    socket.send.buffer.bytes=102400
    # The receive buffer (SO_RCVBUF) used by the socket server
    socket.receive.buffer.bytes=102400
    # The maximum size of a request that the socket server will accept (protection against OOM)
    socket.request.max.bytes=104857600
    ############################# Log Basics #############################
    # A comma seperated list of directories under which to store log files
    log.dirs=/home/kafka/kafka/logs/kafka-logs
    # The default number of log partitions per topic. More partitions allow greater
    # parallelism for consumption, but this will also result in more files across
    # the brokers.
    num.partitions=5
    # The number of threads per data directory to be used for log recovery at startup and flushing at shutdown.
    # This value is recommended to be increased for installations with data dirs located in RAID array.
    num.recovery.threads.per.data.dir=2
    ############################# Log Flush Policy #############################
    # Messages are immediately written to the filesystem but by default we only fsync() to sync
    # the OS cache lazily. The following configurations control the flush of data to disk. 
    # There are a few important trade-offs here:
    #    1. Durability: Unflushed data may be lost if you are not using replication.
    #    2. Latency: Very large flush intervals may lead to latency spikes when the flush does occur as there will be a lot of data to flush.
    #    3. Throughput: The flush is generally the most expensive operation, and a small flush interval may lead to exceessive seeks. 
    # The settings below allow one to configure the flush policy to flush data after a period of time or
    # every N messages (or both). This can be done globally and overridden on a per-topic basis.
    # The number of messages to accept before forcing a flush of data to disk
    #log.flush.interval.messages=10000
    # The maximum amount of time a message can sit in a log before we force a flush
    #log.flush.interval.ms=1000
    ############################# Log Retention Policy #############################
    # The following configurations control the disposal of log segments. The policy can
    # be set to delete segments after a period of time, or after a given size has accumulated.
    # A segment will be deleted whenever *either* of these criteria are met. Deletion always happens
    # from the end of the log.
    # The minimum age of a log file to be eligible for deletion
    log.retention.hours=168
    # A size-based retention policy for logs. Segments are pruned from the log as long as the remaining
    # segments don't drop below log.retention.bytes.
    #log.retention.bytes=1073741824
    # The maximum size of a log segment file. When this size is reached a new log segment will be created.
    log.segment.bytes=1073741824
    # The interval at which log segments are checked to see if they can be deleted according 
    # to the retention policies
    log.retention.check.interval.ms=300000
    # By default the log cleaner is disabled and the log retention policy will default to just delete segments after their retention expires.
    # If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction.
    log.cleaner.enable=false
    ############################# Zookeeper #############################
    # Zookeeper connection string (see zookeeper docs for details).
    # This is a comma separated host:port pairs, each corresponding to a zk
    # server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
    # You can also append an optional chroot string to the urls to specify the
    # root directory for all kafka znodes.
    zookeeper.connect=192.168.40.50:2181
    # Timeout in ms for connecting to zookeeper
    zookeeper.connection.timeout.ms=6000
    

kafka配置项详解

参数名参数说明
broker.id每个broker都可以用一个唯一的非负整数id进行标识;这个id可以作为broker的“名字”,并且它的存在使得broker无须混淆consumers就可以迁移到不同的host/port上。你可以选择任意你喜欢的数字作为id,只要id是唯一的即可。
log.dirskafka存放数据的路径。这个路径并不是唯一的,可以是多个,路径之间只需要使用逗号分隔即可;每当创建新partition时,都会选择在包含最少partitions的路径下进行。
portserver接受客户端连接的端口(默认是6667,可以修改为9092)
zookeeper.connectZooKeeper连接字符串的格式为:hostname:port,此处hostname和port分别是ZooKeeper集群中某个节点的host和port;为了当某个host宕掉之后你能通过其他ZooKeeper节点进行连接,你可以按照一下方式制定多个hosts:hostname1:port1, hostname2:port2, hostname3:port3.
message.max.bytesserver可以接收的消息最大尺寸。重要的是,consumer和producer有关这个属性的设置必须同步,否则producer发布的消息对consumer来说太大。
num.io.threadsserver用来处理请求的I/O线程的数目;这个线程数目至少要等于硬盘的个数。
background.threads用于后台处理的线程数目,例如文件删除;你不需要更改这个属性。
queued.max.requests在网络线程停止读取新请求之前,可以排队等待I/O线程处理的最大请求个数。
host.namebroker的hostname;如果hostname已经设置的话,broker将只会绑定到这个地址上;如果没有设置,它将绑定到所有接口,并发布一份到ZK
advertised.host.name如果设置,则就作为broker 的hostname发往producer、consumers以及其他brokers
advertised.port此端口将给与producers、consumers、以及其他brokers,它会在建立连接时用到; 它仅在实际端口和server需要绑定的端口不一样时才需要设置。
socket.send.buffer.bytesSO_SNDBUFF 缓存大小,server进行socket 连接所用
socket.receive.buffer.bytesSO_RCVBUFF缓存大小,server进行socket连接时所用
socket.request.max.bytesserver允许的最大请求尺寸; 这将避免server溢出,它应该小于Java heap size
num.partitions如果创建topic时没有给出划分partitions个数,这个数字将是topic下partitions数目的默认数值。(默认是1)
log.segment.bytestopic partition的日志存放在某个目录下诸多文件中,这些文件将partition的日志切分成一段一段的;这个属性就是每个文件的最大尺寸;当尺寸达到这个数值时,就会创建新文件。此设置可以由每个topic基础设置时进行覆盖。
log.roll.hours即使文件没有到达log.segment.bytes,只要文件创建时间到达此属性,就会创建新文件。这个设置也可以有topic层面的设置进行覆盖;
log.retention.minutes和log.retention.hours每个日志文件删除之前保存的时间。默认数据保存时间对所有topic都一样。log.retention.minutes 和 log.retention.bytes 都是用来设置删除日志文件的,无论哪个属性已经溢出。这个属性设置可以在topic基本设置时进行覆盖。
log.retention.bytes每个topic下每个partition保存数据的总量;注意,这是每个partitions的上限,因此这个数值乘以partitions的个数就是每个topic保存的数据总量。同时注意:如果log.retention.hours和log.retention.bytes都设置了,则超过了任何一个限制都会造成删除一个段文件。注意,这项设置可以由每个topic设置时进行覆盖
log.retention.check.interval.ms检查日志分段文件的间隔时间,以确定是否文件属性是否到达删除要求。
log.cleaner.enable当这个属性设置为false时,一旦日志的保存时间或者大小达到上限时,就会被删除;如果设置为true,则当保存属性达到上限时,就会进行log compaction。
log.cleaner.threads进行日志压缩的线程数
log.cleaner.io.max.bytes.per.second进行log compaction时,log cleaner可以拥有的最大I/O数目。这项设置限制了cleaner,以避免干扰活动的请求服务。
log.cleaner.io.buffer.sizelog cleaner清除过程中针对日志进行索引化以及精简化所用到的缓存大小。最好设置大点,以提供充足的内存。
log.cleaner.io.buffer.load.factor进行log cleaning时所需要的I/O chunk尺寸。你不需要更改这项设置。
log.cleaner.io.buffer.load.factorlog cleaning中所使用的hash表的负载因子;你不需要更改这个选项。
log.cleaner.backoff.ms进行日志是否清理检查的时间间隔
log.cleaner.min.cleanable.ratio这项配置控制log compactor试图清理日志的频率(假定log compaction是打开的)。默认避免清理压缩超过50%的日志。这个比率绑定了备份日志所消耗的最大空间(50%的日志备份时压缩率为50%)。更高的比率则意味着浪费消耗更少,也就可以更有效的清理更多的空间。这项设置在每个topic设置中可以覆盖。
log.cleaner.delete.retention.ms保存时间;保存压缩日志的最长时间;也是客户端消费消息的最长时间,荣log.retention.minutes的区别在于一个控制未压缩数据,一个控制压缩后的数据;会被topic创建时的指定时间覆盖。
log.index.size.max.bytes每个log segment的最大尺寸。注意,如果log尺寸达到这个数值,即使尺寸没有超过log.segment.bytes限制,也需要产生新的log segment。
log.index.interval.bytes当执行一次fetch后,需要一定的空间扫描最近的offset,设置的越大越好,一般使用默认值就可以
log.flush.interval.messages log文件“sync”到磁盘之前累积的消息条数。因为磁盘IO操作是一个慢操作,但又是一个“数据可靠性”的必要手段,所以检查是否需要固化到硬盘的时间间隔。需要在“数据可靠性”与“性能”之间做必要的权衡,如果此值过大,将会导致每次“发sync”的时间过长(IO阻塞),如果此值过小,将会导致“fsync”的时间较长(IO阻塞),如果此值过小,将会导致”发sync“的次数较多,这也就意味着整体的client请求有一定的延迟,物理server故障,将会导致没有fsync的消息丢失。
log.flush.scheduler.interval.ms检查是否需要fsync的时间间隔
log.flush.interval.ms仅仅通过interval来控制消息的磁盘写入时机,是不足的,这个数用来控制”fsync“的时间间隔,如果消息量始终没有达到固化到磁盘的消息数,但是离上次磁盘同步的时间间隔达到阈值,也将触发磁盘同步。
log.delete.delay.ms文件在索引中清除后的保留时间,一般不需要修改
auto.create.topics.enable是否允许自动创建topic。如果是真的,则produce或者fetch 不存在的topic时,会自动创建这个topic。否则需要使用命令行创建topic
controller.socket.timeout.mspartition管理控制器进行备份时,socket的超时时间。
controller.message.queue.sizecontroller-to-broker-channles的buffer 尺寸
default.replication.factor默认备份份数,仅指自动创建的topics,手动创建topic时会指定备份的数量
replica.lag.time.max.ms如果一个follower在这个时间内没有发送fetch请求,leader将从ISR重移除这个follower,并认为这个follower已经挂了
replica.lag.max.messages如果一个replica没有备份的条数超过这个数值,则leader将移除这个follower,并认为这个follower已经挂了
replica.socket.timeout.msleader 备份数据时的socket网络请求的超时时间
replica.socket.receive.buffer.bytes备份时向leader发送网络请求时的socket receive buffer
replica.fetch.max.bytes备份时每次fetch的最大值
replica.fetch.min.bytesleader发出备份请求时,数据到达leader的最长等待时间
replica.fetch.min.bytes备份时每次fetch之后回应的最小尺寸
num.replica.fetchers从leader备份数据的线程数(默认1)
replica.high.watermark.checkpoint.interval.ms每个replica检查是否将最高水位进行固化的频率(默认5000ms)
fetch.purgatory.purge.interval.requestsfetch 请求清除时的清除间隔(默认1000ms)
producer.purgatory.purge.interval.requestsproducer请求清除时的清除间隔(默认1000ms)
zookeeper.session.timeout.mszookeeper会话超时时间。(默认6000ms)
zookeeper.connection.timeout.ms客户端等待和zookeeper建立连接的最大时间(默认6000ms)
zookeeper.sync.time.mszk follower落后于zk leader的最长时间(默认2000ms)
controlled.shutdown.enable是否能够控制broker的关闭。如果能够,broker将可以移动所有leaders到其他的broker上,在关闭之前。这减少了不可用性在关机过程中。(默认true)
controlled.shutdown.max.retries在执行不彻底的关机之前,可以成功执行关机的命令数。(默认3)
controlled.shutdown.retry.backoff.ms在关机之间的backoff时间(默认5000ms)
auto.leader.rebalance.enable如果这是true,控制者将会自动平衡brokers对于partitions的leadership(默认true)
leader.imbalance.per.broker.percentage每个broker所允许的leader最大不平衡比率(默认10)
leader.imbalance.check.interval.seconds检查leader不平衡的频率(默认300)
offset.metadata.max.bytes允许客户端保存他们offsets的最大个数(默认4096)
max.connections.per.ip每个ip地址上每个broker可以被连接的最大数目
max.connections.per.ip.overrides每个ip或者hostname默认的连接的最大覆盖
connections.max.idle.ms空连接的超时限制(默认60000)
log.roll.jitter.{ms,hours}从logRollTimeMillis抽离的jitter最大数目(默认0)
num.recovery.threads.per.data.dir每个数据目录用来日志恢复的线程数目(默认1)
unclean.leader.election.enable指明了是否能够使不在ISR中replicas设置用来作为leader(默认true)
delete.topic.enable能够删除topic(默认false)
offsets.topic.num.partitions分片提交到topic的偏移量,由于改变后的部署是目前不支持,我们建议使用较高的设定生产(默认50)
offsets.topic.retention.minutes存在时间超过这个时间限制的offsets都将被标记为待删除(默认1140)
offsets.retention.check.interval.msoffset管理器检查陈旧offsets的频率(默认600000)
offsets.topic.replication.factortopic的offset的备份份数。建议设置更高的数字保证更高的可用性(默认3)
offset.topic.segment.bytesoffsets topic的segment尺寸。(默认104857600)
offsets.load.buffer.size这项设置与批量尺寸相关,当从offsets segment中读取时使用。(默认5242880)
offsets.commit.required.acks在offset commit可以接受之前,需要设置确认的数目,一般不需要更改(默认-1)

kafka环境变量配置

环境变量:
修改环境变量
vim  ~/.bash_profile
KAFKA_HOME=解压出的kafka目录
export KAFKA_HOME
添加KAFKA_HOME到PATH
PATH=xxx:KAFKA_HOME/bin (注:xxx为之前PATH中有的内容,只需在后边追加KAFKA_HOME/bin即可)

保存环境变量
source ~/.bash_profile

kafka常用命令

启动kafka
./bin/kafka-server-start.sh -daemon config/server.properties
创建topic
(*先创建一个测试的topic,测试成功后再创建下边的topic)
kafka-topics.sh --create --zookeeper 10.32.164.235:2181,10.32.164.236:2181,10.32.164.238:2181 --replication-factor 1 --partitions 3 --topic TOPIC_UOSP_PERFORMANCE
(注:红色的部分数字是和部署的kafka机器数有关的,部署两台就将红色部分修改为2,以此类推。
蓝色部分是zookeeper的地址,配置几台zookeeper就写几个,端口号默认使用2181)
查看创建的topic
kafka-topics.sh --list --zookeeper localhost:2181(注:localhost部分是要查看topic的zookeeper地址,如果部署多台,地址填多个,用英文逗号分隔)

kafka配置文件示例

    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    # 
    #    http://www.apache.org/licenses/LICENSE-2.0
    # 
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    # see kafka.server.KafkaConfig for additional details and defaults

    ############################# Server Basics #############################

    # The id of the broker. This must be set to a unique integer for each broker.
    broker.id=0

    ############################# Socket Server Settings #############################

    # The port the socket server listens on
    port=9092

    # Hostname the broker will bind to. If not set, the server will bind to all interfaces
    #host.name=localhost
    host.name=192.168.40.50

    # Hostname the broker will advertise to producers and consumers. If not set, it uses the
    # value for "host.name" if configured.  Otherwise, it will use the value returned from
    # java.net.InetAddress.getCanonicalHostName().
    #advertised.host.name=<hostname routable by clients>

    # The port to publish to ZooKeeper for clients to use. If this is not set,
    # it will publish the same port that the broker binds to.
    #advertised.port=<port accessible by clients>

    # The number of threads handling network requests
    num.network.threads=3

    # The number of threads doing disk I/O
    num.io.threads=8

    # The send buffer (SO_SNDBUF) used by the socket server
    socket.send.buffer.bytes=102400

    # The receive buffer (SO_RCVBUF) used by the socket server
    socket.receive.buffer.bytes=102400

    # The maximum size of a request that the socket server will accept (protection against OOM)
    socket.request.max.bytes=104857600


    ############################# Log Basics #############################

    # A comma seperated list of directories under which to store log files
    log.dirs=/home/kafka/kafka/logs/kafka-logs

    # The default number of log partitions per topic. More partitions allow greater
    # parallelism for consumption, but this will also result in more files across
    # the brokers.
    num.partitions=5

    # The number of threads per data directory to be used for log recovery at startup and flushing at shutdown.
    # This value is recommended to be increased for installations with data dirs located in RAID array.
    num.recovery.threads.per.data.dir=2

    ############################# Log Flush Policy #############################

    # Messages are immediately written to the filesystem but by default we only fsync() to sync
    # the OS cache lazily. The following configurations control the flush of data to disk. 
    # There are a few important trade-offs here:
    #    1. Durability: Unflushed data may be lost if you are not using replication.
    #    2. Latency: Very large flush intervals may lead to latency spikes when the flush does occur as there will be a lot of data to flush.
    #    3. Throughput: The flush is generally the most expensive operation, and a small flush interval may lead to exceessive seeks. 
    # The settings below allow one to configure the flush policy to flush data after a period of time or
    # every N messages (or both). This can be done globally and overridden on a per-topic basis.

    # The number of messages to accept before forcing a flush of data to disk
    #log.flush.interval.messages=10000

    # The maximum amount of time a message can sit in a log before we force a flush
    #log.flush.interval.ms=1000

    ############################# Log Retention Policy #############################

    # The following configurations control the disposal of log segments. The policy can
    # be set to delete segments after a period of time, or after a given size has accumulated.
    # A segment will be deleted whenever *either* of these criteria are met. Deletion always happens
    # from the end of the log.

    # The minimum age of a log file to be eligible for deletion
    log.retention.hours=168

    # A size-based retention policy for logs. Segments are pruned from the log as long as the remaining
    # segments don't drop below log.retention.bytes.
    #log.retention.bytes=1073741824

    # The maximum size of a log segment file. When this size is reached a new log segment will be created.
    log.segment.bytes=1073741824

    # The interval at which log segments are checked to see if they can be deleted according 
    # to the retention policies
    log.retention.check.interval.ms=300000

    # By default the log cleaner is disabled and the log retention policy will default to just delete segments after their retention expires.
    # If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction.
    log.cleaner.enable=false

    ############################# Zookeeper #############################

    # Zookeeper connection string (see zookeeper docs for details).
    # This is a comma separated host:port pairs, each corresponding to a zk
    # server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
    # You can also append an optional chroot string to the urls to specify the
    # root directory for all kafka znodes.
    zookeeper.connect=192.168.40.50:2181

    # Timeout in ms for connecting to zookeeper
    zookeeper.connection.timeout.ms=6000

更多kafka相关学习知识在http://orchome.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值