搭建高可用MinIO集群_minio高可用-程序员宅基地

技术标签: Java  架构  分布式存储中间件  中间件  后端  云计算  

引言:我为什么要写这篇文档,因为MinIO在国内的资料比较少,但是在国外社区还是比较活跃的。从刚开始接触MinIO是因为集团要搭建文件服务系统供整个集团大大小小几百个项目组去使用,所以最终肯定奔着高可用目标去掉的。刚开始接触MinIO的时候,第一步肯定是进行一个环境的搭建,不管是测试环境,还是开发环境,甚至于生产环境,要求是一个比一个高,从单集群到多集群再到两地三中心、三地五中心。但是国内搭建的资料很少,且在CSDN上,保守来说至少50%的搭建是错误的(比如:用mkdir来充作Drive,用CI=true来忽略minio对于磁盘的检查等等),所以这里给大家看看我是如何搭建一个标准的MinIO最小集群。
看过官网的快速开始文档的应该知道,MinIO高可用集群至少满足四个节点才能开启纠删码模式,所以今天我的目标是用vm搭建一个四节点十六个Drive的最低配高可用MinIO集群。(这边我默认咱们都有MinIO基础知识了啊,比如纠删码、Set、node、drive等等)

一、准备工作

首先,我会用虚拟机创建四个节点,每个节点20G的初始流量,在创建了四个初始节点后,会根据标准的磁盘挂载的方式去对每个节点挂载四块5G总共20G的磁盘(因为minio要求作为存储的磁盘一定是要干净的,所以这边选择磁盘挂载的方式进行,我司也是这么做的),这样子我我们可以得到四个节点总共80G的底层存储空间

ip 名称
192.168.192.163 minio-1
192.168.192.164 minio-2
192.168.192.165 minio-3
192.168.192.166 minio-4
192.168.192.167 minio-nginx(负载)

1、初始系统环境搭建

image.png
image.png
image.png
这边我内存稍微选大一点,这样操作的时候会更流畅,你们生产肯定是怎么高怎么来呗,我们测试环境单节点至少都是64G内存起步,生产更高(高得多)
image.png
image.png
image.png
等待初始系统安装
image.png
这边就安装好了,然后我们选择克隆的方式(我偷懒)克隆出另外三台机器,minio-2、minio-3、minio-4
image.png
image.png
image.png
image.png
image.png
重复整个克隆操作,克隆出minio-3、minio-4
image.png
这样我们四台机器就创建好了

2、命令行工具链接

这边启动四台机器,使用ip addr命令分别获取机器的ip地址,使用命令行工具进行连接,我这边使用的Xshell7个人版
image.png
具体的ip可以开头的表格

3、关闭防火墙

这一步其实看情况啦,公司的防火墙肯定不给关的,顶多开放固定端口,我这边直接用开放固定端口的形式了,虽然这样会麻烦一点,因为你不知道涉及哪些端口的话,后面容易出问题,minio主要是9000和9001端口,这是官方默认的端口。9000是minio-server的端口,9001是minio-cosole的端口,console空就是一个web可视化界面啦。这边把怎么开放端口的命令贴出来

## 查看防火墙状态
systemctl status firewalld 

image.png
我这边是开启的哈

## 给9000添加永久开放端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=9000/tcp --permanent
success

## 给9001添加永久开放端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=9001/tcp --permanent
success
[root@localhost ~]# 

## 重启防火墙
[root@localhost ~]# firewall-cmd --reload
success

## 检查是否添加成功
[root@localhost ~]# firewall-cmd --zone=public --list-port
9000/tcp 9001/tcp


以上操作在另外三台机器也运行
image.png

4、挂载磁盘

关闭四台虚拟机,依然会用minio-1为例子来进行挂载演示
image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png
这样就给这台minio-1添加一块磁盘,但是整个时候并没有挂载到目录上哦,我们先不急,先把剩下的三块盘装完,依旧是重复上面的动作
image.pngimage.png
这样minio-1的四块磁盘就先准备好了

然后分别把minio-2、minio-3、minio-4也创建出四块预先分配的磁盘
image.pngimage.pngimage.png

现在我们的四台机器都已经创建好资源了,我们接下来要做的就是把这些创建的磁盘挂载到文件目录上去

打开四台虚拟机,使用xshell,我们开始要敲命令了

输入fdisk -l命令查看当前系统磁盘分区。
image.png
这块就是我们额外增加的四个磁盘,名称为sdb、sdc、sdd、sde

