第一节 Kafka 集群

如果你是开发, 对搭建kafka集群没什么兴趣, 可以跳过这一章, 直接看明天的内容.

如果你觉得多了解一点没有什么坏处的话, 请继续看下去.

提醒一下, 本章图多


Kafka 集群搭建

概述

kafka集群的搭建还是比较繁琐的, 虽然只是下载文件,修改配置,但数据比较多.

基本环境需要3台zk服务器 和3台 kafka服务器.

操作流程

看图

看上去就比较长, 所以我不用这种方法, 使用docker 来简化一点流程.


Kafka 集群快速搭建

安装 Docker

算复习

uname -a
yum -y install docker
service docker start
# 或
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

镜像加速

vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://uzoia35z.mirror.aliyuncs.com"]
}

zookeeper集群

docker-compose 已装好

新建docker网络
docker network create --driver bridge --subnet 172.29.0.0/25 \
--gateway 172.29.0.1 elk_zoo
docker network ls
yml 脚本

配置太长,这里先放个结构, 源文件稍后会放在博客上.

列出的项目基本都要配置, 重点注意:

  • ports: # 端口
  • volumes: # 挂载卷
  • environment: 环境变量
  • networks: 有两部分, ip 和共有网络

请参考配置文件印证.

docker-compose up -d
验证

ZooInspector

cd zookeeper/src/contrib/zooinspector/
# 打开失败,需要验证

Kafka集群

镜像
docker pull wurstmeister/kafka
docker pull sheepkiller/kafka-manager
yml 脚本

配置太长,这里先放个结构, 源文件稍后会放在博客上.

​ 列出的项目基本都要配置, 重点注意:

  • ports: # 端口
  • volumes: # 挂载卷
  • environment: 环境变量
  • external_links 外连
  • networks: 有两部分, ip 和共有网络

请参考配置文件印证.

docker-compose up -d
验证

使用 kafka-manager 的管理页面,本机ip加9000端口


搞定收工.

本着对懒惰之神的信仰, 用docker短时间搞定了集群的搭建, 鼓掌.

明天开始命令行实操,敬请期待.

今天的三张图都比较复杂, 不需要记忆, 对照配置文件理清楚流程即可.

第二节 集群管理工具

先来一个问题吧, 昨天我搭完了kafka的集群, 管理工具也装好了, 一切如截图所示.

有没有同学能看出或猜出该集群存在的问题呢? 对自己有信心的可以加我好友私聊, 思路对的话, 我也可以发个小红包鼓励的.


集群管理工具

概述

kafa-manager 是一个常用的 kafka集群管理工具, 类似工具还有很多, 也有公司自己开发类型的工具.

操作流程

当集群配置好之后, 可以通过浏览器登录kafa-manager , 并添加集群管理.

添加完毕后, 会显示这样

查看Broker信息

点击Topic 可以查看Topic

再点击可以进行单条信息的设置

其他

Preferred Replica Election

Reassign Partitions

Consumers

分别涉及副本选举, 分区和消费者, 后续讲到了再介绍.

因为集群刚建好, 很多信息会看不到,后面几篇会结合命令行操作一同展示.


集群 Issues

下面记录一些常见故障,及排查思路:

  1. 单机可以用, 集群发送信息失败

    host 名字不能设置为127.0.0.1

  2. 升级后不能消费信息

    检查 默认的topic

    __consumer_offsets

  3. 响应比较慢

    使用性能测试脚本:

    kafka-producer-perf-test.sh

    分析生成报告

    检查 jstack信息 或定位源码排查

  4. 日志持续报异常

    检查kafka日志, 检查GC日志, 检查zk日志和GC日志, 检查节点内存监控

    最后把报异常的节点下线再回复解决

  5. docker遇到 挂载数据卷无限重启

    查看logs发现没权限, 配置

    privileged: true

  6. docker里运行kafka命令时提示地址被占用

    unset JMX_PORT;bin/kafka-topics.sh ..

    比较取巧的一个办法, 取消掉 kafka-env.sh 脚本定义了JMX_PORT变量.


第三节 使用命令操纵集群

正常情况下, Kafka都是通过代码连接的.

但是, 偶然你想确认下是Kafka错了,还是你的代码错了.

或者并没有条件及时间搞出一段代码的时候, 简单用命令行还是可以的.


docker
docker inspect zookeeper
zookeeper
集群查看

