手动重新平衡您的 MinIO Modern Datalake

news2024/11/28 6:28:54

当通过添加新的服务器池来扩展 MinIO Modern Datalake 部署时,默认情况下它不会重新平衡对象。相反,MinIO 会将新文件/对象写入具有更多可用空间的池中。MinIO 的手动重新平衡触发器会扫描整个部署,然后在服务器池周围移动对象(如果需要),以确保所有池之后几乎处于相似的可用空间级别。对于 MinIO 部署来说,这是一项代价高昂的操作,应明智地触发。尽管可以随时停止和重新启动再平衡。

在独立部署中模拟重新平衡方案并不容易,无论是基于种类的集群还是使用目录作为驱动器的独立部署。为了真正触发重新平衡,我们需要将现有池填充到几乎满,然后在添加新的服务器池后,手动触发重新平衡。因此,使用虚拟机模拟此方案总是更容易、更好。

对于快速简便的开发人员模式来模拟再平衡,LXD(Linux 容器虚拟机管理程序)是一个不错的选择。本博客将列出所需的设置,并描述如何实现模拟再平衡的过程。

设置基础结构

按照以下步骤模拟 MinIO 现代数据湖部署中的再平衡。为此,我们应该使用 ubuntu 旋转总共 8 个 LXD VM。我们将使用前 4 个 VM 启动初始 MinIO 实例,然后使用接下来的 4 个 VM 进行扩展。为了限制可加载的对象的大小,我们将使用主机中的环回设备将大小为 1GiB 的虚拟磁盘添加到所有 VM。那么,让我们开始吧!!请按照以下步骤操作。

LXD 作为 snap 包正式提供,因此请先安装 snapd。

$ sudo apt install snapd

$ sudo ln -s /var/lib/snapd/snap /snap

$ snap version

$ sudo systemctl restart snapd.service


现在安装 lxd。


$ sudo snap install lxd

验证安装并启动 LXD。


$ sudo snap enable lxd

$ sudo snap services lxd

$ sudo snap start lxd

将您的用户名添加到 lxd 组。


$ sudo usermod -a -G lxd <USERNAME>

$ id <USERNAME>

$ newgrp lxd

初始化 LXD。


$ lxd init

这将带您完成一组问题,并且大多数默认问题都可以被接受。


Would you like to use LXD clustering? (yes/no) [default=no]:

Do you want to configure a new storage pool? (yes/no) [default=yes]:

Name of the new storage pool [default=default]:

Name of the storage backend to use (btrfs, ceph, dir, lvm) [default=btrfs]:

Create a new BTRFS pool? (yes/no) [default=yes]:

Would you like to use an existing block device (yes/no) [default=no]:

Size in GB of the new block device (1GB minimum) (default=30GB):

Would you like to connect to a MAAS server (yes/no) [default=no]:

Would you like to create a new local network bridge (yes/no) [default=yes]:

What should new bridge be called (default=lxdbr0):

What IPv4 address should be used? (CIDR subnet notation, "auto" or "none") [default=auto]:

What IPv6 address should be used? (CIDR subnet notation, "auto" or "none") [default=auto]: none

Would you like LXD to be available over the network? (yes/no) [default=no]:

Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:

Would you like a YAML "lxd init" pressed to be printed? (yes/no) [default=no]:

使用以下命令创建 VM。


$ lxc init images:ubuntu/jammy vm-01 --profile=default -c boot.autostart=true -c security.privileged=true -c security.syscalls.intercept.mount=true -c security.syscalls.intercept.mount.allowed=ext4 -c limits.memory=1024MB -c limits.cpu.allowance=10%

$ lxc start vm-01

对所有 8 个 VM 重复这些命令。现在,要使所有 IPv4 IP 都符合 VM 的要求,请执行以下命令来重置其 IP。


$ lxc stop vm-01

$ lxc network attach lxdbr0 vm-01 eth0 eth0

$ lxc config device set vm-01 eth0 ipv4.address 10.115.111.111

$ lxc start vm-01

同样,对于其他 VM,IP 可以设置为 10.115.111.112、10.115.111.113 和 …。

立即进入 VM 内部,创建 1GiB 大小的虚拟磁盘映像,并使用 mkfs.ext4 对其进行格式化。此外,还要从主机为环回设备创建挂载路径。


$ lxc exec vm-01 bash

$ truncate -s 1GiB /media/disk.img

$ mkfs.ext4 /media/disk.img

$ mkdir /mnt/virtual-disk

对所有 VM 重复此操作。

现在,我们将可用的环回设备从主机附加到 VM。这些只是以 /dev/loop* 形式列出的文件,不一定所有列出的文件都可以使用。如果在 VM 中挂载时遇到问题 mount: /mnt/virtual-disk: failed to setup loop device for /media/disk.img., create a new loopback device on host and try with the new one.使用命令 sudo losetup -f 获取要使用的新空闲环回设备。按照以下步骤在虚拟机中附加和装载环路设备