我们首先分别将这四块盘格式化为xfs格式

[root@localhost ~]# mkfs.xfs /dev/sdb -L DISK1
meta-data=/dev/sdb               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# mkfs.xfs /dev/sdc -L DISK1
meta-data=/dev/sdc               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# mkfs.xfs /dev/sdd -L DISK1
meta-data=/dev/sdd               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# mkfs.xfs /dev/sde -L DISK1
meta-data=/dev/sde               isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

创建文件夹作为挂载源

mkdir /minio1
mkdir /minio2
mkdir /minio3
mkdir /minio4

image.png
使用mount进行挂载

[root@localhost /]# mount /dev/sdb /minio1
[root@localhost /]# mount /dev/sdc /minio2
[root@localhost /]# mount /dev/sdd /minio3
[root@localhost /]# mount /dev/sde /minio4

输入df -h命令检查挂载状态
image.png
mount挂载有风险,如果节点宕机重启或者因为其他因素重启,挂载就会消失,所以我们需要设置开机自动挂载
vim /etc/fstab
image.png

/dev/sdb                                  /minio1                 xfs     defaults,noatime 0 2
/dev/sdc                                  /minio2                 xfs     defaults,noatime 0 2
/dev/sdd                                  /minio3                 xfs     defaults,noatime 0 2
/dev/sde                                  /minio4                 xfs     defaults,noatime 0 2

输入reboot重启

image.png
重启之后依然是ok的

根据上面挂载的步骤,将其他三个节点的挂载一一配置好

题外话:这种挂载由很多种方式,有的是UUID,有的用LABEL=DISK1这种,只要你能挂的上,都没问题

paas:写到这里突然想到一个问题,我这刚安装的系统的时间肯定不对,到时候minio-console的上面显示的时间肯定不对,你们生产环境肯定有ntp同步时间啦,我这边就懒得做了,知道就行。

二、搭建

1、下载minio

## 普通x86的机器
wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230210184839.0.0.x86_64.rpm -O minio.rpm

## 苹果m1 m2的
wget https://dl.min.io/server/minio/release/linux-arm64/archive/minio-20230210184839.0.0.aarch64.rpm -O minio.rpm

如果是离线操作,直接去官网下载二进制文件安装就好了
image.png
等待下载完成
image.png下载完成

rpm -i minio.rpm

文件安装的位置默认是/usr/local/bin
image.png
我信了官网个鬼
image.png
这个老外毒奶粉玩家这条命令不行,还是我的好用(毒奶粉玩家我猜的)

2、配置service

这一步是为了让我们后面可以直接使用systemctl start minio这样的方式启动
如果你是跟我我上面安装的,会自动生成minio.servie文件的

vim /etc/systemd/system/minio.service

[Unit]
Description=MinIO
Documentation=https://docs.min.io
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=1048576

# 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})

官网版本:

[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})

如果是二进制版本安装的兄弟,把自己去创建这个文件/etc/systemd/system/minio.service,然后把上面这段复制进去

上面这些参数信息,我们只需要关注几个

  • WorkingDirectory:工作目录
  • EnvironmentFile: 变量文件,minio-server启动的时候,会去这个文件里面读取配置文件(这个我们一会需要修改)
  • User/Group:运行minio-server的用户

我好像还没有创建运行的用户,现在创建一个把,也不晚

[root@localhost bin]# groupadd -r minio-user
[root@localhost bin]# useradd -M -r -g minio-user minio-user
[root@localhost bin]# chown minio-user:minio-user /minio1 /minio2 /minio3 /minio4

3、修改环境变量文件

同样,如果是根据我上面安装的,这个变量文件会自己生成,如果是二进制安装包安装的,需要自己去创建这个文件,然后补充信息(根据安装包的版本,也会有差异,我目前遇到过,就算不是二进制这个文件也不存在的情况,到时候兄弟们遇上了就直接把下面的配置copy进去就好了)

vim /etc/default/minio

我先把官网的贴出来,二进制安装的兄弟们,直接把这个内容复制到自己创建的文件就好了

# 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="https://minio{1...4}.example.net: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=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.
MINIO_SERVER_URL="https://minio.example.net:9000"

接下来我们对这个文件进行一些变动

# 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)
## 这块是文件磁盘的位置 因为我们是集群节点是163-166 这边是一种池化写法
MINIO_VOLUMES="http://192.168.192.16{3...6}:9000/minio{1...4}"

# 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-console的地址 就是web界面控制台
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.

