磁盘重认识

当需要从磁盘读取数据时,要确定读的数据在哪个磁道,哪个扇区:

  • 首先必须找到柱面,即磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间;

  • 然后目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间;

一次访盘请求(读/写)完成过程由三个动作组成

  • 寻道(时间):磁头移动定位到指定磁道;
  • 旋转延迟(时间):等待指定扇区从磁头下旋转经过;
  • 数据传输(时间):数据在磁盘、内存与网络之间的实际传输

由于存储介质的特性,磁盘本身存取就比主存慢,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分之一甚至几千分支一

怎么样才能提高磁盘的读写效率呢?

根据数据的局部性原理 ,有以下两种方法

  • 预读或者提前读;
  • 合并写——多个逻辑上的写操作合并成一个大的物理写操作中;

即采用磁盘顺序读写(不需要寻道时间,只需很少的旋转时间)。实验结果:在一个6 7200rpm SATA RAID-5 的磁盘阵列上线性写的速度大概是300M/秒,但是随机写的速度只有50K/秒,两者相差将近10000倍。

RAID说明:

好处:能够将多块小磁盘合并为一块大磁盘,并且RAID-5允许一块磁盘挂掉,RAID-6允许2块磁盘挂掉

弊端:多块小磁盘的同时并发读写的效率远大于RAID单块大磁盘的读写效率

Kafka消息的写入原理

一般的将数据从文件传到套接字的路径:

  • 操作系统将数据从磁盘读到内核空间的页缓存中;
  • 应用将数据从内核空间读到用户空间的缓存中;
  • 应用将数据写回内存空间的套接字缓存中
  • 操作系统将数据从套接字缓存写到网卡缓存中,以便将数据经网络发出;

这样做明显是低效的,这里有四次拷贝,两次系统调用。如果使用sendfile(Java 为: FileChannel.transferTo   api),两次拷贝可以被避免:允许操作系统将数据直接从页缓存发送到网络上。优化后,只有最后一步将数据拷贝到网卡缓存中是需要的

Kafka
topic信息

[root@localhost zhangwx]# kafka-topics.sh --describe --zookeeper localhost:12181 --topic test
Topic:test  PartitionCount:1    ReplicationFactor:1 Configs:Topic: test Partition: 0    Leader: 1   Replicas: 1 Isr: 1

说明:

PartitionCount:1 //表示分区数量为1
ReplicationFactor:3 //表示每个分区的副本数为3
Configs:Topic: my-replicated-topic  Partition: 0    //表示一个分区的分区编号为0
Leader: 0   //表示分区leader为broker0级 即第一台机器
Replicas: 2,0,1 //表示副本所在的机器为broker2,broker0,broker1三台机器上
Isr: 0,1,2 //处于同步中的broker,假设leader为broker0挂掉了,那么可以从isr中选举出其它机器作为leader

Kafka消息删除原理

从最久的日志段开始删除(按日志段为单位进行删除),然后逐步向前推进,直到某个日志段不满足条件为止,删除条件(日志段表示一个个的.log日志文件)

  • 满足给定条件predicate(配置项log.retention.{ms,minutes,hours}和log.retention.bytes指定);
  • 不能是当前激活日志段;(激活日志段表示正在操作的日志)
  • 大小不能小于日志段的最小大小(配置项log.segment.bytes配置)
  • 要删除的是否是所有日志段,如果是的话直接调用roll方法进行切分,因为Kafka至少要保留一个日志段;

Kafka消息检索原理

Kafka消息segment
file组成和物理结构

以读取offset=368776的message为例,需要通过下面2个步骤查找:

  • 第一步查找segment file;

以上图为例,其中00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0.第二个文件00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1。只要根据offset二分查找文件列表,就可以快速定位到具体文件。当offset=368776时定位到00000000000000368769.index|log

  • 第二步通过segment file查找message;

算出368776-368770=6,取00000000000000368769.index文件第三项(6,1407),得出从00000000000000368769.log文件头偏移1407字节读取一条消息即可

Kafka集群维护

集群信息实时查看(topic工具):

列出集群当前所有可用的topic:

bin/kafka-topics.sh –list –zookeeper   zookeeper_address

查看集群特定topic 信息:

bin/kafka-topics.sh –describe –zookeeper zookeeper_address

–topic topic_name

集群信息实时修改(topic工具):

创建topic:

bin/kafka-topics.sh –create –zookeeper zookeeper_address    –replication-factor 1 –partitions 1 –topic topic_name

增加(不能减少) partition(最后的4是增加后的值):