​ 登录集群,判断状态

docker exec -it zoo1 bash
zkServer.sh status ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: leader
# 注意 Mode: standalone 为单机

配置文件

如果状态是单机, 检查以下文件:

vi zoo.cfg	# server.1=zoo1:2888:3888 之类, 多台
vi myid # 1或2等 # 也可能是环境变量形式
ZOO_MY_ID=3 \
ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888"

启动zk集群

./zkServer.sh start
jps # QuorumPeerMain
kafka查看
docker exec -it zoo1 bash
zkCli.sh
ls /
ls /brokers/ids # 查看kafka 的节点id
[1, 2, 3]
topic
创建topic

注意, 以下命令全部在kafka的目录下执行

cd /opt/kafka_2.12-2.3.0/  

unset JMX_PORT;bin/kafka-topics.sh --create --zookeeper zoo1:2181 --replication-factor 1 --partitions 1 --topic test1  

# 加参数 --bootstrap-server localhost:9091 可以用自带zk
# --config delete.retention.ms=21600000 日志保留6小时
创建集群topic

副本因子1, 分区数3, 名字为test.

unset JMX_PORT;bin/kafka-topics.sh --create --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --replication-factor 1 --partitions 3 --topic test
查看topic

列表及详情

unset JMX_PORT; bin/kafka-topics.sh --list --zookeeper zoo1:2181,zoo2:2181,zoo3:2181

unset JMX_PORT;bin/kafka-topics.sh --describe --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic __consumer_offsets
删除topic

默认标记删除

unset JMX_PORT;bin/kafka-topics.sh --delete  --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic test  

#设置 delete.topic.enable=true 真实删除
生产者
发送消息
cat config/server.properties |grep listeners # 获取监听地址  

unset JMX_PORT;bin/kafka-console-producer.sh  --broker-list broker1:9091  --topic test2
# 运行起来后可以输入信息
吞吐量测试
unset JMX_PORT;bin/kafka-producer-perf-test.sh --num-records 100000 --topic test --producer-props bootstrap.servers=b
roker1:9091,broker2:9092,broker3:9093 --throughput 5000 --record-size 102400 --print-metrics # 3501 records sent, 699.2 records/sec (68.28 MB/sec), 413.5 ms avg latency, 1019.0 ms max latency.
消费者
接受消息
unset JMX_PORT;bin/kafka-console-consumer.sh  --bootstrap-server  broker1:9091  --topic test2  

# 实时接受, 要从头接收使用 --from-beginning
列出消费者
unset JMX_PORT;bin/kafka-consumer-groups.sh --bootstrap-server broker1:9091 --list
# KafkaManagerOffsetCache
# console-consumer-26390
查看分区消息

查看当前分区最新收到的消息

unset JMX_PORT;bin/kafka-console-consumer.sh --bootstrap-server broker1:9091 --topic test2 --offset latest --partition 0
吞吐量测试
bin/kafka-consumer-perf-test.sh --topic test --messages 100000 --num-fetch-threads 10 --threads 10 --broker-list broker1:9091,broker2:9092,broker3:9093 --group console-consumer-26390
容错
unset JMX_PORT;bin/kafka-topics.sh --describe --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic test2  

docker stop broker3
# 干掉一台broker, 再用上述命令查看, 注意 Leader: -1 unset JMX_PORT;bin/kafka-topics.sh --describe --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --topic test2


全部命令都手打了一遍, 保证可用.

涉及的命令都比较长, 请把代码框的命令一次复制上去, 不要考虑换行.

第四节 Kafka 术语说明

昨天说到命令行操作kafka集群, 其实有个小小故障的.

在运行生产者吞吐量测试时, 把集群打挂了.

阿里云的空间有限,kafka-producer-perf-test.sh 命令短时间填满了所有的磁盘空间.

今天会科普一些kafka的基础知识. 新手向, 大牛请略过


简介

  • ​ Kafka是用Scala语言写的,
  • ​ 官方主页 kafka.apache.org ,
  • ​ 定义为分布式实时流处理平台,
  • ​ 其性能严重依赖磁盘的性能,
  • ​ 消息无状态, 需要定时或定量删除.

用途

消息系统

这个没什么说的, 著名的消息中间件.

应用监控

监控中主要配合ELK使用.

用户行为追踪

记录承载用户多方面的海量信息, 再转给各种大数据软件处理, 如Hadoop,Spark,Strom