# console的登陆账号
MINIO_ROOT_USER=minioadmin

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

# console的登陆密码
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://192.168.192.163:9000"

然后在其他三台机器依次安装,并修改/etc/default/minio环境变量文件

如果你们公司有自己的域名映射的话,你们就走域名咯,如果域名不连贯的话(建议还是连贯),可以分开配置

MINIO_VOLUMES="http://192.168.192.163:9000/minio{1...4} http://192.168.192.155:9000/minio{1...4}"

参考以上格式,用空格分隔,我只写了两个节点

三、启动

systemctl start minio

四个节点依次运行
image.pngimage.pngimage.pngimage.png
不吹不黑,一条龙通关

浏览器访问任意一节点的9001端口
image.png
密码:minioadmin/minioadmin
image.png
查看下监控信息,确保所有服务已启动
image.png
四个节点总共16快挂载的磁盘,
image.png
每块盘5GB,没错

四、使用负载均衡器

这里选用nginx来作为负载均衡,会另外使用一台机器,提供统一的入口,然后将请求分发到这四个节点的9000端口
nginx版本:nginx-1.20.2.tar.gz
够用就行
image.pngimage.png
image.pngimage.png
嘿,哥们电脑配置还行,随便奢侈一把,我32G 三星DDR5内存
image.png
等待安装

一会我们会监听nginx的机器的9000端口 转发到四台服务上

image.png

安装成功了,我先配置一下Xshell
image.png
传输nginx安装包image.png
解压

tar -zxvf nginx-1.20.2.tar.gz

image.png
安装一下

//一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

image.png
进入nginx目录,使用nginx默认配置

./configure

image.png完成!

编译安装

make
make install

查找安装路径

whereis nginx

image.png

修改ngix配置文件

vim /user/loal/nginx/conf/nginx.conf
worker_processes  1;

events {
    
    worker_connections  1024;
}


http {
    
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;

    upstream minio_server {
    
			server	192.168.192.163:9000;
			server  192.168.192.164:9000;
			server  192.168.192.165:9000;
			server  192.168.192.166:9000;
    }

    upstream minio_console {
    
			server 192.168.192.163:9001;
			server 192.168.192.164:9001;
			server 192.168.192.165:9001;
			server 192.168.192.166:9001;
    }


    server {
    
        listen       9000;
        server_name  localhost;

        location / {
    
            proxy_pass http://minio_server;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
            root   html;
        }
  	server {
    
        listen       9001;
        server_name  localhost;

        location / {
    
            proxy_pass http://minio_console;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
            root   html;
        }

    }
}

访问192.168.192.167:9001端口
image.png
哦对了,这个负载均衡的机器记得把9000和9001端口打开,参考上面

五、测试

1、创建bucket

image.png

2、upload

image.png

3、download

image.png

六、留个坑

关于ng配置这块,因为涉及到文件上传下载等,还需要配置文件流以及大小的配置哦。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46514651/article/details/129036281

智能推荐

2021-06-09 Linux INIT_DELAYED_WORK schedule_work 延时队列使用学习-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏13次。https://blog.csdn.net/qq_31339221/article/details/105057978https://blog.csdn.net/qq_31339221/article/details/105057978_init_delayed_work

linux设置双屏拼接_双屏、3屏拼接——A卡、N卡——Windows、Linux-程序员宅基地

文章浏览阅读2k次。“折腾是一种生活态度”。买了个显卡,在公司折腾了下双屏和3屏,记录一下。3个20英寸的显示器,分辨率都是1600x900。普通双屏:1个屏幕有任务栏,另一个没有任务栏,分辨率单独设置,壁纸重复显示一张,分辨率都是1600x900。双屏水平拼接:通过显卡驱动设置,操作系统检测到1个显示器,分辨率为3200x900,1个超长任务栏横跨2个屏幕,1个超长壁纸横跨2个屏幕。3屏水平拼接:分辨率为4800x..._横屏双屏壁纸拼接

反射之getDeclaredMethod和getMethod的区别以及一些小技巧_反射getdeclaredmethod-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏8次。区别getDeclaredMethod:获取当前类的所有声明的方法,包括public、protected和private修饰的方法。需要注意的是,这些方法一定是在当前类中声明的,从父类中继承的不算,实现接口的方法由于有声明所以包括在内。getMethod:获取当前类和父类的所有public的方法。这里的父类,指的是继承层次中的所有父类。比如说,A继承B,B继承C,那么B和C都属于A的父类。..._反射getdeclaredmethod

计算机java毕业设计 JavaWeb的图书查询管理系统_怎么描述java项目中图书管理页面的内容-程序员宅基地

文章浏览阅读415次。 Hi,各位同学好呀,这里是L学长!今天向大家分享一个今年(2022)最新完成的毕业设计项目作品基于JavaWeb的图书查询管理系统 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分)难度系数:3分工作量:3分创新点:3分。_怎么描述java项目中图书管理页面的内容

