MinIO线上扩容实战

硬件投入肯定是随着业务的增长而增长,这就要求中间件平台必须提供水平伸缩机制,MinIO对象存储服务也不例外,本文就详细介绍MinIO的扩容。

Minio支持通过增加新的Server Pool来扩容老的集群。每个Server Pool都是一个相对独立的故障域,一个Server Pool丢失一个或多个驱动器或节点不会影响其他Server Pool的可用性。

1.1 扩容前的先决条件

1.1.1 网络与防火墙

集群内各个节点之间网络必须是互通的,特别是要注意防火墙规则或者容器环境下的网络互通,例如可以通过如下命令放开Minio的默认Server Port:9000。

firewall-cmd --permanent --zone=public --add-port=9000/tcp
firewall-cmd --reload

注意:minio集群中所有节点必须是监听同一个端口。

如果您设置了一个静态MinIO控制台端口(例如:9001),您还必须授予对该端口的访问权限,以确保来自外部客户端的连接。MinIO强烈建议使用**负载均衡组件(Nginx)**来管理到集群的连接,负载均衡器应该使用“最少连接”算法将请求路由到MinIO部署,因为部署中的任何MinIO节点都可以接收、路由或处理客户端请求。

1.1.2 连续的主机名称

MinIO需要使用展开符号{x…y}来表示创建服务器池时的一系列MinIO主机。因此,MinIO需要使用按顺序编号的主机名来表示池中的每个MinIO服务器进程。

例如现在有minio5.example.com、minio6.example.com两个节点,我们可以使用 minio{5...6}.example.com来指定Server Pool中的所有节点。

1.1.3 本机JBOD存储与顺序挂载

MinIO强烈推荐直连的JBOD阵列,xfs格式的磁盘以获得最佳性能。

DAS (Direct-Attached Storage)与网络存储(NAS、SAN、NFS)相比具有显著的性能和一致性优势。

使用非xfs文件系统(ext4、btrfs、zfs)的部署往往具有较低的性能,同时ext4等文件存储对单个目录下的文件有个数限制,容易影响可用性。

Minio天生具有分布式存储的优势,并且内部采用纠删码,RAID或类似技术反而不能提供额外的弹性或可用性优势,而且通常会降低系统性能

请确保服务器池中的所有节点使用相同类型(NVMe、SSD或HDD)的驱动器,并且容量相同。MinIO不区分驱动器类型,也不能从混合存储类型中获益。此外。MinIO将每个驱动器的大小限制为部署中最小的驱动器所拥有的容量。例如,如果部署有15个10TB驱动器和1个1TB驱动器,MinIO将每个驱动器的容量限制为1TB。

MinIO需要使用展开符号{x…y}用来表示Server Pool中每一个节点的一组磁盘驱动器,并且要求Server Pool中所有节点的磁盘驱动器序列相同。MinIO还要求物理驱动器的顺序在重新启动时保持不变,这样给定的挂载点总是指向相同的格式化驱动器。因此,MinIO强烈建议使用/etc/fstab或类似的基于文件的挂载配置

示例如下:

MinIO线上扩容实战-开源基础软件社区

我们可以使用/mnt/disk{1…4}来指定整个驱动器范围。如果需要为驱动器设置子目录,例如minio,那可以设置为/mnt/disk{1…4}/minio。

MinIO不支持将具有已存储MinIO数据的驱动器任意迁移到新的挂载位置。

MinIO严格的写后读和写后列表一致性模型要求使用本地驱动器文件系统(xfs、ext4等)。如果底层存储卷是NFS或类似的网络连接存储卷,MinIO就不能提供一致性保证。对于需要使用网络连接存储的部署,请使用NFSv4以获得最佳效果。

1.1.4 Server Pool 纠删码一致原则(对等扩容)

MinIO要求每一个Server Pool满足erasure code settings。例如一个组原先是3台共12块盘,那扩容新增加的组,必须是是原先的倍数。

1.2 扩容注意事项

1.2.1 文件写策略

MinIO不会将对象从旧的Server Pool中自动迁移到新添加的Server Pool中,即不会进行重平衡。但是,MinIO根据存储空闲大小进行加权选择,空闲空间越大的Server Pool会承担更多的写入流量,加权值是Server Pool的空闲空间量除以所有可用池上的空闲空间。

