现场工程师出马:VMware+LVM卷快速在windows Server上部署Kafka集群

news2024/9/23 3:28:32

最近遇到的疑难现场问题层出不穷,本次遭遇的挑战是在4台windows Server 服务器上部署Kafka集群。这是一种比较少见的操作,原因是有些依赖的驱动对虚拟化支持不好,只能运行在实体win机上。

原有的上层业务是由B团队开发+运维,现在B团队自己独立出去单干,需要把B团队的业务流转移到这4台windows 服务器上。因为老丁同学介绍,我现场指导了这次迁移,并不顺利,特此记录。

1. windows Kafka 存在BUG

首次迁移,考虑到Kafka吞吐量可能较大,如果没有踩过坑的,可能会准备直接使用 java + kafka 在windows下进行搭建。毕竟官网上下载的kafka是带有windows文件夹的。

这种做法是有大坑的。当windows下的kafka实例进行过期日志删除时,会遇到无法删除文件而导致的重启异常。这种异常在消息队列进入滚动删除窗口后,会频繁发生。

ERROR Failed to clean up log for topic.1bc-0 in dir F:\tmp\kafka-logs

原因在于kafka检测到log已经过期,把它更名为 .deleted 时,文件还被占用。这个问题其实已经存在很久了,这个帖子里就有类似的讨论。

2. 虚拟机的存储配置

2.1 各级容量预估

windows 物理系统+Linux虚拟机运行Kafka,要注意对几级存储容量的把握。

  1. 虚拟机所在物理分区大小 P 字节。
  2. 虚拟机物理磁盘文件 vmdk 或者 vdi 的总最大尺寸 Q 字节。
  3. 虚拟机内 kafka 的 log 文件夹所在的分区尺寸R 字节。
  4. 虚拟机内 kafka 准备预留的日志天数 (或者估算大小) S 字节。

要确保:

  1. 0.9P >= Q. 这一点要非常警惕。即使 R << P,但是 Q>P,等到系统运行一段时间后,也会挂。这是因为虚拟机的磁盘文件是会不断长大的。虚拟机内的OS把“大小”为Q的vmdk文件当成物理磁盘,而虚拟机OS在使用磁盘时,为了避免碎片化,会不断地朝着尾部放置新文件。这就导致即使虚拟机的磁盘一直不满,但频繁增删后,导致虚拟机磁盘文件(*.vmdk)的size达到上限。

正如下图所示,虽然Kafka旧的日志在后一时刻删除,但新写入的日志并不是填充了文件的开始位置,而是继续沿着向前的方向增长。这导致VMDK文件实际上越来越大。如果一个号称1TB的vmdk文件,放在一个100GB的物理磁盘上,即使kafka的日志只保留1小时,也会逐渐挤爆物理磁盘。

在这里插入图片描述2. 0.9R >= S. 这是说虚拟机kafka的配额不能设置的太紧凑。比如日志一天要10GB,80GB的分区,最好不要设置为7天才删除,设置一个5天比较好。因为有些业务逻辑或者高峰订单可能突然产生很多专题数据。

2.2. 为虚拟机增加虚拟盘阵

VMWare的虚拟机磁盘单个最大支持8TB。换到以前,一般的节点足够了。但现在很多服务器都是32TB起步的。此外,像这种想把kafka当做一个半长期存储池的应用,还有64TB以上的配置。如此一来,想到利用全各个虚拟机的盘阵,就只能按照各自的容量大小,结合上面一节的限制来斟酌为每台虚拟机分配多少组磁盘。

同时,为了方便起见,我们需要统一按照最大的一台物理盘阵的规模来配置磁盘个数,而后在小盘阵机器上,按照8TB为单位进行裁剪。 LVM卷支持这种灵活的裁剪。

虚拟机磁盘把所有的数据盘全部变成 GPT物理分区,具体做法我直接问猿如意C知道,再少量结合百度,一遍搞定。

第一遍,迅速了解基本流程:

问:在 Linux 下如何把多块新磁盘变成一个整体的 LVM 卷
答:
你可以按照以下步骤在 Linux 下将多块新磁盘变成一个整体的 LVM 卷:
将新磁盘连接到电脑上并且使用 fdisk 工具来创建一个新的分区。
将创建的新分区标注为 LVM 类型。
使用 pvcreate 命令来创建一个物理卷,并将新分区添加到该物理卷中。
使用 vgcreate 命令来创建一个卷组,并将物理卷添加到该卷组中。
使用 lvcreate 命令来创建一个逻辑卷,并将卷组分配给该逻辑卷。
格式化逻辑卷成一个文件系统。
挂载逻辑卷到指定的目录。