html5安卓机判断刘海屏,Android判断是否为刘海屏-程序员宅基地

文章浏览阅读1.5k次。主要总结主流品牌小米、华为、oppo、vivo的刘海屏判断。在某些特殊页面需要适配刘海屏时,可以用以下方法判断。或者判断屏幕比例是否大于2。/*** 小米刘海屏判断.*/public static int getInt(String key,Activity activity) {int result = 0;if (isXiaomi()){try {ClassLoader classLoader..._h5中如何判断根据手机有没有刘海屏灵动岛

基于python的知识图谱的设计与实现_基于pyqt5的知识图谱系统-程序员宅基地

文章浏览阅读367次。有管理员和普通用户二种权限,可以查询,修改个人信息,查询修改用户信息,增加节目期数,增加表演节目。数据库(sqlite/mysql/sqlserver等):sqilte。开发工具(eclipse/idea/vscode等):pycharm。_基于pyqt5的知识图谱系统

随便推点

WinForm界面布局空间---WeifenLuo.WinformUI.Docking-程序员宅基地

文章浏览阅读1.1k次。最近在学习Sharpdevelop的过程中,看到了使用的很好的winform页面布局控件,感觉非常的不错。实现效果如下所示:这里我就简单的下一下他的实现步骤,当中我也看考了其他人的博客。1)创建一个windowsForm的应用程序2)添加引用:WeifenLuo.WinFormsUI.Docking他是一个DLL文件,可以自行从网络上下载。3)设置Form1窗体作为父窗..._weifenluo.winformui.docking

操作系统作业调度实验报告-程序员宅基地

文章浏览阅读1.6w次,点赞7次,收藏62次。一、实验名称作业调度算法实验。二、实验目标已知n个作业的进入时间和估计运行时间(以分钟计)(1)单道环境下,分别用先来先服务调度算法、短作业优先调度算法、响应比高者优先调度算法,求出批作业的平均周转时间和带权平均周转时间;在多道环境(如2道)下,求出这些作业的平均周转时间和带权平均周转时间(2)就同一批次作业,分别讨论这些算法的优劣;(3)衡量同一调度算法对不同作业流的性能_操作系统作业调度实验报告

68 数据采集与线程池隔离使用-程序员宅基地

文章浏览阅读42次。我们按照xxl-job-executor-sample-springboot给我们提供的流程整合xxljob;1)stock_backend工程引入核心依赖--引入xxljob核心依赖--> < dependency > < groupId > com.xuxueli < artifactId > xxl-job-core

源码_拍照判卷源码-程序员宅基地

文章浏览阅读2k次。文件夹 PATH 列表卷序列号为 000A-8F50E:.│ javaapk.com文件列表生成工具.bat│ 使用说明.txt│ 免费下载更多源码.url│ 目录列表.txt│ ├─android web应用│ jqmDemo_static.zip│ jqmMobileDemo-master.zip│ jqmMo_拍照判卷源码

程序员的520--8ms给你无法复制的花式告白-程序员宅基地

文章浏览阅读221次。所有的爱,都需要及时表白 不知从何时开始 每年的5月20日都成为了一个浪漫的告白日 作为程序员的您? 想好怎样去表露心迹了吗 没头绪?没创意? 别急! 让8ms来为你的爱情助力 这有一份专属程序员的甜蜜表白攻略 快来查收吧 8ms开发工具平台-程序员的520,给你无法复制的花式告白 看过视频的你是不是很好奇这是怎么做到的呢话不多说让我们来了解一下这个嵌入式开发神器..

广州大学数据结构实验三-程序员宅基地

文章浏览阅读798次,点赞2次,收藏14次。广州大学数据结构实验三 图的操作与实现 1、线性表的链表实现:遍历、查找、插入、删除、翻转2、栈的链式存储结构实现:入栈、出栈3、队列的链式存储结构的实现:入队、出队4、线性表、栈和队列的应用........._广州大学数据结构实验

推荐文章

热门文章

相关标签