流处理

收集流数据

这块是我的空缺, 昨天命令行操作时, 配置文件出了点错误, 后面会补上.

持久性日志

主要应用Kafka的性能特性, 再配合Flume + HDFS, 相当好用.

性能

​ 据说Kafka千万级的性能, 我司没有这么大的量, 不敢评论. 不过百万级是公认的.

​ 性能好的原因是大量使用操作系统页缓存,不直接参与物理I/O操作. 同时使用追加写入方式, 避免随机写入导致硬盘的性能噩梦.

还以sendfile为代表的零拷贝技术, 在内核区完成数据拷贝, 避开用户缓存.

数据保存

以下为Zookeeper中 Kafka 保存信息的几个目录, 可以适当了解. 查看方法:

docker exec -it zoo1 bash
zkCli.sh
ls /
ls /brokers/ids
...
目录名 用途
brokers 存放集群和topic信息
controller 存放节点选举相关信息
admin 存放脚本命令的输出结果
isr_change_notification 记录变化的ISR
config 记录集群id 和版本号
controller_epoch 记录 controller版本号, 避免墓碑问题

专用名词

名称 用途
broker 指Kafka的服务器
集群 指多个broker组成的工作单元
消息 最基础数据单元
批次 指一组消息
副本 消息的冗余形式
消息模式 消息序列化的方式
提交 更新分区当前位置
主题 mysql 中表格, 对应命令是topic
分区 对应命令是 partition
生产者 负责消息输入
消费者 负责消息输出

补充:

  1. 消息定位:

    由tpoic, partition, offset 可以定位到唯一的一条消息.

  2. 副本分为 leader replica和follower replica.

follower作用就是复制数据

在leader挂掉时, 从follower中选出新的leader.

follower作用就是复制数据, 并在leader挂掉 时,从中选出新的leader.

  1. topic可以设置多个分区,其中有多个segment以存放消息

配置文件

主要有以下4个相关配置文件:

用途 文件名
broker 配置 server.properties
zookeeper 配置 zookeeper.properties
消费者配置 consumer.properties
生产者配置 producer.properties

基础就是基础. yann也是学完这些基础的东西, 再次看到时才能鄙视以上内容的. 所以, 加油.

第五节 Kafka 集群工作原理

昨天把自己的公众号发给大佬看, 结果被批评了. 说格式太乱, 看不下去. 然后我就开始进行调整格式之旅, 连着发了几十个预览, 感觉自己都晕掉了.

所以,今天的内容会有点水, 见谅.


集群原理

这里简单说一下, kafka的集群原理. 之前就说明过, kafka的集群是由三台ZooKeeper, 和三台kafka的集群组成的.

想互的关系大约类似下面这张图:

相互的关系不重要, 只要知道 ZooKeeper相当于数据库, Kakka 相当于实例. 双方个体都足够强(有三个节点), 组合起来就更强了.

那Kafka为什么要报zk的大腿呢? 其实是使用zk解决分布一致性的问题. 三个节点分布在三台服务器上, 要保持数据一致, 虽然很多系统是自己维护的, 不过Kafak是叫外援了.

但是, 光有 ZooKeeper 还不够, 自身也要做相当的努力.

Kafka的集群主要是通过数据复制和领袖选举来保证一致性的.

数据复制是指虽然有三个副本, 但只有 leader 对外服务. follower 时刻观察着 leader 副本的动向, 一但有新的变更, 就果断拉给自己.

领袖选举是指如果劳模 leader 不幸挂掉了, 会从 follower 里面选一个最接近的, 荣升新的 leader.

那怎么知道, leader 挂掉了呢, 每个Kafka实例启动后,都会以会话形式把自己注册到ZooKeeper服务中, 一但出了问题, 其与ZooKeeper的会话便不能维持下去了,从而超时失效.

就像上班打卡一样, 一段时间没打卡了, 就知道 leader 凉了.

补充一个名词

ISR: leader 节点将会跟踪与其保持同步的副本列表,该列表称为ISR(In-Sync Replica)


工作流程

知道了集群原理后, 再来看一下工作的流程.

应用程序先连接 ZooKeeper 集群, 获取Kafka集群的一些消息. 其中, 最重要的是知道谁是 leader. 下面的事情就简单了:

  1. 应用程序把消息发送给 leader
  2. leader 将消息写入本地文件
  3. follower 知道后来同步消息
  4. follower 同步好消息后告诉 leader
  5. leader 收集到所有副的ACK信号后告诉应用程序

