【分布式系统】MinIO之Multi-Node Multi-Drive架构分析

news2024/12/26 14:02:53

文章目录

  • 架构分析
  • 节点资源
  • 硬盘资源
  • 服务安装
    • 安装步骤
    • 创建系统服务
    • 新建用户和用户组
    • 创建环境变量
    • 启动服务
    • 负载均衡
  • 代码集成
  • 注意

最近打算使用MinIO替代原来使用的FastDFS,所以一直在学习MinIO的知识。这篇文章是基于MinIO多节点多驱动的部署进行研究。

架构分析

在这里插入图片描述

节点资源

IP环境类型作用驱动器
192.168.89.1宿主机nginx服务
192.168.89.71虚拟机minio存储节点1四块硬盘
192.168.89.72虚拟机minio存储节点2四块硬盘

因为我的虚拟机采用的Host-Only加共享方式配置的网络,所以我在宿主机的C:\Windows\System32\drivers\etc\hosts文件中添加了域名的设置,文件内容如下:

# minio
192.168.89.71 minio1.example.com
192.168.89.72 minio2.example.com
192.168.89.1  minio.example.com

这样设置之后,不管在宿主机还是任何一个虚拟机(虚拟机中配置的DNS是192.168.89.1),都可以正常解析域名了。

硬盘资源

磁盘挂载位置格式化
sdb/mnt/disk1xfs
sdc/mnt/disk2xfs
sdd/mnt/disk3xfs
sde/mnt/disk4xfs

VirtualBox虚拟磁盘设置请参考VirtualBox添加虚拟磁盘,两个虚拟机节点都需要同样的配置。

服务安装

采用二进制程序安装方式,具体可参考官网。
两个存储节点都需要安装,且环境保持一致。

安装步骤

[root@lizx src]# wget https://dl.min.io/server/minio/release/linux-amd64/minio
[root@lizx src]# chmod +x minio
[root@lizx src]# mv minio /usr/local/bin/

创建系统服务

二进制方式安装需要手动创建服务。

[root@lizx src]# vi /etc/systemd/system/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})

新建用户和用户组

[root@lizx src]# groupadd -r minio-user
[root@lizx src]# useradd -M -r -g minio-user minio-user
[root@lizx src]# chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4

创建环境变量

服务启动依赖环境变量文件:/etc/default/minio,包含主机域名和硬盘的配置。创建服务时,此EnvironmentFile配置项指定的该文件。
内容如下:

# 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 covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
# The command includes the port that each MinIO server listens on
# (default 9000)

MINIO_VOLUMES="http://minio{1...2}.example.com:9000/mnt/disk{1...4}/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=minioadmin

# 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.
MINIO_SERVER_URL="http://minio.example.com:19000"

启动服务

在每一个节点服务器上按照如下命令启动minio 服务:

systemctl start minio.service

负载均衡

在宿主机上配置一个nginx,配置如下:

    upstream minio_api {
      server 192.168.89.71:9000;
	  server 192.168.89.72:9000;
    }
	
	upstream minio_console {
	  server 192.168.89.71:9001;
      server 192.168.89.72:9001;
    }
   server{
		listen       19000;
		server_name  minio.example.com;

		ignore_invalid_headers off;
		client_max_body_size 0;
		proxy_buffering off;

		location / {
			proxy_set_header   X-Forwarded-Proto $scheme;
			proxy_set_header   Host              $http_host;
			proxy_set_header   X-Real-IP         $remote_addr;
			proxy_set_header   Upgrade           $http_upgrade;
        proxy_set_header   Connection        "upgrade";

			proxy_connect_timeout 300;
			proxy_http_version 1.1;
			chunked_transfer_encoding off;
			proxy_ignore_client_abort on;

			proxy_pass http://minio_api;
		}
	}
	
	server{
	    listen       19001;
		server_name  minio.example.com;

		ignore_invalid_headers off;
		client_max_body_size 0;
		proxy_buffering off;

		location / {
			proxy_set_header   X-Forwarded-Proto $scheme;
			proxy_set_header   Host              $http_host;
			proxy_set_header   X-Real-IP         $remote_addr;
			proxy_set_header   Upgrade           $http_upgrade;
        proxy_set_header   Connection        "upgrade";

			proxy_connect_timeout 300;
			proxy_http_version 1.1;
			chunked_transfer_encoding off;
			proxy_ignore_client_abort on;

			proxy_pass http://minio_console;
		}
	}