完整的命令如下:
fdisk /dev/sdb
t
8e
pvcreate /dev/sdb1
vgcreate vg_data /dev/sdb1
lvcreate -L 100G -n data_lv vg_data
mkfs.ext4 /dev/mapper/vg_data-data_lv
mount /dev/mapper/vg_data-data_lv /data
注意:以上步骤仅适用于 CentOS 和 Ubuntu 等 Linux 操作系统。

第二遍,换个问法,详细查看命令再次确认。

我有三块新硬盘,插在了计算机上,被Linux系统识别为 /dev/sdc, /dev/sdd, /dev/sde。这三块硬盘都是8TB大小,请告诉我如何把他们组成一个完整的连续LVM卷,并挂载到/var/local/kafka-logs 下。


可以按照以下步骤将三块硬盘组成一个完整的连续LVM卷,并挂载到/var/local/kafka-logs下:

首先,在Linux系统中打开终端,输入命令sudo fdisk -l,查看硬盘识别情况。

确认三块硬盘的设备名称,即/dev/sdc, /dev/sdd, /dev/sde。

输入命令sudo pvcreate /dev/sdc /dev/sdd /dev/sde,创建物理卷。

输入命令sudo vgcreate vg_kafka /dev/sdc /dev/sdd /dev/sde,创建卷组vg_kafka。

输入命令sudo lvcreate -n lv_kafka -l 100%FREE vg_kafka,创建逻辑卷lv_kafka,其大小为三块硬盘总容量。

输入命令sudo mkfs.ext4 /dev/vg_kafka/lv_kafka,格式化逻辑卷。

将逻辑卷挂载到/var/local/kafka-logs下,输入命令sudo mkdir /var/local/kafka-logs;sudo mount /dev/vg_kafka/lv_kafka /var/local/kafka-logs。

如果需要开机自动挂载,可以编辑/etc/fstab文件,在其中添加以下一行内容:
/dev/vg_kafka/lv_kafka /var/local/kafka-logs ext4 defaults 0 0

以上步骤完成后,三块硬盘就被组成了一个完整的连续LVM卷,并挂载到了/var/local/kafka-logs下。

做完后,虚拟机里就有了一个24TB的LVM虚拟盘。

2.3 使用 LVM的图形化工具进行逐机调整

由于后续要在各个服务器上按需裁剪,我们还是希望有个图形界面。用哪个呢?以前一直用KDE的partitionmanager,非常好用:

$ sudo pacman -S partitionmanager

安装上去后,果然是方便的不行:
KDE partition manager 注意,在调整前要右键单击,先卸载(相当于umount)挂载的LVM分区。否则很多选项都是灰色的。这个东西最棒的是还会授之与渔,每次做完后,日志把每步等效的命令都列出来了。
在这里插入图片描述

KDE 分区管理器:SMART 状态报告
日期: 	2023/5/11 上午4:30
程序版本: 	22.12.3
后端程序: 	pmsfdiskbackendplugin (1)
KDE 程序框架版本: 	5.103.0
机器: 	Linux user-kafka 6.1.25-1-MANJARO #1 SMP PREEMPT_DYNAMIC Thu Apr 20 13:48:36 UTC 2023 x86_64

将分区 “/dev/kafka/kafka” 从 46.87 TiB 缩小为 7.81 GiB
任务:检查分区 “/dev/kafka/kafka” 的文件系统
命令:e2fsck -f -y -v /dev/kafka/kafka
检查分区 “/dev/kafka/kafka” 的文件系统:成功
任务:调整分区 “/dev/kafka/kafka” 的文件系统大小为 2,000 个扇区

正在将文件系统的大小从 12,287,994 个扇区调整为 2,000 个扇区。


命令:resize2fs /dev/kafka/kafka 16384000s
调整分区 “/dev/kafka/kafka” 的文件系统大小为 2,000 个扇区:成功
任务:设置分区 “/dev/kafka/kafka” 的物理结构:起始扇区:0,长度:2,000
命令:lvm lvresize --force --yes --extents 2000 /dev/kafka/kafka
设置分区 “/dev/kafka/kafka” 的物理结构:起始扇区:0,长度:2,000:成功
任务:检查分区 “/dev/kafka/kafka” 的文件系统
命令:e2fsck -f -y -v /dev/kafka/kafka
检查分区 “/dev/kafka/kafka” 的文件系统:成功
将分区 “/dev/kafka/kafka” 从 46.87 TiB 缩小为 7.81 GiB:成功

