当前位置: 首页 > news >正文

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

文章目录

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

最近打算使用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/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})

新建用户和用户组

[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:19000accessKey: minioadminsecretKey: minioadminbucketName: first-test

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

注意

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

在这里插入图片描述

相关文章:

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

文章目录架构分析节点资源硬盘资源服务安装安装步骤创建系统服务新建用户和用户组创建环境变量启动服务负载均衡代码集成注意最近打算使用MinIO替代原来使用的FastDFS,所以一直在学习MinIO的知识。这篇文章是基于MinIO多节点多驱动的部署进行研究。 架构分析 节点资…...

【无标题】(2019)NOC编程猫创新编程复赛小学组真题含参考

(2019)NOC编程猫创新编程复赛小学组最后6道大题。前10道是选择填空题 略。 这道题是绘图题,没什么难度,大家绘制这2个正十边形要注意:一是不要超出舞台;二是这2个正十边形不要相交。 这里就不给出具体程序了…...

【尚硅谷MySQL入门到高级-宋红康】数据库概述

1、为什么要使用数据库 数据的持久化 2、数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据库管理系统的关系 3、 MySQL介绍 MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&a…...

SpringBoot集成Redis并实现数据缓存

应用场景 存放Token、存放用户信息或字典等需要频繁访问数据库获取但不希望频繁访问增加数据库压力且变化不频繁的数据。 集成步骤 1. 新建 Maven 项目并引入 redis 依赖【部分框架有可能已经集成&#xff0c;会导致依赖文件有差异】 <dependency><groupId>org…...

SpringBoot配置文件(properties yml)

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

css 画图之质感盒子

前言 css 众所周知可以做很多的事情&#xff0c;比如&#xff1a;界面效果、特效、独特的样式等。今天给各位朋友带来的是以box-shadow来画一个很有质感效果的一个盒子。 之前在网上冲浪的时候&#xff0c;发现了这样的一个效果&#xff0c;所以来记录一下。 下面是实现后的…...

面了一个月,终于让我总结出了这份最详细的接口测试面试题

目录 1、你们公司是如何做接口测试的&#xff1f; 2、什么时候开展接⼝测试&#xff1f; 3、接⼝测试和UI测试的工作是否重复&#xff1f; 4、接口测试框架怎么搭建&#xff1f; 5、接⼝之间有依赖时怎么处理&#xff1f; 6、如何判断接⼝测试的结果&#xff08;成功或失败&a…...

{新}【java开发环境安装】完整工作环境安装配置

公司新发了一台红米笔记本&#xff0c;打算用新的笔记本&#xff0c;开启自己新的工作旅程&#xff0c;其中把做个的事都记录一边&#xff0c;以便实现&#xff0c;听、读、视频图像、讨论、实践、教人的一个学习过程。 一、Java开发环境安装 找到安装包下载&#xff1b;在官…...

Python|每日一练|数组|数学|图算法|字符串|动态规划|单选记录:加一|迷宫问题|扰乱字符串

1、加一&#xff08;数组&#xff0c;数学&#xff09; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以…...

MySQL 使用IF判断

mysql判断语句 1、IF 和IFNULL IF(表达式1&#xff0c;表达式2&#xff0c;表达式3); 含义&#xff1a;如果表达式1为true&#xff0c;则返回表达式2的值&#xff0c;否则返回表达式3的值&#xff0c;表达式的值类型可以为数字或字符串 例&#xff1a;判断对错 SELECT IF(TRUE…...

C++类与对象(上)【详析】

目录1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1访问限定符4.2封装5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小8.this关键字如果说我们对C的初步认识&#xff0c;是觉得C是对C语言不足之处的进行修补&#xff0c;在认识完类…...

AIR系列|板载LED|gpio引脚选择|GPIO|流水灯|LuatOS-SOC接口|官方demo|学习(20-1):GPIO库基础

AIR系列各型号开发板板载LED对应管脚及GPIO控制代码 AIR103&#xff1a; rtos_bsp "AIR103" then -- Air103开发板LED引脚编号--return pin.PB26, pin.PB25, pin.PB24return 42,41,40 AIR105&#xff1a; rtos_bsp "AIR105" then -- Air105开发板LED引…...

MySQL数据库中的函数怎样使用?

函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那么&#xff0c;函数到底在哪儿使用呢?我们先来看两个场景&…...

命名空间的使用大全

概述 在C中&#xff0c;我们会使用变量、常量、函数、类、对象、结构体等各种元素。随着工程越来越庞大&#xff0c;代表这些元素的标识符冲突的概率也越来越大。为了解决标识符命名冲突的问题&#xff0c;C标准在1995年引入了关键字namespace&#xff0c;也叫做命名空间。使用…...

Redisson分布式锁和同步器详解-官方原版

一、锁定基于Redis的Java分布式可重入锁对象&#xff0c;并实现了锁接口。如果获取锁的Redisson实例崩溃&#xff0c;则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁看门狗&#xff0c;当锁持有者Redisson实例处于活动状态时&#xff0c;它会延长锁的到期时间…...

【C语言进阶】指针与数组、转移表详解

前言 大家好我是程序猿爱打拳&#xff0c;我们在学习完指针的基本概念后知道了指针就是地址&#xff0c;我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的&#xff0c;因此学习完指针的基础后我们可以学习关于指针的进阶&#xff0c;其中…...

SDN是什么,和SD-WAN有什么关系

SDN全称为“软件定义网络”&#xff08;Software-Defined Networking&#xff09;&#xff0c;是一种新型的网络架构&#xff0c;通过将网络的控制面和数据面分离&#xff0c;将网络控制集中到控制器中进行统一管理和配置&#xff0c;以提高网络的灵活性和可管理性。传统网络的…...

百度前端高频react面试题(持续更新中)

说说你用react有什么坑点&#xff1f; 1. JSX做表达式判断时候&#xff0c;需要强转为boolean类型 如果不使用 !!b 进行强转数据类型&#xff0c;会在页面里面输出 0。 render() {const b 0;return <div>{!!b && <div>这是一段文本</div>}</div…...

中级嵌入式系统设计师2016下半年下午应用设计试题

中级嵌入式系统设计师2016下半年下午试题 试题一 阅读以下说明,回答问题1至问题3。 【说明】 某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能…...

【雅思备考】九分学长写作课笔记

原视频&#xff1a;https://www.bilibili.com/video/BV1FG4y1J7br?p13&vd_source552ac2291179cf9d44088ea168db5531 一、综述 共计1小时 小作文&#xff1a; 描述 图表图&#xff08;数据图&#xff09;、流程图&#xff08;示意图&#xff09;、地图&#xff08;示意…...

【源码解析】SpringBoot自动装配的实现原理

什么是SpringBoot的自动装配 SpringBoot在启动的时候会扫描外部jar包中的META-INF/spring.factories文件&#xff0c;将文件中配置的类信息按照条件装配到Spring容器中。 实现原理 核心注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.R…...

详解ROS时间戳

ROS&#xff08;Robot Operating System&#xff09;是一个用于机器人开发的开源软件框架&#xff0c;其中涉及到了一些与时间相关的概念和工具&#xff0c;如时间戳、计时器等。本文将主要介绍ROS中时间戳的概念和应用&#xff0c;并提供一个Python代码案例演示如何处理ROS时间…...

Android Window、WindowManager

1.窗口Window 在Android中显示一个界面,首先想到的是Activity、Dialog或Toast。但是在有些情况下,比如悬浮球,用Activity会显然多余,这个时候可以直接使用窗口来实现。 Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,它们的视图实际上都…...

【一天一门编程语言】怎样设计一门编程语言?

怎样设计一门编程语言&#xff1f; 确定目标 确定语言的用途&#xff1a; 是一门通用编程语言&#xff0c;还是一门专门面向某个特定目标的语言&#xff1f;是一门面向对象的语言&#xff0c;还是一门过程化的语言&#xff1f;将语言的最终用户定义为谁&#xff1f; 确定语言…...

微服务保护 -- 初识 Sentinel(雪崩问题,快速入门Sentinel)

大家好&#xff0c;今天我们要来学习阿里巴巴开源的流量控制和熔断降级框架 – Sentinel 。 1、雪崩问题及解决方案 首选我们来了解一下雪崩问题及其解决方案&#xff0c;我们学习这个微服务保护&#xff0c;其实就是为了去应对类似于雪崩问题这样的服务故障。 1.1 什么是雪…...

软件测试面试问答

笔试 笔试的话我们需要揣测具体会考什么内容&#xff0c;我们可以通过招聘信息去了解该公司需要什么样的技能&#xff0c;以此来准备笔试。一般必考的内容会有编程&#xff0c;测试用例设计&#xff0c;工作流程&#xff0c;逻辑思维等内容&#xff0c;除此之外每个公司可能还会…...

【架构】架构师的核心能力-抽象能力

文章目录一、通过归纳法找共性二、通过演绎法找关系三、通过归纳法找特性四、最后架构的核心是管理复杂度&#xff0c;架构师的核心能力是抽象能力&#xff0c;什么是抽象能力&#xff1f;抽象能力就是一种化繁为简的能力。何为化繁为简&#xff1f;就是把一种复杂的事情变得简…...

前端一面常见react面试题(持续更新中)

React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f; React基于Virtual DOM实现了一个SyntheticEvent层&#xff08;合成事件层&#xff09;&#xff0c;定义的事件处理器会接收到一个合成事件对象的实例&#xff0c;它符合W3C标准&#xff0c;且与原生的浏览器…...

亥姆霍兹线圈测量系统

亥姆霍兹线圈[Helmholtz线圈]是指由具有相同线圈匝数、相同线圈绕制方式且线圈半径等于线圈间距的一对或者多对线圈构成的线圈组合。 根据线圈的形状&#xff0c;亥姆霍兹线圈可分为圆形亥姆霍兹线圈和方形亥姆霍兹线圈&#xff1b;根据磁场方向&#xff0c;亥姆霍兹线圈可分为…...

JavaScript 类型转换

Number() 转换为数字&#xff0c; String() 转换为字符串&#xff0c; Boolean() 转化为布尔值。JavaScript 数据类型在 JavaScript 中有 5 种不同的数据类型&#xff1a;stringnumberbooleanobjectfunction3 种对象类型&#xff1a;ObjectDateArray2 个不包含任何值的数据类型…...

企业seo的措施有哪些/众志seo

程序员是最容易创业的&#xff0c;或者说是创业成本最低的职业。只要有一台电脑和投入自己的时间&#xff0c;就可以写出畅销天下的软件&#xff0c;这是每个程序员的梦想。更何况世界首富常年以来就是程序员出身的比尔盖茨&#xff0c;这也刺激了更多的程序员走上创业之路。 …...

自己做网站公司/营销技巧和话术

...

搜索品牌价值的网站/系统优化大师下载

apache配置https一、yum 安装openssl和openssl-devel&#xff0c;httpd-devel二、生成证书&#xff08;也可以从公司的证书颁发机构获取&#xff09;&#xff1a;#建立服务器密钥 openssl genrsa -des3 1024 > /usr/local/apache/conf/server.key # 从密钥中删除密码&a…...

怎做不下网站刷枪/网络销售怎么才能找到客户

具体的报错信息&#xff1a;ArgumentException: Getting control 0s position in a group with only 0 controls when doing Repaint A OnGUI在每次绘制时会调用2次&#xff0c;第1次计算所有控件的位置&#xff0c;所有EdtorGUILayout控件方法返回的Rect均为0;第2次根据位置来…...

重要新闻头条/广东seo网络培训

JVM有哪些垃圾回收器&#xff1f;是怎么工作的&#xff1f;什么是STW&#xff1f;它都发生在哪些阶段&#xff1f;什么是三色标记&#xff1f;如何解决错标记和漏标记的问题&#xff1f;为什么要设计这么多的垃圾回收器? STW:Stop-The-Word。是在垃圾回收算法执行过程中&…...

电子商务网站开发实例/网络营销与策划实践报告

中国银行数据平台2.0改造升级 项目的进度已经接近尾声&#xff0c;回想起项目刚开始的那份期待已经落实&#xff0c;人生中的风景有很多走过一处就要为自己留念&#xff0c;今天就为这个项目留念一下 项目背景 中国银行北京分行的数据是依托中国银行总行的&#xff0c;总行每天…...