测试时进入控制台报错,是因为websocket没配置,在location中加上如下配置就好了。

   proxy_set_header   Upgrade           $http_upgrade;
   proxy_set_header   Connection        "upgrade";

代码集成

在程序中进行配置:

# Minio配置
minio:
  url: http://minio.example.com:19000
  accessKey: minioadmin
  secretKey: minioadmin
  bucketName: first-test

bucketName需要提前在控制台进行创建,否则程序报错。

注意

做好nginx负载均衡后,发现使用19000端口无法访问,比如我的一个图片访问链接是:http://minio.example.com:19000/first-test/2023/02/23/loginBtn_20230223143747A003.jpg,浏览器提示"Access denied",我以为是虚拟机时间戳的问题,时间同步后还是存在这个问题,最后发现是bucket的Access 策略设置为private导致的,我改为如下图所示的public策略就可以了。

在这里插入图片描述

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

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

相关文章

迁移系统:换电脑或者硬盘转移磁盘文件的方法!

为什么要将操作系统迁移到新驱动? “将操作系统转移到新驱动您好,我刚刚为我的台式机订购了一个新的2TB希捷Barracuda硬盘,我想知道如何将我的Windows 10操作系统与我下载的其他一些软件一起转移过来。我使用新的/大的硬盘,然…

SpringBoot配置文件(properties yml)

查看官网更多系统配置项:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties 1.配置⽂件作⽤ 整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:数据库的连接信息&am…