最终,确认超过物理盘阵大小的虚拟磁盘都被移除物理卷组:
在这里插入图片描述
注意!这一步很关键,否则虚拟机的磁盘还是可能会增大,那是因为LVM以条带模式运用物理磁盘时,还是会使用所有的组内物理磁盘。

3. 下载并配置 kafka

这里采用官网傻瓜化安装,配置集群。需要注意的是跨网段的问题。Kafka如果希望同时多台网卡使用,且在虚拟机NAT模式下,尤其要注意VMWare 的 NAT配置。

  1. 使用静态IP地址+网关,避免VM DHCP为NAT分配活动的IP地址。
  2. VMNat配置后,如果还是连不通,要注意重启一下。
  3. windows宿主防火墙 2181,9092等端口都要打开。

4. 性能调优

宿主服务器电源模式一定是“最大性能”,包括 BIOS、UEFI、Windows的电源选项都要确保不要位于“节能”或者“平衡”。否则,VMWare等虚拟机可能趴窝。同时,使用命令

bcdedit /set hypervisorlaunchtype off

关闭windows的 Hyper-V, 否则会导致虚拟机性能恶化。

如此调整后,整体的性能很好,和物理机差别不大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

今年的博客数量上两百了

今年的博客数量上两百了 不知不觉在 C S D N CSDN CSDN中写了那么多篇文章。与 C S D N CSDN CSDN相伴的生活中&#xff0c;我过得很充实。

并发编程10:Java对象内存布局和对象头

文章目录 10.1 面试题10.2 Object object new Object()谈谈你对这句话的理解&#xff1f;10.3 对象在堆内存中布局10.3.1 权威定义----周志明老师JVM10.3.2 对象在堆内存中的存储布局 10.4 再说对象头的MarkWord10.5 聊聊Object obj new Object()10.5.1 运行结果展示10.5.2 压…

C++入门(命名空间、缺省参数、函数重载、引用、内联函数)

全文目录 引言C输入与输出命名空间概念使用使用域作用限定符::使用某个成员使用using namespace 引入整个命名空间域使用using引入某个成员 缺省参数概念分类 函数重载定义与调用原理 引用定义需要注意 使用引用作为返回型参数引用作为返回值 引用与指针的区别 内联函数总结 引…

华为OD机试真题 Java 实现【猜字谜】【2023Q2】

一、题目描述 小王设计了一人简单的清字谈游戏&#xff0c;游戏的迷面是一人错误的单词&#xff0c;比如nesw&#xff0c;玩家需要猜出谈底库中正确的单词。猜中的要求如 对于某个谜面和谜底单词&#xff0c;满足下面任一条件都表示猜中&#xff1a; 变换顺序以后一样的&…

np保存数据为txt或者csv格式