$ lxc config device add vm-01 loop-control unix-char path=/dev/loop-control

$ lxc config device add vm-01 loop4 unix-block path=/dev/loop4

从 VM 内部 ,立即挂载。


$ lxc exec vm-01 bash

$ mount -t ext4 -o loop /media/disk.img /mnt/virtual-disk

对所有 VM 重复此过程。若要验证装载是否成功,请在 VM 中运行以下命令。


$ mount | grep virtual-disk

/media/disk.img on /mnt/virtual-disk type ext4 (rw,realtime)

VM 现在已准备就绪,我们可以开始 MinIO 部署了

设置 MinIO

我们需要创建许多对象,稍后将这些对象推送到 MinIO 存储桶。在主机节点上执行以下命令


$ mkdir -p $HOME/test-minio-rebal

$ cd $HOME/test-minio-rebal

$ for index in {1..4500}; do truncate -s 1M file$index; done

这将创建 4500 个随机文件,每个文件大小为 1M。

在所有 VM 上安装 MinIO 二进制文件


$ wget -O https://dl.min.io/server/minio/release/linux-amd64/minio

$ chmod +x minio

$ mv minio /usr/local/bin

MinIO 客户端可以安装在主机本身上。


$ wget -O https://dl.min.io/client/mc/release/linux-amd64/mc

$ chmod +x mc

$ sudo mv mc /usr/local/bin


启动 MinIO 实例并加载对象。首先获取所有正在运行的 lxc VM 的列表,并记下其 IPv4 IP。


$ lxc list

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| NAME  |  STATE  |    	IPV4     	|                 	IPV6                 	|   TYPE	| SNAPSHOTS |

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-01 | RUNNING | 10.49.238.61 (eth0) | fd42:9cd0:6055:a53:216:3eff:fef3:f0f (eth0)  | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-02 | RUNNING | 10.49.238.62 (eth0) | fd42:9cd0:6055:a53:216:3eff:fe16:4d04 (eth0) | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-03 | RUNNING | 10.49.238.63 (eth0) | fd42:9cd0:6055:a53:216:3eff:fe34:44cd (eth0) | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-04 | RUNNING | 10.49.238.64 (eth0) | fd42:9cd0:6055:a53:216:3eff:fef9:4262 (eth0) | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-05 | RUNNING | 10.49.238.65 (eth0) | fd42:9cd0:6055:a53:216:3eff:fe16:2e02 (eth0) | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-06 | RUNNING | 10.49.238.66 (eth0) | fd42:9cd0:6055:a53:216:3eff:fe94:4610 (eth0) | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-07 | RUNNING | 10.49.238.67 (eth0) | fd42:9cd0:6055:a53:216:3eff:fef1:40f3 (eth0) | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

| vm-08 | RUNNING | 10.49.238.68 (eth0) | fd42:9cd0:6055:a53:216:3eff:fef5:d909 (eth0) | CONTAINER | 0     	|

+-------+---------+---------------------+----------------------------------------------+-----------+-----------+

现在使用前四个 VM 启动 MinIO 实例,如下所示。此命令应从前 4 个 VM 内部运行。


$ minio server http://10.49.238.{61...64}/mnt/virtual-disk/disk{1...4}

实例稳定后,为集群创建一个 mc 别名,如下所示。


mc alias set ALIAS http://10.49.238.61:9000 minioadmin minioadmin

现在,我们已准备好将对象加载到集群中。为此运行以下命令。

$ mc mb ALIAS/test-bucket

