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/localUser=minio-user
Group=minio-user
ProtectProc=invisibleEnvironmentFile=-/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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpeedBI数据可视化工具:浏览器上做分析

SpeedBI数据分析云是一种在浏览器上进行数据可视化分析的工具,它能够将数据以可视化的形式呈现出来,并支持多种数据源和图表类型。 所有操作,均在浏览器上进行 在浏览器中打开SpeedBI数据分析云官网,点击【免费使用】进入&#…

SQL Monitor Crack,PostgreSQL监控的传入复制图表

SQL Monitor Crack,PostgreSQL监控的传入复制图表  现在,您可以在从Estate页面导出的Microsoft Excel报告的摘要标题中看到UTC偏移量。 添加了PostgreSQL监控的传入复制图表。 Microsoft PowerShell API现在支持将使用New-SqlMonitorWindowsHost和New-SqlMonitorin…

【脚踢数据结构】图(纯享版)

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,Linux基础,ARM开发板,软件配置等领域博主🌍快上🚘,一起学习,让我们成为一个强大的攻城狮!送给自己和读者的…

vellum (Discovering Houdini VellumⅡ柔体系统)学习笔记

视频地址: https://www.bilibili.com/video/BV1ve411u7nE?p3&spm_id_frompageDriver&vd_source044ee2998086c02fedb124921a28c963(搬运) 个人笔记如有错误欢迎指正;希望可以节省你的学习时间 ~享受艺术 干杯&#x1f37b…

STP知识点总结

目录 一.什么是STP协议 二.STP生成树协议产生的原因 三. STP生成树协议涉及的算法 一.802.1D 二.PVST 三.PVST 四. 快速生成树 五.MSTP 一.什么是STP协议 在一个二层交换网络中,生成一棵树型结构,逻辑的阻塞部分接口,使得从根到所有的…

深度学习入门(三):卷积神经网络(CNN)

引入 给定一张图片,计算机需要模型判断图里的东西是什么? (car、truck、airplane、ship、horse) 一、卷积神经网络整体架构 CONV:卷积计算层,线性乘积求和RELU:激励层,激活函数P…

【欧拉计划】偶数斐波那契数

题目链接:偶数斐波那契数 解法一:暴力枚举 看见题目,第一反应就是先找到小于400万的所有斐波那契数,再从这些斐波那契数中筛选出偶数进行求和。 由于递归方法求斐波那契数的时间复杂度较高,故这里采用迭代的方法。 先…

谈谈对 GMP 的简单认识

犹记得最开始学习 golang 的时候,大佬们分享 GMP 模型的时候,总感觉云里雾里,听了半天,并没有一个很清晰的概念,不知 xmd 是否会有这样的体会 虽然 golang 入门很简单,但是对于理解 golang 的设计思想和原…

python、numpy、pytorch中的浅拷贝和深拷贝

1、Python中的浅拷贝和深拷贝 import copya [1, 2, 3, 4, [11, 22, 33, [111, 222]]] b a c a.copy() d copy.deepcopy(a)print(before modify\r\n a\r\n, a, \r\n,b a\r\n, b, \r\n,c a.copy()\r\n, c, \r\n,d copy.deepcopy(a)\r\n, d, \r\n)before modify a [1, 2…

从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值

目录 1. 列表初始化initializer_list 2. 前面提到的一些知识点 2.1 小语法 2.2 STL中的一些变化 3. 右值和右值引用 3.1 右值和右值引用概念 3.2 右值引用类型的左值属性 3.3 左值引用与右值引用比较 3.4 右值引用的使用场景 3.4.1 左值引用的功能和短板 3.4.2 移动…

static相关知识点详解

文章目录 一. 修饰成员变量二. 修饰成员方法三. 修饰代码块四. 修饰类 一. 修饰成员变量 static 修饰的成员变量,称为静态成员变量,该变量不属于某个具体的对象,是所有对象所共享的。 public class Student {private String name;private sta…

【C++杂货铺】探索string的底层实现

文章目录 一、成员变量二、成员函数2.1 默认构造函数2.2 拷贝构造函数2.3 operator2.4 c_str()2.5 size()2.6 operator[ ]2.7 iterator2.8 reserve2.9 resize2.10 push_back2.11 append2.12 operator2.13 insert2.14 erase2.15 find2.16 substr2.17 operator<<2.18 opera…

【路由协议】使用按需路由协议和数据包注入的即时网络模拟传递率(PDR)、总消耗能量和节点消耗能量以及延迟研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Windows使用MobaXterm远程访问ubuntu20.04桌面

参考ubuntu 2020.4 安装vnc 一、脚本文件 remote_setup.sh脚本文件内容&#xff1a; #! /bin/bash #参考链接&#xff1a;https://blog.csdn.net/hailangdeyingzi/article/details/124507304 sudo apt update sudo apt install x11vnc -y sudo x11vnc -storepasswd telpo.12…

二、11.系统交互

fork 函数原型是 pid_t fork(void&#xff09;&#xff0c;返回值是数字&#xff0c;该数字有可能是子进程的 pid &#xff0c;有可能是 0&#xff0c;也有可能是-1 。 1个函数有 3 种返回值&#xff0c;这是为什么呢&#xff1f;可能的原因是 Linux 中没有获取子进程 pid 的方…

主程技术分享: 游戏项目帧同步,状态同步如何选

网络游戏开发项目中帧同步,状态同步如何选&#xff1f; 网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的同步方式。接下来从以下3个方面来阐述: 对啦&…

如何拉取Gitee / GitHub上的Unity项目并成功运行

前言 由于目前大部分人使用的仓库都是Gitee或者是GitHub&#xff0c;包括小编的公司所使用的项目仓库也包括了Gitee&#xff1b;我们需要学习技术栈时都会去百度或者是去GitHub上看看别人的项目观摩学习&#xff0c;可能很多小白在遇到拉取代码时出现各种问题&#xff0c;或者…

外包干了2年,彻底废了...

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

mongodb集群

端口192.168.115.3 192.168.115.4 1192.168.115.5 下载MongoDB软件包版本为4.2.14并安装 rpm -ih --force --nodeps *.rpm 2创建文件夹mkdir -p /opt/local/mongo-cluster/conf 3.在目录里创建配置文件cd /opt/local/mongo-cluster/conf …

线性数据结构:数组与链表的探索与应用

文章目录 1. 数组&#xff1a;连续存储的有序元素集合1.1 创建和访问数组1.2 数组的搜索与排序 2. 链表&#xff1a;非连续存储的动态数据结构2.1 单链表与双链表2.2 链表的操作与应用 3. 数组与链表的比较与应用3.1 数组与链表的比较3.2 数组与链表的应用 4. 总结与展望 &…