例如目前集群有3个Server Pool:

  • Pool A has 3 TiB of free space
  • Pool B has 2 TiB of free space
  • Pool C has 5 TiB of free space

Minio分别向各个Pool中写入的概率为:

  • Pool A:30% = 3 / (3 + 2 + 5)
  • Pool B:20% = 2 / (3 + 2 + 5)
  • Pool C:50% = 5 / (3 + 2 + 5)

除了可用空间加权后,如果继续写入文件会使得磁盘使用率超过99%或者空闲的inode计数低于1000,同样不会再往该Pool中写入新文件。

如果需要,你可以使用mc admin rebalance手动启动一个rebalance过程。关于这块详细的介绍,将在后续文章中介绍。

1.2.2 机器配置相同或相似

MinIO强烈建议为新Server Pool的所有节点选择基本相似的硬件配置。确保硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)在池中的所有节点上保持一致。

因为新加入的服务集群将在Minio中充当主力,相当于热数据的主要承接,老的Server Pool基本只负责读查询,所以新Server Pool的服务性能将决定整个集群的性能。

当然,新的服务节点的配置,无需与其他组内的配置一致,因为Minio的故障域是Server Pool。

1.2.3 扩容是非破坏性的

MinIO添加新的Server Pool是需要同时重启所有的Minio nodes。MinIO强烈建议同时重启所有节点。MinIO操作是原子的,并且严格一致。因此,重新启动过程不会中断应用程序和正在进行的操作禁止滚动重启。

1.3 集群扩容

接下来分布详细介绍集群扩容的个个步骤。

Step1:在新的Server Pool中的每一个节点安装MinIO二进制文件

RPM和DEB包自动将MinIO安装到必要的系统路径上,并创建用于自动运行MinIO的systemd服务文件。MinIO强烈建议使用RPM或DEB安装

如果操作系统的架构为amd64(Intel or AMD 64-bit processors),请使用如下命令:

# RPM
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230309231613.0.0.x86_64.rpm -O minio.rpm
sudo dnf install minio.rpm
# DEB
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230309231613.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb
# Binary
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin

如果是ARM架构的操作系统,请下载对应的包。具体的安装命令与AMD64一样,下文的介绍也只基于AMD64介绍。

Step2:添加TLS/SSL证书

Minio启用TLS加密通道的话,会自动检测${USER_HOME}/.minio/certs目录下的证书(.crt)与私钥(.key)。

Systemd-managed部署的minio服务,minio.service文件中默认定义的用户名minio-user,故需要提前创建好 /home/minio-user。

  • 需要将证书放到/home/minio-user/.minio/certs目录下
  • 如果MinIO服务或客户端使用的是未知证书颁发机构(自签名或内部CA)签署的证书,则必须在每一个minio节点上将CA证书放在/home/minio-user/. minio/certs/CAs 目录下。MinIO拒绝无效的证书(不受信任、过期或格式不正确)。

如果minio.service中指定了其他用户账号,将会从该账号对应的主目录去加载证书,也可以用 minio server --certs-dir 命令来指定证书所在的目录,亦或者修改/etc/defaults/minio文件中的MINIO_OPTS变量中设置cert_dir。

运行MinIO服务器进程的systemd用户必须具有指定目录的读取和ls权限。

Step3:创建systemd服务文件

deb或rpm包会自动将systemd服务文件安装在/etc/systemd/system/minio.service。如果是基于二进制文件安装的话,需要手动在所有的minio节点上创建该文件。

minio.service文件的内容如下:

[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

minio.service文件默认创建的用户名、组都为minio-user。可以使用groupadd、useradd命令创建用户和组。下面是创建用户、组以及设置项目目录权限的示范命令:

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4

其中/mnt/disk1为minio将要使用的磁盘目录。

Step4:创建服务环境文件

可以在/etc/default/minio目录创建一个服务环境文件,Minio Server、minio.service文件会使用该目录作为所有环境变量的输入源,示例如下:

# Set the hosts and volumes MinIO uses at startup
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series,
#
# The following example starts the MinIO server with two server pools.
#
# The space delimiter indicates a seperate server pool
#
# The second set of hostnames and volumes is the newly added pool.
# The pool has sufficient stripe size to meet the existing erasure code
# parity of the deployment (2 x EC:4)
#
# The command includes the port on which the MinIO servers listen for each
# server pool.
# 多个Server Pool用空格隔开
MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio https://minio{5...12}.example.net:9000/mnt/disk{1...8}/minio"

# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.

MINIO_OPTS="--console-address :9001"

# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.

MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

# Set to the URL of the load balancer for the MinIO deployment 
# This value *must* match across all MinIO servers. If you do
# not have a load balancer, set this value to to any *one* of the
# MinIO hosts in the deployment as a temporary measure.
# 设置负载均衡器的URL,这个必须在所有节点上一致
MINIO_SERVER_URL="https://minio.example.net:9000"

关于更多的环境变量,可以参考官方文档:https://min.io/docs/minio/linux/reference/minio-server/minio-server.html#id5 后续也会再详细介绍。

Step5:基于扩容后的配置重新启动Minio

在部署的每一个节点上同时执行如下命令启动minio:

sudo systemctl restart minio.service

使用如下命令确认一下服务在线并且正常:

sudo systemctl status minio.service
# 收集stsytemctl命令运行的日志
journalctl -f -u minio.service

MinIO强烈建议同时重启所有节点。MinIO操作是原子的,并且严格一致。因此,重新启动过程不会中断应用程序和正在进行的操作。

不要执行“滚动”(例如一次一个节点)重启

Step6:更新负载均衡器中upstream(路由机制)

更新负责均衡层的配置,使得客户端流量可以路由到Minio集群中新加入的组。当然Minio内部可以自动识别新加入的组并进行负载,但毕竟增加了网络跳数。

最后可以通过MinIO Console去确认一下对象上传与下载性能。


相关内容拓展:(技术前沿)

近10年间,甚至连传统企业都开始大面积数字化时,我们发现开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

针对这类问题,低代码把某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。极大的提高了程序员的生产效率。

推荐一款程序员都应该知道的软件JNPF快速开发平台,采用业内领先的SpringBoot微服务架构、支持SpringCloud模式,完善了平台的扩增基础,满足了系统快速开发、灵活拓展、无缝集成和高性能应用等综合能力;采用前后端分离模式,前端和后端的开发人员可分工合作负责不同板块,省事又便捷。

体验官网:https://www.jnpfsoft.com/?csdn

还没有了解低代码这项技术可以赶紧体验学习!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp微信小程序点击右上角菜单分享功能权限配置

个人项目地址: SubTopH前端开发个人站 (自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面) SubTopH前端开发个人站…

IPv4,IPv6,TCP,路由

主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…

Kali 分析和管理网络

查看网络 ifconfig 命令 ┌──(root㉿kali)-[~] # eth0:有线网卡 └─# ifconfig eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.56.128 netmask 255.255.255.0 broadcast 192.168.56.255inet6 fe80::20c:29ff:feb3:7991 prefixlen 64 …

C++信息学奥赛1131:基因相关性

这段代码的功能是比较两个字符串的相似度&#xff0c;并根据给定的阈值判断是否相似。 解析注释后的代码如下&#xff1a; #include <iostream> #include <string> using namespace std;int main() {double bf; // 定义双精度浮点数变量bf&#xff0c;用于存储阈…

LED驱动型IC芯片的原理介绍

一、LED驱动器是什么 LED驱动器&#xff08;LED Driver&#xff09;&#xff0c;是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LED PN结的导通特性决定&#xff0c;它能适应的电源电压和电流变动范围十分狭窄&#xff0c;稍许偏离就可能无法点亮LED或者发光效…

10种最流行的3D模型文件格式及转换方法

3D 文件格式用于存储有关 3D 模型的信息。 你可能听说过一些最流行的格式&#xff0c;包括 STL、OBJ、FBX 和 DAE。 它们广泛应用于从视频游戏动画到工业增材制造的各种应用中。 在本文中&#xff0c;我们将考虑为什么有这么多不同的格式&#xff0c;探讨 3D 文件格式存储的四…

Code Lab - 2

pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.10.2cu102.html pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.10.2cu102.html pip install torch-geometric pip install ogb 1. PyG Datasets PyG有两个类&#xff0c;用…

学Python静不下来,看了一堆资料还是很迷茫是为什么

一、前言 最近发现&#xff0c;身边很多的小伙伴学Python都会遇到一个问题&#xff0c;就是资料也看了很多&#xff0c;也花了很多时间去学习但还是很迷茫&#xff0c;时间长了又发现之前学的知识点很多都忘了&#xff0c;都萌生出了想半路放弃的想法。 让我们看看蚂蚁金服的大…

IDEA:Error running,Command line is too long. 解决方法

报错如下&#xff1a; Error running SendSmsUtil. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun.原因是启动命令过长。 解决方法&#xff1a; 1、打开Edit Configurations 2、点击Modify options设置&#x…

关于android studio 几个简单的问题说明

自信是成功的第一步。——爱迪生 1. android studio 如何运行不同项目是否要更换不同的sdk 和 gradle 2.编译Gradle总是错误为什么 3.如何清理android studio 的缓存 4. 关于android Studio中的build 下面的rebuild project

Kafka基本使用

查看Kafka的进程是否在运行 #命令行终端中运行如下命令 ps -ef | grep kafkafind / -iname kafka-server-start.shcd /usr/local/kafka/bin/#启动kafka ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.propertiesKafka默认使用9092端口提供服务&#xf…

使用opencv-python在图片上显示中文

测试图像如下&#xff1a; 核心代码如下&#xff1a; import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFontdef cv2ImgAddText(img, text, left, top, textColor(0, 255, 0), textSize20):if (isinstance(img, np.ndarray)): #判断是否OpenCV图片类型…

javaScript:七夕特辑-对象的认识与应用(包含日期对象及相关案例)

目录 一.前言 二.认识对象 在js中声明对象的方法 1.直接使用{}声明对象 2.使用构造函数创建对象 获取属性的值 执行对象方法 解释 三.对象的应用 代码 效果图 ​编辑 四.日期对象 1.Date 日期对象 2. getFullYear() 获取当前年份 3.getMonth() 获取当前日期对象…

记一次由于整型参数错误导致的任意文件上传

当时误打误撞发现的&#xff0c;觉得挺奇葩的&#xff0c;记录下 一个正常的图片上传的点&#xff0c;文件类型白名单 但是比较巧的是当时刚对上面的id进行过注入测试&#xff0c;有一些遗留的测试 payload 没删&#xff0c;然后在测试上传的时候就发现.php的后缀可以上传了&a…

初识 JVM 01

JVM JRE JDK的关系 JVM 的内存机构 程序计数器 java指令的执行流程&#xff1a; 1 右侧的java源代码编译为左侧的java字节码&#xff08;右侧第一个方块对应左侧第一个方块&#xff09; 2 字节码 经过解释器 变为机器码 3 机器码就可以被cpu来执行 程序计数器的作用就…

C语言<自定义类型>结构体、枚举、联合

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

壁仞科技与百度飞桨完成II级兼容性测试

近日&#xff0c;壁仞科技BR104通用GPU与百度飞桨已完成II级兼容性测试。测试结果显示&#xff0c;双方兼容性表现良好&#xff0c;整体运行稳定。这是壁仞科技加入飞桨“硬件生态共创计划”后的阶段性成果。产品兼容性证明本次II级兼容性测试完成了涵盖自然语言处理、计算机视…

七月 NFT 行业解读:游戏和音乐 NFT 引领增长,Opepen 掀起热潮

作者&#xff1a;lesleyfootprint.network 2023 年 7 月&#xff0c;NFT 市场的波动性持续存在&#xff0c;交易量呈下降趋势。然而&#xff0c;游戏和音乐 NFT 等领域的增长引人注目。参与这些细分领域的独立用户数量不断增加&#xff0c;反映了这些领域的复苏。 本综合报告…

opencv 进阶17-使用K最近邻和比率检验过滤匹配(图像匹配)

K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;和比率检验&#xff08;Ratio Test&#xff09;是在计算机视觉中用于特征匹配的常见技术。它们通常与特征描述子&#xff08;例如SIFT、SURF、ORB等&#xff09;一起使用&#xff0c;以在图像中找到相似…

分布式锁系列之zookeeper分布式锁和mysql分布式锁

目录 介绍 下载安装 基本指令​编辑 java集成zookeeper 官方提供版 永久节点 临时节点​编辑 永久序列化节点 判断当前节点是否存在 获取当前节点中的数据内容 获取当前节点的子节点 更新节点内容 删除节点 zookeeper实现分布式锁 Mysql实现分布式锁 总结 介绍 ZooK…