大致的流程就是以上几步, 但还会有一些细节, 同时可以用参数微调.

比方说, leader 不是一收到消息就写入硬盘的, 会有时间或条数的一个阀值. Partiton在物理上对应一个文件夹, 一个分区的多个副本一般不会分配在同一台物理机上等. 而是先反馈给应用还是先保证同步, 消息写到哪个分区, 则时靠参数来控制了.

Kafka有一个重要的特性, 保证消息在单个分区内的顺序. 原因就是 Kafka会单独开辟一块磁盘空间,顺序写入数据. 分区内会有多组segment文件, 满足条件就写入磁盘, 写完就再开新的segment 片段.


消费机制

​ 最后说一下消费, 消费者其实也是应用程序. 其实应用是主动到Kafka拉取消息的. 当然也是找 leader 拉取. 鉴于Kafka的强悍性能, 可以同时加多个消费者, 同时消费者可以组成消费者组. 同一个消费组者的消费者可以消费同一topic下不同分区的数据.

在分区量充足的时候, 可能有一个消费者消费多个分区的情况, 但如果消费都多于分区数量, 可能就有消费者什么事都不做, 躺在一边待机了.所以,不要让消费者的数量超过主题分区的数量.

所有权

客户端崩溃时消息的处理.

  • ​ 消费者组共享接收
  • ​ 所有权转移 再均衡 rebalance
  • ​ 消费者向broker发送心跳来维持所有权
  • ​ 客户端拉取数据, 记录消费

日志压缩

  • ​ 针对一个topic的partition
  • ​ 压缩不会重排序消息
  • ​ 消息的offset是不会变
  • ​ 消息的offset是顺序

总结

实在抱歉, 感觉有些虎头蛇尾的感觉。 前两节写的很详细, 后面却草草结束。毕竟Kafka是一个中间件, 而不是一个平台。 再深入的话, 就需要写生产架构或叙述业务流程,与初衷不付。毕竟本来打算写一个简单的 Kafka科普的。

先打个挂点吧, 有其他的想法再补充进来。 后面搭 ELK 的时候遇到了再补充一点。

​ 谢谢阅读。

附 Kafka配置文件:

# 创建网络:docker network create --driver bridge --subnet 172.69.0.0/25 --gateway 172.69.0.1  kafka_zoo
version: '2'
services:
broker1:
image: wurstmeister/kafka
restart: always
hostname: broker1
container_name: broker1
ports:
- "9091:9091"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_HOST_NAME: broker1
KAFKA_ADVERTISED_PORT: 9091
KAFKA_HOST_NAME: broker1
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_LISTENERS: PLAINTEXT://broker1:9091
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker1:9091
JMX_PORT: 9988
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- "/root/kafka/broker1/:/kafka"
networks:
default:
ipv4_address: 172.69.0.11
broker2:
image: wurstmeister/kafka
restart: always
hostname: broker2
container_name: broker2
ports:
- "9092:9092"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_HOST_NAME: broker2
KAFKA_ADVERTISED_PORT: 9092
KAFKA_HOST_NAME: broker2
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_LISTENERS: PLAINTEXT://broker2:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker2:9092
JMX_PORT: 9988
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- "/root/kafka/broker2/:/kafka"
networks:
default:
ipv4_address: 172.69.0.12
broker3:
image: wurstmeister/kafka
restart: always
hostname: broker3
container_name: broker3
ports:
- "9093:9093"
external_links:
- zoo1
- zoo2
- zoo3
environment:
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_HOST_NAME: broker3
KAFKA_ADVERTISED_PORT: 9093
KAFKA_HOST_NAME: broker3
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_LISTENERS: PLAINTEXT://broker3:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker3:9093
JMX_PORT: 9988
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- "/root/kafka/broker3/:/kafka"
networks:
default:
ipv4_address: 172.69.0.13
kafka-manager:
image: sheepkiller/kafka-manager
restart: always
container_name: kafa-manager
hostname: kafka-manager
ports:
- "9002:9000"
links: # 连接本compose文件创建的container
- broker1
- broker2
- broker3
external_links: # 连接本compose文件以外的container
- zoo1
- zoo2
- zoo3
environment:
ZK_HOSTS: zoo1:2181,zoo2:2181,zoo3:2181
KAFKA_BROKERS: broker1:9091,broker2:9092,broker3:9093
APPLICATION_SECRET: letmein
KM_ARGS: -Djava.net.preferIPv4Stack=true
networks:
default:
ipv4_address: 172.69.0.10
networks:
default:
external:
name: kafka_zoo # mkdir -p /root/kafka/broker1
# mkdir -p /root/kafka/broker2
# mkdir -p /root/kafka/broker3