【华为OD机试模拟题】用 C++ 实现 - 能力组队(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明能力组队题目输入输出示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 O…

如何调教ChatGPT成为你的策略助手

量化策略开发,高质量社群,交易思路分享等相关内容 『正文』 ˇ 去年12月的时候我们初次体验ChatGPT,《ChatGPT生成量化交易策略》. 当时还是很惊喜的,可以辅助写代码,写注释,给出一些示例。使用的时间长了发现写一…

java面试题-GC垃圾回收

1.如何判断一个对象是否可以回收?Java虚拟机使用可达性分析算法来判断对象是否可以被回收。可达性分析算法的基本思路是从一组称为“GC Roots”的根对象开始遍历所有对象,只有从GC Roots开始的对象可以被访问到,其他的对象都被判定为无用对象…

13 Sentinel介绍

什么是Sentinel 分布式系统的流量防卫兵:随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点,在流量控制、断路、负载保护等多个领域开展工作,保障服务可靠性。特点: 2. 丰富的应用场景&a…

Java 锁 高频 面试题回答

之前面了几个开发,问了关于锁的知识都是一问三不知 ,也许是业务场景中出现的比较少,所以这些人只能回答出一些基础的线程方面的知识,之前也看了些书,做一些记录 ,所以和大家分享一下 说一下乐观锁和悲观锁的…

Binder系统-C程序示例_框架分析

IPC:进程间的通信,远程调用,比如我们的A进程需要打开LED灯,调用led_open/led_ctl方法,但是他是没有权限去操作的,所以进程A通过:1.首先构造一些数据,2.通过IPC发送数据到进程B&#…

LPC4357JET256/LPC4337FET256/LPC4337JET256 32位MCU 204MHz 1MB

【详情】LPC4300系列微控制器(MCU)拥有全世界首款非对称双核数字信号控制器体系结构,配有ARM Cortex-M4和Cortex-M0处理器。这些NXP Cortex-M4 MCU配有Cortex-M0协处理器,优势在于,可在单一体系结构、开发环境中,开发数字信号处理…

画栋雕梁:定制投资体系2——规划开发能力圈

接上一篇,选择了适合自己“买”的方法,接下来就是要规划买的范围。这个范围一般受个人眼界、认知和理解的限制,也即是价值投资中的一个重要概念——能力圈。每个人的能力圈不可能一样,这和个人过往的学习、工作、成长经历相关。若…

PyQGIS开发 -- 基础学习笔记

1、自主学习QGIS开发虽然QGIS本身功能强大,但还是架不住我们要编写新的功能、新的业务流程、新的算法。前文中我们提到,扩展QGIS有2种方法,一是用Python、C来写QGIS的插件;另一种就是基于QGIS的C API开发独立应用程序。然而后者资…

前端食堂技术周刊第 72 期:Signals 是前端框架的未来、Chrome Headless、ts-reset、magic-regexp、Bun 新文档

美味值:🌟🌟🌟🌟🌟 口味:草莓番茄 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Signals 是前端框架的未来Chrome Headless 进化成完全体Next.js 13.2Deno…

纯x86汇编实现的多线程操作系统实践 - 第二章 BSP的启动

本章主要讲解BSP的初始化过程,对应的代码为mbr.asm。系统加电启动后,BIOS进行必要的初始化,并将硬盘的0扇区512字节的数据搬运到内存地址0x7c00处。之后,BSP的IP被置为0x7c00,开始运行。初始化代码mbr.asm将顺序执行以…

服务网格领域的百花齐放

服务网格是一种技术架构,它用于管理微服务系统中各个服务之间的通信,旨在处理微服务间的流量(也称为东西向流量)。 ​ 在云原生应用中,一个应用的背后可能存在着成百上千个服务,各个服务可能又有着若干个实…

机器学习——集成学习

引言 集成学习:让机器学习效果更好,单个不行,群殴走起。 分类 1. Bagging:训练多个分类器取平均(m代表树的个数)。 2.Boosting(提升算法):从弱学习器开始加,通过加权来进行训练。…

这样在管理后台里实现 403 页面实在是太优雅了

前言403 页面通常表示无权限访问,与 404 页面代表着不同含义。而大部分管理后台框架仅提供了 404 页面的支持,但却忽略了对 403 页面的处理,有的框架虽然也有对 403 页面的处理,但处理效果却不尽人意。那怎么样的 403 页面才是即好…

异步交互的关键——Ajax

文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2,axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名最后说一句1,Ajax 概述 AJAX (Asynchronous JavaScript And XML):异步的 Jav…

【Fastdfs实战】在本地如何将文件上传到Linux虚拟机

作者:狮子也疯狂 专栏:《Fastdfs连续剧》 坚持做好每一步,幸运之神自然会驾凌在你的身上 目录一. 🦁 前言二. 🦁 上传原理Ⅰ. 🐇 原理图解Ⅱ. 🐇 传输原理三. 🦁 实战演示Ⅰ. &…

TryHackMe-CVE-2021-41773/42013(Apache2.4.49/50)

CVE-2021-41773/42013 对 Apache 路径遍历错误的简短解释和不完整的修复 介绍 tryhackme: 在 Apache HTTP Server 2.4.49 中对路径规范化所做的更改中发现一个缺陷。攻击者可以使用路径遍历攻击将 URL 映射到预期文档根目录之外的文件。如果文档根目录之外的文件不受“要求全…

第三阶段-03MyBatis 中使用XML映射文件详解

MyBatis 中使用XML映射文件 什么是XML映射 使用注解的映射SQL的问题: 长SQL需要折行,不方便维护动态SQL查询拼接复杂源代码中的SQL,不方便与DBA协作 MyBatis建议使用XML文件映射SQL才能最大化发挥MySQL的功能 统一管理SQL, 方…