$ mc cp $HOME/test-minio-rebal/* ALIAS/test-bucket

您可能会在最后看到磁盘上没有留下更多空间的错误,这很好,因为群集现在已加载到对象的极限。等待几秒钟,并验证对象是否已加载到池中。


$ mc admin info ALIAS --json | jq -r '.info.pools'

{                                                                                                          	 

  "0": {                                                                                                          	 

	"0": {                                                                                                          	 

  	"id": 0,                                                                                                          	 

  	"rawUsage": 3785478144,                                                                                                          	 

  	"rawCapacity": 3800956928,                                                                                                          	 

  	"usage": 1155530752,                                                                                                          	 

  	"objectsCount": 1102,                                                                                                          	 

  	"versionsCount": 0,                                                                                                          	 

  	"healDisks": 0                                                                                                          	 

	}                                                                                                          	 

  }                                                                                                         	 

}

现在,我们都可以使用一组新节点来扩展集群。停止前 4 个 VM 上的 MiniIO 进程,现在从所有 8 个 VM 运行以下命令。


$ minio server http://10.49.238.{61...64}/mnt/virtual-disk/disk{1...4} http://10.49.238.{65...68}/mnt/virtual-disk/disk{1...4}

让群集稳定下来,并检查是否添加了新池。


$ mc admin info ALIAS --json | jq -r '.info.pools'

{

  "0":

	"0": {                                                                                                                                                              	 

  	"id": 0,                                                                                                                                                          	 

  	"rawUsage": 3785478144,                                                                                                                                           	 

  	"rawCapacity": 3800956928,                                                                                                                                        	 

  	"usage": 1155530752,                                                                                                                                              	 

  	"objectsCount": 1102,                                                                                                                                             	 

  	"versionsCount": 0,                                                                                                                                               	 

  	"healDisks": 0                                                                                                                                                    	 

	}                                                                                                                                                                   	 

  },                                                                                                                                                                    	 

  "1": {                                                                                                                                                                	 

	"0": {                                                                                                                                                              	 

  	"id": 0,                                                                                                                                                          	 

  	"rawUsage": 376832,                                                                                                                                               	 

  	"rawCapacity": 3800956928,                                                                                                                                        	 

  	"usage": 0,                                                                                                                                                       	 

  	"objectsCount": 0,                                                                                                                                                	 

  	"versionsCount": 0,                                                                                                                                               	 

  	"healDisks": 0                                                                                                                                                    	 

	}                                                                                                                                                                   	 

  }                                                                                                                                                                     	 

}

现在,您可以安全地在集群上运行重新平衡。


$ mc admin rebalance start ALIAS

您可以跟踪运行中的再平衡状态,如下所示。


$ mc admin rebalance status ALIAS

Per-pool usage:

┌─────────┬────────┐

│ Pool-0  │ Pool-1      │

│ 0.85% * │ 0.14%       │

└─────────┴────────┘

Summary:

Data: 390 MiB (195 objects, 195 versions)

Time: 11.40798155s (52.794879439s to completion)

一旦重新平衡完成并且不再有对象要移动,您应该能够验证如下所示。


$ mc admin info ALIAS --json | jq -r '.info.pools'

{

  "0": {

	"0": {

  	"id": 0,

  	"rawUsage": 2029391872,

  	"rawCapacity": 3800956928,

  	"usage": 1394606080,

  	"objectsCount": 1330,

  	"versionsCount": 0,

  	"healDisks": 0

	}

  },

  "1": {

	"0": {

  	"id": 0,

  	"rawUsage": 1756606464,

  	"rawCapacity": 3800956928,

  	"usage": 435159040,

  	"objectsCount": 415,

  	"versionsCount": 0,

  	"healDisks": 0

	}

  }

}

就这么简单。

最后的思考

通常,在添加或删除新池时,MinIO 不需要任何手动重新平衡。MinIO 足够智能,可以在空间可用时添加新数据,同时牢记纠删码要求。重新平衡是一项非常耗费资源的操作,因此不建议在集群使用最多的高峰时段运行它。相反,如果需要重新平衡集群,则必须在集群使用最少的下班时间完成。

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

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

相关文章

textarea标签改写为富文本框编辑器KindEditor

下载 - KindEditor - 在线HTML编辑器 KindEditor的简单使用-CSDN博客 一、 Maven需要的依赖&#xff1a; 如果依赖无法下载&#xff0c;可以多添加几个私服地址&#xff1a; 在Maven框架中加入镜像私服 <mirrors><!-- mirror| Specifies a repository mirror site to…

编程书籍的枯燥真相:你也有同样的感受吗?

讲动人的故事,写懂人的代码 我得实话实说,你可能已经发现市面上的大部分编程入门书籍有些枯燥。这个问题的根源在于许多作者把本应该充满乐趣和吸引力的入门指南,写得就像一本沉闷的参考手册。这就好比把一本充满冒险和乐趣的旅行日记,写成了一本单调乏味的字典。 我完全理…

Apache Paimon系列之:Append Table和Append Queue

Apache Paimon系列之&#xff1a;Append Table和Append Queue 一、Append Table二、Data Distribution三、自动小文件合并四、Append Queue五、压缩六、Streaming Source七、Watermark Definition八、Bounded Stream 一、Append Table 如果表没有定义主键&#xff0c;则默认为…

密码学及其应用 —— 密码学概述

1 安全属性和机制 1.1 基本概念 1.1.1 三个核心概念 在讨论信息安全时&#xff0c;我们通常会谈到三个核心概念&#xff1a;保密性、完整性和可用性。这三个概念共同构成了信息安全的基础。 保密性&#xff1a;指的是确保信息只能被授权的人员访问。这就意味着信息在存储、传…

【React】AntD组件的使用--极客园--02.登录模块

基本结构搭建 实现步骤 在 Login/index.js 中创建登录页面基本结构在 Login 目录中创建 index.scss 文件&#xff0c;指定组件样式将 logo.png 和 login.png 拷贝到 assets 目录中 代码实现 pages/Login/index.js import ./index.scss import { Card, Form, Input, Button }…

AI语言文字工具类API实现自动化的写作

热门实用的AI语言文字工具类API是当今开发者们追逐的宝藏。这些API利用先进的人工智能和自然语言处理技术&#xff0c;为开发者提供了一系列实用而强大的语言文字处理能力。这些API包括了文本翻译、情感分析、智能写作、关键词提取、语言检测等功能&#xff0c;使得开发者能够轻…

使用java +paho mqtt编写模拟发布温度及订阅的过程

启动mqtt 服务 创建项目&#xff0c;在项目中添加模块 添加文件夹 添加maven依赖 <dependencies><dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.0<…

提升研发效率:三品PLM解决方案在汽车汽配行业的实践

随着全球汽车市场的快速发展&#xff0c;中国汽车汽配行业迎来了前所未有的发展机遇。然而&#xff0c;在这一过程中&#xff0c;企业也面临着诸多挑战&#xff0c;如研发能力的提升、技术资料管理的复杂性、以及跨部门协作的困难等。为了应对这些挑战&#xff0c;三品产品生命…

90V转12V1A恒压WT6039

90V转12V1A恒压WT6039 WT6039降压DC-DC转换器芯片专为处理宽泛的电压输入范围设计&#xff0c;支持从12V至90V。该芯片集成了关键功能&#xff0c;如使能控制开关、参考电源、误差放大器、过热保护、限流保护及短路保护等&#xff0c;以确保系统在各种操作条件下的安全与稳定性…

NSSCTF-Web题目14

目录 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 1、题目 2、知识点 3、思路 [HDCTF 2023]SearchMaster 1、题目 2、知识点 3、思路 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 这两道题目一样 1、题目 2、知识点 SSTI&#xff08;服务端模板注入漏洞&…

攻防世界-2-1

下载附件&#xff0c;发现是一张损坏的png文件&#xff0c;扔winhex里面修改文件头 修改之后发现还是打不开&#xff0c;提示CRC错误&#xff0c;脚本跑一下 循环冗余校验CRC&#xff08;Cyclic Redundancy Check&#xff09;是数据通信领域常用的一种数据传输检错技术。通过在…

企业级Web项目中应该如何做单元测试、集成测试和功能测试?

先自我介绍下&#xff1a; 本人有过10年测试经验&#xff0c;也参与过公安部网络安全产品测试交付、华为4G 网络设备测试交付、腾讯QQ空间APP产品测试交付。 关于“企业级Web项目中应该如何做单元测试、集成测试和功能测试”这个问题&#xff0c;我想给大家唠唠&#xff0c;我…

kafka(五)spring-kafka(2)详解与demo

一、简单的收发消息demo 父工程pom&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

外包IT运维解决方案

随着企业信息化进程的不断深入&#xff0c;IT系统的复杂性和重要性日益增加。高效的IT运维服务对于保证业务连续性、提升企业竞争力至关重要。外包IT运维解决方案通过专业的服务和技术支持&#xff0c;帮助企业降低运维成本、提高运维效率和服务质量。 本文结合《外包IT运维解…

Go语言的诞生背景

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

数字营销新玩法:拓新与裂变的完美结合

在当今这个飞速发展的数字化时代&#xff0c;数字营销已经成为了企业发展中至关重要的一环。拓新&#xff0c;简单来说就是不断去开拓新的客户群体&#xff0c;让更多的人了解并接触到我们的产品或服务。要做到这一点&#xff0c;那可得充分利用各种线上渠道。像热闹非凡的社交…

设计模式(七)创建者模式之建造者模式

这里写目录标题 概述需求需求类图BikeBuilderMobikeBuilderOfoBuilderDirectorClientClient优缺点使用场景 模式扩展ComputerClient创建者模式对比工厂方法模式VS建造者模式抽象工厂模式VS建造者模式 总结 概述 建造者模式又叫生成器模式&#xff0c;是一种对象构建模式。它可…

threejs视频融合 webgl

threejs三维视频融合 let objList []; const clock new THREE.Clock(); const container document.getElementById( container );const stats new Stats(); container.appendChild( stats.dom );const renderer new THREE.WebGLRenderer( { antialias: true } ); rendere…

Day1:二分查找704 移除元素27

题目链接704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;int mid (right - left) / 2;while (left < right){if (target nums[mid]){return mid;}else if (target …

代码阅读器--Understand

代码阅读器--Understand 1 介绍2 安装步骤2.1 下载连接2.2 正常安装&#xff0c;设置自己的安装路径2.3 修改 understand.exe&#xff0c;搜索"areYouThere" &#xff0c; 用"IamNotHere!" 替代2.4 字节序替换 3 使用参考 1 介绍 Understand 的强大不言而…