(注:一般来说当数据量逐渐增多时,我们需要提高该topic的并发度,就可以通过增加partition的数量来提高)

bin/kafka-topics.sh –zookeeper zookeeper_address    –alter –topic topic_name     –partitions 4

Topic-level configuration 配置都能修改

Kafka集群leader平衡机制

每个partitiion的所有replicas叫做“assigned replicas”,“assigned replicas”中的第一个replicas叫“preferred replica”,刚创建的topic一般“preferred replica”是leader。下图中Partition 0的broker  2就是preferred replica”,默认会成为该分区的leader。

集群leader平衡:

bin/kafka-preferred-replica-election.sh –zookeeper zookeeper_address

auto.leader.rebalance.enable=true

集群分区日志迁移:

迁移topic数据到其他broker,请遵循下面四步:

写json文件,文件格式如下:

cat topics-to-move.json{"topics": [{"topic": "foo1"},{"topic": "foo2"}],"version":1}

使用–generate生成迁移计划(下面的操作是将topic: foo1和foo2移动到broker 5,6):

bin/kafka-reassign-partitions.sh –zookeeper localhost:2181
–topics-to-move-json-file topics-to-move.json –broker-list “5,6” –generate

这一步只是生成计划,并没有执行数据迁移;

使用–execute执行计划:

bin/kafka-reassign-partitions.sh –zookeeper localhost:2181
–reassignment-json-file expand-cluster-reassignment.json –execute

执行前最好保存当前的分配情况,以防出错回滚使用–verify验证是否已经迁移完成

迁移某个topic的某些特定的partition数据到其他broker,步骤与上面一样,但是json文件如下面所示:

cat custom-reassignment.json

{“version”:1,”partitions”:[{“topic”:”foo1″,”partition”:0,”replicas”:[5,6]},{“topic”:”foo2″,”partition”:1,”replicas”:[2,3]}]}

可以指定到topic的分区编号

kafka-reassign-partitions.sh工具会复制磁盘上的日志文件,只有当完全复制完成,才会删除迁移前磁盘上的日志文件。执行分区日志迁移需要注意:

kafka-reassign-partitions.sh 工具的粒度只能到broker,不能到broker的目录(如果broker上面配置了多个目录,是按照磁盘上面已驻留的分区数来均匀分配的),所以,如果topic之间的数据,或者topic的partition之间的数据本身就不均匀,很有可能造成磁盘数据的不均匀:

对于分区数据较多的分区迁移数据会花大量的时间,所以建议在topic数据量较少或磁盘有效数据较少的情况下执行数据迁移操作;

进行分区迁移时最好先保留一个分区在原来的磁盘,这样不会影响正常的消费和生产,如果目的是将分区5(brober1,5)迁移到borker2,3。可以先将5迁移到2,1,最后再迁移到2,3。而不是一次将1,5迁移到2,3。因为一次迁移所有的副本,无法正常消费和生产,部分迁移则可以正常消费和生产

Kafka集群监控

Kafka
Offset Minotor介绍

(只能监控单一集群,且不能进行相关操作,只能查看集群基本信息,安装过程需要翻墙,安装好后通过机器:端口即可访问)

在生产环境需要集群高可用,所以需要对Kafka集群进行监控。Kafka Offset Monitor可以监控Kafka集群以下几项:

  • Kafka集群当前存活的broker集合;
  • Kafka集群当前活动topic集合;
  • 消费者组列表
  • Kafka集群当前consumer按组消费的offset lag数(即当前topic当前分区目前有多少消息积压而没有及时消费)

部署Kafka Offset Minotor:

github下载jar包KafkaOffsetMonitor-assembly-0.2.0.jar :

https://github.com/quantifind/KafkaOffsetMonitor/releases

启动Kafka Offset Minotor :

java -cp KafkaOffsetMonitor-assembly-0.2.0.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb –zk zk-01,zk-02 –refresh 5.minutes –retain 1.day &

Kafka Manager使用

(相对于Kafka Offset Minotor功能更强大,可以监控多集群且可以进行相关写操作)

Kafka Manager由雅虎开源,提供以下功能:

  • 管理几个不同的集群;
  • 容易地检查集群的状态(topics, brokers, 副本的分布, 分区的分布) ;
  • 选择副本
  • 基于集群的当前状态产生分区分配
  • 重新分配分区

Kafka Manager的安装,方法一(不但要求能上网,还要求能翻墙):

安装sbt:

http://www.scala-sbt.org/download.html

下载后,解压并配置环境变量(将SBT_HOME/bin配置到PATH变量中)