目录 1、基础参数 2、参数详解 2.1、fmt 2.2、delimiter 2.3、newline 2.4、header 1、基础参数 numpy.savetxt(fname,arrry,fmt%.18e,delimiter ,newline\n,header,footer,comments# ,encodingNone,) 2、参数详解 fname:要存入的文件、文件名、或生成器。arrry:要存储…

xxl-Job分布式任务调度 入门

1.概述 1.1 什么是任务调度 我们可以先思考一下业务场景的解决方案&#xff1a; 某电商系统需要在每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的…

C高级第二天

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,const char *argv[]) { int n 0, m 0, MAX 0; int arr[n][m]; printf("请输入矩阵行数、列数>>>"); scanf("%d%d", &n…

【动态规划】线性DP

目录 一&#xff1a;思考方式 二&#xff1a;例题 例题1&#xff1a;数字三角形 例题二&#xff1a;最长上升子序列​​​​​​​ 例题三&#xff1a;最长公共子序列 一&#xff1a;思考方式 线性dp就是一条线上的动态规划 二&#xff1a;例题 例题1&#xff1a;数字三…

Python基础(三)

目录 1、Python的输入函数input() 1、input函数介绍 1.1作用&#xff1a; 1.2返回值类型&#xff1a; 1.3值得存储&#xff1a; 2、input函数的基本使用 2、Python中的运算符 2.1算术运算符 2.1.1标准算术运算符 2.1.2取余运算符(%) 2.1.3幂运算符(**) 2.1.4特殊运…

分布式锁的多种实现方式

1、不使用分布式锁 synchronized (this){int stock Integer.parseInt(Objects.requireNonNull(stringRedisTemplate.opsForValue().get("stock")));if (stock > 0) {int realStock stock - 1;// 更新库存stringRedisTemplate.opsForValue().set("stock&qu…

vi编辑器的三种模式及其对应模式下常用指令

vi是Linux系统的第一个全屏幕交互式编辑工具&#xff0c;在嵌入式的 学习中是一个不可或缺的强大的文本编辑工具。 一、三种模式 命令模式 如何进入命令模式&#xff1a;按esc键 复制&#xff1a;yy nyy(n&#xff1a;行数) 删除(剪切): dd ndd 粘贴&#xff1a;p 撤销&…

【Java】java | 将可运行jar打包成exe可执行文件

一、说明 1、javafx桌面程序&#xff0c;但又不想安装jre环境 2、需要将可执行jar打包成exe 3、使用工具exe4j 二、操作步骤 1、下载exe4j https://exe4j.apponic.com/ 2、安装 说明1&#xff1a; 在d盘建个exe4j的文件夹 说明2&#xff1a; 建个output文件jar&#xff0c;存放…

计算机组成原理——计算机系统的组成

一台完整的计算机包括硬件和软件两部分&#xff0c;另外还有一部分固话的软件成为固件(Frimware)&#xff0c;固件兼具软件和硬件的特性&#xff0c;常见的如个人计算机中的BIOS&#xff0c;BIOS&#xff08;Basic Input/Output System&#xff09;是个人计算机上的一个基本输入…

React 路由

React 的路由跳转需要引用第三方的 React Router npm i react-router-dom5.2.0 React Router 分为 BrowserRouter 和 HashRouter 如果我们的应用有服务器响应 web 的请求&#xff0c;建议使用<BrowserRouter>组件; 如果使用静态文件服务器&#xff0c;建议使用<Hash…

[golang gin框架] 29.Gin 商城项目-用户登录,注册操作

一.用户登录,注册界面展示说明 先看登录,注册界面以及相关流程,再根据流程写代码,一般网站的登录,注册功能都会在一个页面进行操作,还有的是在几个页面进行操作,这里讲解在几个页面进行注册的操作,步骤如下: 登录: 1.点击 登录按钮,进入登录界面 2.在登录界面输入手机号,密码,图…

Linux内核中与“文件系统”相关的数据结构

文件系统相关的数据结构 4.1 file结构体 文件结构体代表一个打开的文件&#xff0c;系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建&#xff0c;并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后&#xff0c;内核释放这…

【Flink】DataStream API使用之源算子(Source)

源算子 创建环境之后&#xff0c;就可以构建数据的业务处理逻辑了&#xff0c;Flink可以从各种来源获取数据&#xff0c;然后构建DataStream进项转换。一般将数据的输入来源称为数据源&#xff08;data source&#xff09;&#xff0c;而读取数据的算子就叫做源算子&#xff08…

【vue3】06-vue的组件化开发-脚手架创建项目

文章目录 Vue的组件化组件化开发注册组件的方式vue全局组件vue局部组件 Vue的开发模式Vue CLI脚手架安装Vue CLI使用Vue CLI Vue的组件化 Vue是一款前端框架&#xff0c;在这个框架中&#xff0c;组件化开发是非常重要的。Vue的组件化就是将一个页面划分为多个独立的、可复用的…

LeetCode5. 最长回文子串

写在前面&#xff1a; 题目链接&#xff1a;LeetCode5. 最长回文子串 编程语言&#xff1a;C 题目难度&#xff1a;中等 一、题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例…

算力256TOPS,典型功耗35W,存算一体芯片杀入智能驾驶

作者 | 张祥威 编辑 | 德新 国产智驾芯片有了新玩家 “最高物理算力256 TOPS&#xff0c;典型功耗35W&#xff0c;基于12nm制程工艺。” 5月10日&#xff0c;后摩智能发布首款基于存算一体架构的智驾芯片——鸿途™H30&#xff0c;并公布上述关键指标。 算力、数据和算法&am…