最近遇到的疑难现场问题层出不穷,本次遭遇的挑战是在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,要注意对几级存储容量的把握。
- 虚拟机所在物理分区大小 P 字节。
- 虚拟机物理磁盘文件 vmdk 或者 vdi 的总最大尺寸 Q 字节。
- 虚拟机内 kafka 的 log 文件夹所在的分区尺寸R 字节。
- 虚拟机内 kafka 准备预留的日志天数 (或者估算大小) S 字节。
要确保:
- 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
安装上去后,果然是方便的不行:
注意,在调整前要右键单击,先卸载(相当于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配置。
- 使用静态IP地址+网关,避免VM DHCP为NAT分配活动的IP地址。
- VMNat配置后,如果还是连不通,要注意重启一下。
- windows宿主防火墙 2181,9092等端口都要打开。
4. 性能调优
宿主服务器电源模式一定是“最大性能”,包括 BIOS、UEFI、Windows的电源选项都要确保不要位于“节能”或者“平衡”。否则,VMWare等虚拟机可能趴窝。同时,使用命令
bcdedit /set hypervisorlaunchtype off
关闭windows的 Hyper-V, 否则会导致虚拟机性能恶化。
如此调整后,整体的性能很好,和物理机差别不大。