技术文档收录
ASCII
Tcpdump
IPV4保留地址段
深入理解以太网网线原理 - 三帛的世界
Linux
WireGuard 一键安装脚本 | 秋水逸冰
SSH Config 那些你所知道和不知道的事 | Deepzz's Blog
Linux 让终端走代理的几种方法
ubuntu 20.04 server 版设置静态 IP 地址 - 链滴
Linux 挂载 Windows 共享磁盘的方法 - 技术学堂
将 SMB/CIFS 网络硬盘永久的挂载到 Ubuntu 上 - 简书
linux 获取当前脚本的绝对路径 | aimuke
[Linux] Linux 使用 / dev/urandom 生成随机数 - piaohua's blog
Linux 生成随机数的多种方法 | Just Do It
Linux 的 Centos7 版本下忘记 root 或者普通用户密码怎么办?
Git 强制拉取覆盖本地
SSH 安全加固指南 - FreeBuf 网络安全行业门户
Linux 系统安全强化指南 - FreeBuf 网络安全行业门户
Linux 入侵排查 - FreeBuf 网络安全行业门户
sshd_config 配置详解 - 简书
SSH 权限详解 - SegmentFault 思否
CentOS 安装 node.js 环境 - SegmentFault 思否
如何在 CentOS 7 上安装 Node.js 和 npm | myfreax
几款 ping tcping 工具总结
OpenVpn 搭建教程 | Jesse's home
openvpn 一键安装脚本 - 那片云
OpenVPN 解决 每小时断线一次 - 爱开源
OpenVPN 路由设置 – 凤曦的小窝
OpenVPN 设置非全局代理 - 镜子的记录簿
TinyProxy 使用帮助 - 简书
Ubuntu 下使用 TinyProxy 搭建代理 HTTP 服务器_Linux_运维开发网_运维开发技术经验分享
Linux 软件包管理工具 Snap 常用命令 - 简书
linux systemd 参数详解
Systemd 入门教程:命令篇 - 阮一峰的网络日志
记一次 Linux 木马清除过程
rtty:在任何地方通过 Web 访问您的终端
02 . Ansible 高级用法 (运维开发篇)
终于搞懂了服务器为啥产生大量的 TIME_WAIT!
巧妙的 Linux 命令,再来 6 个!
77% 的 Linux 运维都不懂的内核问题,这篇全告诉你了
运维工程师必备:请收好 Linux 网络命令集锦
一份阿里员工的 Java 问题排查工具单
肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收
作业调度算法(FCFS,SJF,优先级调度,时间片轮转,多级反馈队列) | The Blog Of WaiterXiaoYY
看了这篇还不会 Linux 性能分析和优化,你来打我
2019 运维技能风向标
更安全的 rm 命令,保护重要数据
求你了,别再纠结线程池大小了!
Linux sudo 详解 | 失落的乐章
重启大法好!线上常见问题排查手册
sudo 使用 - 笨鸟教程的博客 | BY BenderFly
shell 在手分析服务器日志不愁? - SegmentFault 思否
sudo 与 visudo 的超细用法说明_陈发哥 007 的技术博客_51CTO 博客
ESXI 下无损扩展 Linux 硬盘空间 | Naonao Blog
Linux 学习记录:su 和 sudo | Juntao Tan 的个人博客
使用者身份切换 | Linux 系统教程(笔记)
你会使用 Linux 编辑器 vim 吗?
在 Windows、Linux 和 Mac 上查看 Wi-Fi 密码
linux 隐藏你的 crontab 后门 - 简书
Linux 定时任务详解 - Tr0y's Blog
linux 的 TCP 连接数量最大不能超过 65535 个吗,那服务器是如何应对百万千万的并发的?_一口 Linux 的博客 - CSDN 博客_tcp 连接数多少正常
万字长文 + 28 张图,一次性说清楚 TCP,运维必藏
为什么 p2p 模式的 tunnel 底层通常用 udp 而不是 tcp?
记一次服务器被入侵挖矿 - tlanyan
shell 判断一个变量是否为空方法总结 - 腾讯云开发者社区 - 腾讯云
系统安装包管理工具 | Escape
编译代码时动态地链接库 - 51CTO.COM
甲骨文 Oracle Cloud 添加新端口开放的方法 - WirelessLink 社区
腾讯云 Ubuntu 添加 swap 分区的方法_弓弧名家_玄真君的博客 - CSDN 博客
Oracle 开放全部端口并关闭防火墙 - 清~ 幽殇
谁再说不熟悉 Linux 命令, 就把这个给他扔过去!
即插即用,运维工程师必会正则表达式大全
Shell脚本编写及常见面试题
Samba 文件共享服务器
到底一台服务器上最多能创建多少个 TCP 连接 | plantegg
SSH 密钥登录 - SSH 教程 - 网道
在 Bash 中进行 encodeURIComponent/decodeURIComponent | Harttle Land
使用 Shell 脚本来处理 JSON - Tom CzHen's Blog
Docker
「Docker」 - 保存镜像 - 知乎
终于可以像使用 Docker 一样丝滑地使用 Containerd 了!
私有镜像仓库选型:Harbor VS Quay - 乐金明的博客 | Robin Blog
exec 与 entrypoint 使用脚本 | Mr.Cheng
Dockerfile 中的 CMD 与 ENTRYPOINT
使用 Docker 配置 MySQL 主从数据库 - 墨天轮
Alpine vs Distroless vs Busybox – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
再见,Docker!
docker save 与 docker export 的区别 - jingsam
如何优雅的关闭容器
docker 储存之 tmpfs 、bind-mounts、volume | 陌小路的个人博客
Dockerfile 中 VOLUME 与 docker -v 的区别是什么 - 开发技术 - 亿速云
理解 docker 容器的退出码 | Vermouth | 博客 | docker | k8s | python | go | 开发
【Docker 那些事儿】容器监控系统,来自 Docker 的暴击_飞向星的客机的博客 - CSDN 博客
【云原生】Docker 镜像详细讲解_微枫 Micromaple 的博客 - CSDN 博客_registry-mirrors
【云原生】Helm 架构和基础语法详解
CMD 和 Entrypoint 命令使用变量的用法
实时查看容器日志 - 苏洋博客
Traefik 2 使用指南,愉悦的开发体验 - 苏洋博客
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
【云原生】镜像构建实战操作(Dockerfile)
Docker Compose 中的 links 和 depends_on 的区别 - 编程知识 - 白鹭情
Python
Pipenv:新一代Python项目环境与依赖管理工具 - 知乎
Python list 列表实现栈和队列
Python 各种排序 | Lesley's blog
Python 中使用 dateutil 模块解析时间 - SegmentFault 思否
一个小破网站,居然比 Python 官网还牛逼
Python 打包 exe 的王炸 - Nuitka
Django - - 基础 - - Django ORM 常用查询语法及进阶
[Python] 小知識:== 和 is 的差異 - Clay-Technology World
Window
批处理中分割字符串 | 网络进行时
Windows 批处理基础命令学习 - 简书
在Windows上设置WireGuard
Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
windows 重启 rdpclip.exe 的脚本
中间件
Nginx 中的 Rewrite 的重定向配置与实践
RabbitMQ 的监控
RabbitMq 最全的性能调优笔记 - SegmentFault 思否
为什么不建议生产用 Redis 主从模式?
高性能消息中间件——NATS
详解:Nginx 反代实现 Kibana 登录认证功能
分布式系统关注点:仅需这一篇,吃透 “负载均衡” 妥妥的
仅需这一篇,妥妥的吃透” 负载均衡”
基于 nginx 实现上游服务器动态自动上下线——不需 reload
Nginx 学习书单整理
最常见的日志收集架构(ELK Stack)
分布式之 elk 日志架构的演进
CAT 3.0 开源发布,支持多语言客户端及多项性能提升
Kafka 如何做到 1 秒处理 1500 万条消息?
Grafana 与 Kibana
ELK 日志系统之通用应用程序日志接入方案
ELK 简易 Nginx 日志系统搭建: ElasticSearch+Kibana+Filebeat
记一次 Redis 连接池问题引发的 RST
把 Redis 当作队列来用,你好大的胆子……
Redis 最佳实践:业务层面和运维层面优化
Redis 为什么变慢了?常见延迟问题定位与分析
好饭不怕晚,扒一下 Redis 配置文件的底 Ku
rabbitmq 集群搭建以及万级并发下的性能调优
别再问我 Redis 内存满了该怎么办了
Nginx 状态监控及日志分析
uWSGI 的安装及配置详解
uwsgi 异常服务器内存 cpu 爆满优化思路
Uwsgi 内存占用过多 - 简书
Nginx 的 limit 模块
Nginx 内置模块简介
Redis 忽然变慢了如何排查并解决?_redis_码哥字节_InfoQ 写作社区
领导:谁再用 redis 过期监听实现关闭订单,立马滚蛋!
Nginx 限制 IP 访问频率以及白名单配置_问轩博客
Nginx $remote_addr 和 $proxy_add_x_forwarded_for 变量详解
Caddy 部署实践
一文搞定 Nginx 限流
数据库
SqlServer 将数据库中的表复制到另一个数据库_MsSql_脚本之家
SQL Server 数据库同步,订阅、发布、复制、跨服务器
sql server 无法删除本地发布 | 辉克's Blog
SQLite全文检索
SQL 重复记录查询的几种方法 - 简书
SQL SERVER 使用订阅发布同步数据库(转)
Mysql 查看用户连接数配置及每个 IP 的请求情况 - 墨天轮
优化 SQL 的 21 条方案
SQL Server 连接时好时坏的奇怪问题
MS SQL 执行大脚本文件时,提示 “内存不足” 的解决办法 - 阿里云开发者社区
防火墙-iptables
iptables 常用规则:屏蔽 IP 地址、禁用 ping、协议设置、NAT 与转发、负载平衡、自定义链
防火墙 iptables 企业防火墙之 iptables
Linux 防火墙 ufw 简介
在 Ubuntu 中用 UFW 配置防火墙
在 Ubuntu20.04 上怎样使用 UFW 配置防火墙 - 技术库存网
监控类
开箱即用的 Prometheus 告警规则集
prometheus☞搭建 | zyh
docker 部署 Prometheus 监控服务器及容器并发送告警 | chris'wang
PromQL 常用命令 | LRF 成长记
prometheus 中使用 python 手写 webhook 完成告警
持续集成CI/CD
GitHub Actions 的应用场景 | 记录干杯
GithubActions · Mr.li's Blog
工具类
GitHub 中的开源网络广告杀手,十分钟快速提升网络性能
SSH-Auditor:一款 SHH 弱密码探测工具
别再找了,Github 热门开源富文本编辑器,最实用的都在这里了 - srcmini
我最喜欢的 CLI 工具
推荐几款 Redis 可视化工具
内网代理工具与检测方法研究
环境篇:数据同步工具 DataX
全能系统监控工具 dstat
常用 Web 安全扫描工具合集
给你一款利器!轻松生成 Nginx 配置文件
教程类
Centos7 搭建神器 openvpn | 运维随笔
搭建 umami 收集个人网站统计数据 | Reorx’s Forge
openvpn安装教程
基于 gitea+drone 完成小团队的 CI/CD - 德国粗茶淡饭
将颜色应用于交替行或列
VMware Workstation 全系列合集 精简安装注册版 支持 SLIC2.6、MSDM、OSX 更新 16.2.3_虚拟机讨论区_安全区 卡饭论坛 - 互助分享 - 大气谦和!
在 OpenVPN 上启用 AD+Google Authenticator 认证 | 运维烂笔头
Github 进行 fork 后如何与原仓库同步:重新 fork 很省事,但不如反复练习版本合并 · Issue #67 · selfteaching/the-craft-of-selfteaching
卧槽,VPN 又断开了!!- 阿里云开发者社区
Grafana Loki 学习之踩坑记
zerotier 的 planet 服务器(根服务器)的搭建踩坑记。无需 zerotier 官网账号。
阿里云 qcow2 镜像转 vmdk,导入 ESXi - 唐际忠的博客
Caddy 入门 – 又见杜梨树
【Caddy2】最新 Caddy2 配置文件解析 - Billyme 的博客
Web 服务器 Caddy 2 | Haven200
手把手教你打造高效的 Kubernetes 命令行终端
Keras 作者:给软件开发者的 33 条黄金法则
超详细的网络抓包神器 Tcpdump 使用指南
使用 fail2ban 和 FirewallD 黑名单保护你的系统
linux 下 mysql 数据库单向同步配置方法分享 (Mysql)
MySQL 快速删除大量数据(千万级别)的几种实践方案
GitHub 上的优质 Linux 开源项目,真滴牛逼!
WireGuard 教程:使用 Netmaker 来管理 WireGuard 的配置 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Tailscale 基础教程:Headscale 的部署方法和使用教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Nebula Graph 的 Ansible 实践
改进你的 Ansible 剧本的 4 行代码
Caddy 2 快速简单安装配置教程 – 高玩梁的博客
切换至 Caddy2 | 某不科学的博客
Caddy2 简明教程 - bleem
树莓派安装 OpenWrt 突破校园网限制 | Asttear's Blog
OpenVPN 路由设置 – 凤曦的小窝
个性化编译 LEDE 固件
盘点各种 Windows/Office 激活工具
[VirtualBox] 1、NAT 模式下端口映射
VirtualBox 虚拟机安装 openwrt 供本机使用
NUC 折腾笔记 - 安装 ESXi 7 - 苏洋博客
锐捷、赛尔认证 MentoHUST - Ubuntu 中文
How Do I Use A Client Certificate And Private Key From The IOS Keychain? | OpenVPN
比特记事簿: 笔记: 使用电信 TR069 内网架设 WireGuard 隧道异地组网
利用 GitHub API 获取最新 Releases 的版本号 | 这是只兔子
docsify - 生成文档网站简单使用教程 - SegmentFault 思否
【干货】Chrome 插件 (扩展) 开发全攻略 - 好记的博客
一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
【计算机网络】了解内网、外网、宽带、带宽、流量、网速_墩墩分墩 - CSDN 博客
mac-ssh 配置 | Sail
如何科学管理你的密码
VirtualBox NAT 端口映射实现宿主机与虚拟机相互通信 | Shao Guoliang 的博客
CentOS7 配置网卡为静态 IP,如果你还学不会那真的没有办法了!
laisky-blog: 近期折腾 tailscale 的一些心得
使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书 · Ruby China
acme 申请 Let’s Encrypt 泛域名 SSL 证书
从 nginx 迁移到 caddy
使用 Caddy 替代 Nginx,全站升级 https,配置更加简单 - Diamond-Blog
http.proxy - Caddy 中文文档
动手撸个 Caddy(二)| Caddy 命令行参数最全教程 | 飞雪无情的总结
Caddy | 学习笔记 - ijayer
Caddy 代理 SpringBoot Fatjar 应用上传静态资源
使用 graylog3.0 收集 open××× 日志进行审计_年轻人,少吐槽,多搬砖的技术博客_51CTO 博客
提高国内访问 github 速度的 9 种方法! - SegmentFault 思否
VM16 安装 macOS 全网最详细
2022 目前三种有效加速国内 Github
How to install MariaDB on Alpine Linux | LibreByte
局域网内电脑 - ipad 文件共享的三种方法 | 岚
多机共享键鼠软件横向测评 - 尚弟的小笔记
VLOG | ESXI 如何升级到最新版,无论是 6.5 还是 6.7 版本都可以顺滑升级。 – Vedio Talk - VLOG、科技、生活、乐分享
远程修改 ESXi 6.7 管理 IP 地址 - 腾讯云开发者社区 - 腾讯云
几乎不要钱自制远程 PLC 路由器方案
traefik 简易入门 | 个人服务器运维指南 | 山月行
更完善的 Docker + Traefik 使用方案 - 苏洋博客
MicroSD·TF 卡终极探秘 ·MLC 颗粒之谜 1 三星篇_microSD 存储卡_什么值得买
macOS 绕过公证和应用签名方法 - 走客
MiscSecNotes / 内网端口转发及穿透. md at master · JnuSimba/MiscSecNotes
我有特别的 DNS 配置和使用技巧 | Sukka's Blog
SEO:初学者完整指南
通过 OpenVPN 实现流量审计
OpenVPN-HOWTO
OpenVPN Server · Devops Roadmap
Linux 运维必备的 13 款实用工具, 拿好了~
linux 平台下 Tomcat 的安装与优化
Linux 运维跳槽必备的 40 道面试精华题
Bash 脚本进阶,经典用法及其案例 - alonghub - 博客园
推荐几个非常不错的富文本编辑器 - 走看看
在 JS 文件中加载 JS 文件的方法 - 月光博客
#JavaScript 根据需要动态加载脚本并设置自定义参数
笔记本电脑 BIOS 修改及刷写教程
跨平台加密 DNS 和广告过滤 personalDNSfilter · LinuxTOY
AdGuard Home 安装及使用指北
通过 Amazon S3 协议挂载 OSS
记一次云主机如何挂载对象存储
本文档发布于https://mrdoc.fun
-
+
首页
Kafka 如何做到 1 秒处理 1500 万条消息?
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.tuicool.com](https://www.tuicool.com/articles/jMJj2mI) ![](https://img0.tuicool.com/iAFrium.jpg!web) 【51CTO.com 原创稿件】Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台)、Uber、Square(移动支付公司) 等大型公司用来构建可扩展的、高吞吐量的、且高可靠的实时数据流系统。 例如,在 New Relic 的生产环境中,Kafka 群集每秒能够处理超过 1500 万条消息,而且其数据聚合率接近 1Tbps。 可见,Kafka 大幅简化了对于数据流的处理,因此它也获得了众多应用开发人员和数据管理专家的青睐。 然而,在大型系统中 Kafka 的应用会比较复杂。如果您的 Consumers 无法跟上数据流的话,各种消息往往在未被查看之前就已经消失掉了。 同时,它在自动化数据保留方面的限制,高流量的发布 + 订阅 (publish-subscribe,pub/sub) 模式等,可能都会影响到您系统的性能。 可以毫不夸张地说,如果那些存放着数据流的系统无法按需扩容、或稳定性不可靠的话,估计您经常会寝食难安。 为了减少上述复杂性,我在此分享 New Relic 公司为 Kafka 集群在应对高吞吐量方面的 20 项最佳实践。 我将从如下四个方面进行展开: * Partitions(分区) * Consumers(消费者) * Producers(生产者) * Brokers(代理) #### 快速了解 Kafka 的概念与架构 Kafka 是一种高效的分布式消息系统。在性能上,它具有内置的数据冗余度与弹性,也具有高吞吐能力和可扩展性。 在功能上,它支持自动化的数据保存限制,能够以 “流” 的方式为应用提供数据转换,以及按照 “键 - 值(key-value)” 的建模关系 “压缩” 数据流。 要了解各种最佳实践,您需要首先熟悉如下关键术语: #### Message(消息) Kafka 中的一条记录或数据单位。每条消息都有一个键和对应的一个值,有时还会有可选的消息头。 #### Producer(生产者) Producer 将消息发布到 Kafka 的 topics 上。Producer 决定向 topic 分区的发布方式,如:轮询的随机方法、或基于消息键 (key) 的分区算法。 #### Broker(代理) Kafka 以分布式系统或集群的方式运行。那么群集中的每个节点称为一个 Broker。 #### Topic(主题) Topic 是那些被发布的数据记录或消息的一种类别。消费者通过订阅 Topic,来读取写给它们的数据。 #### Topic Partition(主题分区) 不同的 Topic 被分为不同的分区,而每一条消息都会被分配一个 Offset,通常每个分区都会被复制至少一到两次。 每个分区都有一个 Leader 和存放在各个 Follower 上的一到多个副本 (即:数据的副本),此法可防止某个 Broker 的失效。 群集中的所有 Broker 都可以作为 Leader 和 Follower,但是一个 Broker 最多只能有一个 Topic Partition 的副本。Leader 可被用来进行所有的读写操作。 #### Offset(偏移量) 单个分区中的每一条消息都被分配一个 Offset,它是一个单调递增的整型数,可用来作为分区中消息的唯一标识符。 #### Consumer(消费者) Consumer 通过订阅 Topic partition,来读取 Kafka 的各种 Topic 消息。然后,消费类应用处理会收到消息,以完成指定的工作。 #### Consumer group(消费组) Consumer 可以按照 Consumer group 进行逻辑划分。Topic Partition 被均衡地分配给组中的所有 Consumers。 因此,在同一个 Consumer group 中,所有的 Consumer 都以负载均衡的方式运作。 换言之,同一组中的每一个 Consumer 都能看到每一条消息。如果某个 Consumer 处于 “离线” 状态的话,那么该分区将会被分配给同组中的另一个 Consumer。这就是所谓的“再均衡(rebalance)”。 当然,如果组中的 Consumer 多于分区数,则某些 Consumer 将会处于闲置的状态。 相反,如果组中的 Consumer 少于分区数,则某些 Consumer 会获得来自一个以上分区的消息。 #### Lag(延迟) 当 Consumer 的速度跟不上消息的产生速度时,Consumer 就会因为无法从分区中读取消息,而产生延迟。 延迟表示为分区头后面的 Offset 数量。从延迟状态 (到“追赶上来”) 恢复正常所需要的时间,取决于 Consumer 每秒能够应对的消息速度。 其公式如下:time = messages / (consume rate per second - produce rate per second) #### 针对 Partitions 的最佳实践 #### ①了解分区的数据速率,以确保提供合适的数据保存空间 此处所谓 “分区的数据速率” 是指数据的生成速率。换言之,它是由 “平均消息大小” 乘以 “每秒消息数” 得出的数据速率决定了在给定时间内,所能保证的数据保存空间的大小(以字节为单位)。 如果您不知道数据速率的话,则无法正确地计算出满足基于给定时间跨度的数据,所需要保存的空间大小。 同时,数据速率也能够标识出单个 Consumer 在不产生延时的情况下,所需要支持的最低性能值。 #### ②除非您有其他架构上的需要,否则在写 Topic 时请使用随机分区 在您进行大型操作时,各个分区在数据速率上的参差不齐是非常难以管理的。 其原因来自于如下三个方面: * 首先,“热”(有较高吞吐量) 分区上的 Consumer 势必会比同组中的其他 Consumer 处理更多的消息,因此很可能会导致出现在处理上和网络上的瓶颈。 * 其次,那些为具有最高数据速率的分区,所配置的最大保留空间,会导致 Topic 中其他分区的磁盘使用量也做相应地增长。 * 第三,根据分区的 Leader 关系所实施的最佳均衡方案,比简单地将 Leader 关系分散到所有 Broker 上,要更为复杂。在同一 Topic 中,“热” 分区会 “承载”10 倍于其他分区的权重。 有关 Topic Partition 的使用,可以参阅《Kafka Topic Partition 的各种有效策略》https://blog.newrelic.com/engineering/effective-strategies-kafka-topic-partitioning/。 #### 针对 Consumers 的最佳实践 #### ③如果 Consumers 运行的是比 Kafka 0.10 还要旧的版本,那么请马上升级 在 0.8.x 版中,Consumer 使用 Apache ZooKeeper 来协调 Consumer group,而许多已知的 Bug 会导致其长期处于再均衡状态,或是直接导致再均衡算法的失败 (我们称之为 “再均衡风暴”)。 因此在再均衡期间,一个或多个分区会被分配给同一组中的每个 Consumer。 而在再均衡风暴中,分区的所有权会持续在各个 Consumers 之间流转,这反而阻碍了任何一个 Consumer 去真正获取分区的所有权。 #### ④调优 Consumer 的套接字缓冲区 (socket buffers),以应对数据的高速流入 在 Kafka 的 0.10.x 版本中,参数 receive.buffer.bytes 的默认值为 64KB。而在 Kafka 的 0.8.x 版本中,参数 socket.receive.buffer.bytes 的默认值为 100KB。 这两个默认值对于高吞吐量的环境而言都太小了,特别是如果 Broker 和 Consumer 之间的网络带宽延迟积 (bandwidth-delay product) 大于局域网 (local areanetwork,LAN) 时。 对于延迟为 1 毫秒或更多的高带宽的网络 (如 10Gbps 或更高),请考虑将套接字缓冲区设置为 8 或 16MB。 如果您的内存不足,也至少考虑设置为 1MB。当然,您也可以设置为 -1,它会让底层操作系统根据网络的实际情况,去调整缓冲区的大小。 但是,对于需要启动 “热” 分区的 Consumers 来说,自动调整可能不会那么快。 #### ⑤设计具有高吞吐量的 Consumers,以便按需实施背压 (back-pressure) 通常,我们应该保证系统只去处理其能力范围内的数据,而不要超负荷 “消费”,进而导致进程中断 “挂起”,或出现 Consume group 的溢出。 如果是在 Java 虚拟机 (JVM) 中运行,Consumers 应当使用固定大小的缓冲区,而且最好是使用堆外内存(off-heap)。请参见 Disruptor 模式:http://lmax-exchange.github.io/disruptor/files/Disruptor-1.0.pdf 固定大小的缓冲区能够阻止 Consumer 将过多的数据拉到堆栈上,以至于 JVM 花费掉其所有的时间去执行垃圾回收,进而无法履行其处理消息的本质工作。 #### ⑥在 JVM 上运行各种 Consumers 时,请警惕垃圾回收对它们可能产生的影响 例如,长时间垃圾回收的停滞,可能导致 ZooKeeper 的会话被丢弃、或 Consumer group 处于再均衡状态。 对于 Broker 来说也如此,如果垃圾回收停滞的时间太长,则会产生集群掉线的风险。 #### 针对 Producers 的最佳实践 #### ⑦配置 Producer,以等待各种确认 籍此 Producer 能够获知消息是否真正被发送到了 Broker 的分区上。在 Kafka 的 0.10.x 版本上,其设置是 Acks; 而在 0.8.x 版本上,则为 request.required.acks。 Kafka 通过复制,来提供容错功能,因此单个节点的故障、或分区 Leader 关系的更改不会影响到系统的可用性。 如果您没有用 Acks 来配置 Producer(或称 “fireand forget”) 的话,则消息可能会悄然丢失。 #### ⑧为各个 Producer 配置 Retries 其默认值为 3,当然是非常低的。不过,正确的设定值取决于您的应用程序,即:就那些对于数据丢失零容忍的应用而言,请考虑设置为 Integer.MAX_VALUE(有效且最大)。 这样将能够应对 Broker 的 Leader 分区出现无法立刻响应 Produce 请求的情况。 #### ⑨为高吞吐量的 Producer,调优缓冲区的大小 特别是 buffer.memory 和 batch.size(以字节为单位)。由于 batch.size 是按照分区设定的,而 Producer 的性能和内存的使用量,都可以与 Topic 中的分区数量相关联。 因此,此处的设定值将取决于如下几个因素: * Producer 数据速率 (消息的大小和数量) * 要生成的分区数 * 可用的内存量 请记住,将缓冲区调大并不总是好事,如果 Producer 由于某种原因而失效了 (例如,某个 Leader 的响应速度比确认还要慢),那么在堆内内存(on-heap) 中的缓冲的数据量越多,其需要回收的垃圾也就越多。 #### ⑩检测应用程序,以跟踪诸如生成的消息数、平均消息大小、以及已使用的消息数等指标 #### 针对 Brokers 的最佳实践 #### ⑪在各个 Brokers 上,请压缩 Topics 所需的内存和 CPU 资源。 日志压缩 (请参见 https://kafka.apache.org/documentation/#compaction) 需要各个 Broker 上的堆栈 (内存) 和 CPU 周期都能成功地配合实现而如果让那些失败的日志压缩数据持续增长的话,则会给 Brokers 分区带来风险。 您可以在 Broker 上调整 log.cleaner.dedupe.buffer.size 和 log.cleaner.threads 这两个参数,但是请记住,这两个值都会影响到各个 Brokers 上的堆栈使用。 如果某个 Broker 抛出 OutOfMemoryError 异常,那么它将会被关闭、并可能造成数据的丢失。 而缓冲区的大小和线程的计数,则取决于需要被清除的 Topic Partition 数量、以及这些分区中消息的数据速率与密钥的大小。 对于 Kafka 的 0.10.2.1 版本而言,通过 ERROR 条目来监控日志清理程序的日志文件,是检测其线程可能出现问题的最可靠方法。 #### ⑫通过网络吞吐量来监控 Brokers 请监控发向 (transmit,TX) 和收向 (receive,RX) 的流量,以及磁盘的 I/O、磁盘的空间、以及 CPU 的使用率,而且容量规划是维护群集整体性能的关键步骤。 #### ⑬在群集的各个 Brokers 之间分配分区的 Leader 关系 Leader 通常会需要大量的网络 I/O 资源。例如,当我们将复制因子 (replication factor) 配置为 3、并运行起来时。 Leader 必须首先获取分区的数据,然后将两套副本发送给另两个 Followers,进而再传输到多个需要该数据的 Consumers 上。 因此在该例子中,单个 Leader 所使用的网络 I/O,至少是 Follower 的四倍。而且,Leader 还可能需要对磁盘进行读操作,而 Follower 只需进行写操作。 #### ⑭不要忽略监控 Brokers 的 in-sync replica(ISR)shrinks、under-replicatedpartitions 和 unpreferred leaders 这些都是集群中潜在问题的迹象。例如,单个分区频繁出现 ISR 收缩,则暗示着该分区的数据速率超过了 Leader 的能力,已无法为 Consumer 和其他副本线程提供服务了。 #### ⑮按需修改 Apache Log4j 的各种属性 详细内容可以参考:https://github.com/apache/kafka/blob/trunk/config/log4j.properties Kafka 的 Broker 日志记录会耗费大量的磁盘空间,但是我们却不能完全关闭它。 因为有时在发生事故之后,需要重建事件序列,那么 Broker 日志就会是我们最好的、甚至是唯一的方法。 #### ⑯禁用 Topic 的自动创建,或针对那些未被使用的 Topics 建立清除策略 例如,在设定的 x 天内,如果未出现新的消息,您应该考虑该 Topic 是否已经失效,并将其从群集中予以删除。此举可避免您花时间去管理群集中被额外创建的元数据。 #### ⑰对于那些具有持续高吞吐量的 Brokers,请提供足够的内存,以避免它们从磁盘子系统中进行读操作 我们应尽可能地直接从操作系统的缓存中直接获取分区的数据。然而,这就意味着您必须确保自己的 Consumers 能够跟得上 “节奏”,而对于那些延迟的 Consumer 就只能强制 Broker 从磁盘中读取了。 #### ⑱对于具有高吞吐量服务级别目标 (service level objectives,SLOs) 的大型群集,请考虑为 Brokers 的子集隔离出不同的 Topic 至于如何确定需要隔离的 Topics,则完全取决于您自己的业务需要。例如,您有一些使用相同群集的联机事务处理 (multipleonline transaction processing,OLTP) 系统。 那么将每个系统的 Topics 隔离到不同 Brokers 子集中,则能够有助于限制潜在事件的影响半径。 #### ⑲在旧的客户端上使用新的 Topic 消息格式。应当代替客户端,在各个 Brokers 上加载额外的格式转换服务 当然,最好还是要尽量避免这种情况的发生。 #### ⑳不要错误地认为在本地主机上测试好 Broker,就能代表生产环境中的真实性能了 要知道,如果使用复制因子为 1,并在环回接口上对分区所做的测试,是与大多数生产环境截然不同的。 在环回接口上网络延迟几乎可以被忽略的,而在不涉及到复制的情况下,接收 Leader 确认所需的时间则同样会出现巨大的差异。 #### 总结 希望上述各项建议能够有助于您更有效地去使用 Kafka。如果您想提高自己在 Kafka 方面的专业知识,请进一步查阅 Kafka 配套文档中的 “操作” 部分,其中包含了有关操作群集等实用信息。 【51CTO 原创稿件,合作站点转载请注明原文作者和出处为 51CTO.com】 ![](https://img2.tuicool.com/vquqQni.jpg!web)
Jonny
2022年5月2日 15:16
148
0 条评论
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
如遇文档失效,可评论告知,便后续更新!
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期