本文由博客一文多发平台 OpenWrite 发布!

发布在平台的文章, 和原文存在格式差异, 阅读不便请见谅

最新内容欢迎关注公众号:

使用Kafka的一些简单介绍: 1集群 2原理 3 术语的更多相关文章

  1. kafka分布式消息队列介绍以及集群安装

    简介 首先简单说下对kafka的理解: 1.kafka是一个分布式的消息缓存系统: 2.kafka集群中的服务器节点都被称作broker 3.kafka的客户端分为:一是producer(消息生产者) ...

  2. 【Hadoop离线基础总结】zookeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解

    ZooKeeper的介绍以及集群环境搭建.网络编程和RPC的简单了解 ZooKeeper介绍 概述 ZooKeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题.例如 ...

  3. Kafka 详解(二)------集群搭建

    这里通过 VMware ,我们安装了三台虚拟机,用来搭建 kafka集群,虚拟机网络地址如下: hostname                      ipaddress             ...

  4. ZooKeeper 介绍及集群环境搭建

    本篇由鄙人学习ZooKeeper亲自整理的一些资料 包括:ZooKeeper的介绍,我们要学习ZooKeeper的话,首先就要知道他是干嘛的对吧. 其次教大家如何去安装这个精巧的智慧品! 相信你能研究 ...

  5. RocketMQ 简单梳理 及 集群部署笔记【转】

    一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...

  6. 搭建简单的hadoop集群(译文)

    本文翻译翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html 具体的实 ...

  7. 超详细,多图文介绍redis集群方式并搭建redis伪集群

    超详细,多图文介绍redis集群方式并搭建redis伪集群 超多图文,对新手友好度极好.敲命令的过程中,难免会敲错,但为了截好一张合适的图,一旦出现一点问题,为了好的演示效果,就要从头开始敲.且看且珍 ...

  8. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  9. 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

随机推荐

  1. 关于ADM和高维空间下距离度量的问题

    最近聆听了两个IEEE FELLOW的高论.周末北大林老师来学校做了个报告,讲了很多新的机器学习概念.但是本人更关注的低秩学习,林老师只字未提.虽然如此,林老师的论文最近还是深入研究了很多,有多少改进 ...

  2. SQL Server参数优化

    内存参数: 此处为512G物理内存,一般来说设置为物理内存80%左右,设置过大资源不会自动释放,内存可能会持续增长:设置过小资源浪费. CPU参数: 最大工作线程数: 此处为4个CPU40核,调整后物 ...

  3. 简单说说JavaBean的使用

    一:JavaBean定义 JavaBean是一种可重复使用.跨平台的软件组件.JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean,例如中的那些可视化图 ...

  4. Java——package与import

    [package]   <1>为了解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间. <2>package作为源文件的第一条语句(缺省时指定为 ...

  5. 【WINDOWS】设置路由表实现有线内网,无线外网

    前提!!! 需要有线无线双网卡

  6. 【PowerOJ1738&网络流24题】最小路径覆盖问题 (最大流)

    题意: 思路: [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分图,把原图每个顶点i拆分成二分图X,Y集合中的两个顶点Xi和Yi.对于原图 ...

  7. codeforces D Salary Changing

    题意:给你n个人,和s块钱,每个人都有一个工资区间,你给所有人都发工资.然后要他们工资的中位数最大. 思路:二分找那个值.那个值要满足至少有n/2+1个工资区间内. #include<cstdi ...

  8. cmd开启3389

    如何用CMD开启3389与查看3389端口 开启 REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server / ...

  9. (转)VS2010结合水晶报表做条码标签打印功能

    本文转载自:http://blog.sina.com.cn/s/blog_552ca1400100y6dd.html 先来个功能效果图: 大家都知道VS2005和VS2008软件本身是包含水晶报表插件 ...

  10. 用流的方式来操作hdfs上的文件

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...