安装Kafka Manager :

git clone https://github.com/yahoo/kafka-manager

cd kafka-manager

sbt clean dist

部署Kafka Manager

修改conf/application.conf,把kafka-manager.zkhosts改为自己的zookeeper服务器地址

bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=8007 &

Kafka Manager的安装,方法二:

下载打包好的Kafka manager:

https://github.com/scootli/kafka-manager-1.0-SNAPSHOT/tree/master/kafka-manager-1.0-SNAPSHOT

下载后解压

修改conf/application.conf,把Kafka-manager.zkhosts改为自己的zookeeper服务器地址

bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=8007 &

Kafka消息处理与集群维护相关推荐

  1. 高效实用Kafka-Kafka集群维护(分区平衡机制、kafka分区日志迁移)

    导语   昨天的分享中,从微观的层面上了解了关于Kafka消息处理机制,但是当面对一个kafka集群的时候从宏观的角度上来说怎么保证kafka集群的高可用性呢?下面就来看看 文章目录 Kafka集群基 ...

  2. kafka高可用集群搭建

    ################################################################# 物理环境(两台机子组成的真实集群): Desktop一个zk节点 L ...

  3. Web基础配置篇(十四): Kafka单机、集群的安装配置及使用

    Web基础配置篇(十四): Kafka单机.集群的安装配置及使用 一.概述 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传 ...

  4. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(九)安装kafka_2.11-1.1.0

    如何搭建配置centos虚拟机请参考<Kafka:ZK+Kafka+Spark Streaming集群环境搭建(一)VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网.& ...

  5. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十一)NIFI1.7.1安装

    一.nifi基本配置 1. 修改各节点主机名,修改/etc/hosts文件内容. 192.168.0.120master192.168.0.121slave1192.168.0.122 slave2 ...

  6. Kafka单机、集群模式安装详解(二)

    本文环境如下: 操作系统:CentOS 6 32位 JDK版本:1.8.0_77 32位 Kafka版本:0.9.0.1(Scala 2.11) 接上篇 Kafka单机.集群模式安装详解(一) 6. ...

  7. kafka一键启动集群

    我的kafka的3个节点是这样的. 启动kafka集群脚本 #!/bin/bash echo "kafka cluster start" ssh Desktop "sou ...

  8. linux下kafka与zookeeper集群部署

    *********************************配置主机名,通过主机名连接机器********************************* 比如说,已经有了三台主机 1,在li ...

  9. kafka专题:kafka单机和集群安装详情,Spring Boot如何整合Kafka

    文章目录 1. kafka单机安装 1.1 server.properties核心配置 2. kafka集群安装 2.1 kafka集群可视化界面 3. springboot如何整合kafka 4. ...

最新文章

  1. OCP-052 053部分答案解析
  2. CSS笔记(十)position属性与定位
  3. 华润e万家联手神策数据 多维分析助力精益运营
  4. arthas使用示例:tt记录指定方法每次调用的入参和返回值
  5. ElasticSearch高可用集群环境搭建和分片原理
  6. .NET Core前后端分离快速开发框架(Core.3.1+AntdVue)
  7. 19.9. MySQL Router
  8. oracle和sql server中,取前10条数据语法的区别
  9. 全国计算机报名入口攀枝花学院,2017年攀枝花学院艺术类专业考试网上报名入口...
  10. Double 中的 NAN与INFINITY
  11. MSDEV.EXE 版本
  12. P5322 [BJOI2019]排兵布阵
  13. Oracle EBS 值层次结构查询SQL
  14. python十进制转八进制_Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)...
  15. JS与jQuery获取任意事件的子元素下标(获取当前类数组的某一子元素下标)
  16. ZZULIOJ:1125: 上三角矩阵的判断
  17. 001潜入大数据Hadoop框架的世界
  18. Linux内核异常调试工具与方法
  19. 大数据技术用哪些语言?
  20. js原生写时间日期选择

热门文章

  1. Android 百度地图之全局搜索周边搜索全国搜索城市路线规划(升级版附源码)
  2. iOS7 企业应用无法安装应用程序 因为证书无效的解决方案
  3. legend2---开发日志16
  4. 图像处理——图像变换
  5. Java并发编程-volatile关键字介绍
  6. Kotlin学习笔记(六) 伴生对象 对象表达式
  7. Java URL协议扩展实现
  8. 崩溃日志记录Landroid/support/v4/animation/AnimatorCompatHelper
  9. [NOIP2015] 子串
  10. 基于ZooKeeper的Dubbo注册中心【转】