Minio 分布式文件系统详解 分别使用java与js操作

Minio 分布式文件系统详解 分别使用java与js操作

  • 1、Minio服务搭建
    • 1.1、Minio单节点搭建
    • 1.2、Minio docker部署
    • 1.3、Minio 纠删码部署
  • 2、Minio Client 的使用
  • 3、Java 操作 Minio
  • 4、JS 操作 Minio

1、Minio服务搭建

1.1、Minio单节点搭建

直接在linux上进行环境搭建,使用命令进行下载minio并且启动服务

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data

服务启动之后,可以直接对9000端口进行访问,同样的启动服务之后有日志进行输出。可以看到日志所表达的意思,在这里的一个控制台的端口是一个动态生成的,每一次启动服务的端口都会发生变换,在后续进行使用的使用肯定需要用到一个静态端口,可以使用--console-address ":38345"来进行端口指定,并且第二个的话是指不推荐使用默认账号密码。

WARNING: Console endpoint is listening on a dynamic port (38345), please use --console-address ":PORT" to choose a static port.
WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

对账号密码进行设置,并且指定控制台端口进行启动。

export MINIO_ROOT_USER=admin
# export MINIO_ROOT_PASSWORD=123456
export MINIO_ROOT_PASSWORD=123456
./minio server --console-address ":38345"  /tools/minio/data

在设置完账号密码之后进行启动,发现了报错,访问密钥长度至少3个字符,密钥长度至少8个字符……,密钥太短了,把密码设置长点即可。

ERROR Unable to validate credentials inherited from the shell environment: Invalid credentials
      > Please provide correct credentials
      HINT:
        Access key length should be at least 3, and secret key length at least 8 characters

1.2、Minio docker部署

直接通过docker命令进行构建一个容器进行服务启动,

docker run -p 9000:9000 -p 50000:50000 --name minio 
	-e "MINIO_ROOT_USER=admin" 
	-e "MINIO_ROOT_PASSWORD=12345678" 
	-v /tools/minio/data:/data 
	minio/minio server --console-address ":50000" /data

1.3、Minio 纠删码部署

通过这种方式进行部署,可以发现在对一个节点进行文件上传之后,其他的节点也会生成相对应的文件。而当单个的文件存储的目录损坏,并不会影响到文件的使用,其他的目录还可以进行提供服务。

 docker run -p 9000:9000 -p 50000:50000 --name minio \
 	-v /tools/minio/data1:/data1 \
 	-v /tools/minio/data2:/data2 \
 	-v /tools/minio/data3:/data3 \
 	-v /tools/minio/data4:/data4 \
 	-v /tools/minio/data5:/data5 \
 	-v /tools/minio/data6:/data6 \
 	-v /tools/minio/data7:/data7 \
 	-v /tools/minio/data8:/data8 \
 	minio/minio server --console-address ":50000" /data{1...8}

2、Minio Client 的使用

直接使用官方的方式进行下载安装

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc

MC的使用,进行连接到minio服务器,这里已经启动好了一个服务器,MC的配置文件可以通过第一行命令进行查看,第二行命令直接把当前服务器的信息给加入到配置当中。

./mc config host ls
./mc config host add minio http://192.168.101.128:9000 admin 12345678
# 删除配置
./mc config host remove minio

这里对于mc的相关的一些指令在官网当中也有了相关的描述。

alias       set, remove and list aliases in configuration file
ls          list buckets and objects
mb          make a bucket
rb          remove a bucket
cp          copy objects
mirror      synchronize object(s) to a remote site
cat         display object contents
head        display first 'n' lines of an object
pipe        stream STDIN to an object
share       generate URL for temporary access to an object
find        search for objects
sql         run sql queries on objects
stat        show object metadata
mv          move objects
tree        list buckets and objects in a tree format
du          summarize disk usage recursively
retention   set retention for object(s)
legalhold   set legal hold for object(s)
diff        list differences in object name, size, and date between two buckets
rm          remove objects
encrypt    manage bucket encryption config
event       manage object notifications
watch       listen for object notification events
undo        undo PUT/DELETE operations
policy      manage anonymous access to buckets and objects
tag         manage tags for bucket(s) and object(s)
ilm         manage bucket lifecycle
version     manage bucket versioning
replicate   configure server side bucket replication
admin       manage MinIO servers
update      update mc to latest release

简单对几个命令进行使用,其余的命令都基本上差不多

# 查看minio的所有桶信息
./mc ls minio
# 上传文件到桶当中
./mc cp /tools/minio/index.html minio1/bucket1
# 将桶中的文件下载当虚拟机当中
./mc cp minio1/bucket1/index.html /tools/minio
# 创建桶
./mc mb minio1/bucket2
# 删除桶
./mc rb minio1/bucket2
# 强制删除桶
./mc rb --force minio1/bucket2

MC admin 的使用:官网描述

service     restart and stop all MinIO servers
update      update all MinIO servers
info        display MinIO server information
user        manage users
group       manage groups
policy      manage policies defined in the MinIO server
config      manage MinIO server configuration
heal        heal disks, buckets and objects on MinIO server
profile     generate profile data for debugging purposes
top         provide top like statistics for MinIO
trace       show http trace for MinIO server
console     show console logs for MinIO server
prometheus  manages prometheus config
kms         perform KMS management operations
bucket      manage buckets defined in the MinIO server

使用命令进行使用

# 查看所有用户
./mc admin user list minio1
# 添加用户
./mc admin user add minio1 yueyue
# 删除用户
./mc admin user remove minio1 yueyue
# 查看所有策略
./mc admin policy list minio1
# 查看策略信息
./mc admin policy info minio readwrite
# 自定义策略
./mc admin policy add minio1 lzq /root/lzq.json
# 自定义文件 lzq.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::lzq/*"
            ]
        }
    ]
}

# 给用户指定策略
./mc admin policy set minio1 lzq user=yueyue

3、Java 操作 Minio

首先直接导入minio的操作jar包。

<dependency>
    <groupId>io.miniogroupId>
    <artifactId>minioartifactId>
    <version>8.3.4version>
dependency>

之后就可以直接使用代码来对minio提供的SDK进行操作了,比较常用的还是上传文件和下载文件,先创建一个MC对象,之后对MC对象进行操作上传和下载文件即可。

    public static void main(String[] args) throws Exception {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint("http://192.168.101.128:9000")
                            .credentials("admin", "12345678")
                            .build();
            boolean found =
                    minioClient.bucketExists(BucketExistsArgs.builder().bucket("bucket1").build());
            if (!found) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("bucket1").build());
                System.out.println("bucket1 桶不存在 已创建该桶");
            }
            try{
            minioClient.uploadObject(
                    UploadObjectArgs.builder()
                            .bucket("lzq")
                            .object("pom1.xml")
                            .filename("pom.xml")
                            .build());
            System.out.println("上传成功");
        } catch (Exception e) {
            System.out.println("获取MC对象失败");
        }
    }

在下载文件有提供两种方式,一种是直接下载到指定目录下的,另一种是可以直接生成一个url地址,提供给前端进行下载的,这里提供的url也可以设置一个有效时间。

    public static void main(String[] args) throws Exception{
        try {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint("http://192.168.101.128:9000")
                            .credentials("admin", "12345678")
                            .build();
            minioClient.downloadObject(
                    DownloadObjectArgs.builder()
                            .bucket("lzq")
                            .object("pom1.xml")
                            .filename("./pom1.xml")
                            .build());
            System.out.println("下载成功");
            Map<String, String> reqParams = new HashMap<String, String>();
            reqParams.put("response-content-type", "application/json");
            String url =
                    minioClient.getPresignedObjectUrl(
                            GetPresignedObjectUrlArgs.builder()
                                    .method(Method.GET)
                                    .bucket("lzq")
                                    .object("pom.xml")
                                    .expiry(60, TimeUnit.SECONDS)
                                    .extraQueryParams(reqParams)
                                    .build());
            System.out.println(url);
        }catch (Exception e){
            System.out.println("获取MC对象失败");
        }
    }

而对于其余的SDK操作可以直接到minio的官网进行查看进行相对应的操作。https://docs.min.io/docs/java-client-api-reference.html

4、JS 操作 Minio

在minio的SDK当中提供了对多种语言的支持,常用的还是java,很多时候对于简单的项目来说完全就不需要走后端了,直接在前端完成上传和下载文件岂不是更快,对于现在的vue+elementui来开发前端,直接用elementui提供的组件进行操作。

首先构建一个vue脚手架项目,把elementui和minio的依赖进行安装。

npm install --save minio
npm i element-ui -S

最简单的方式就是直接连接到客户端,将文件直接上传到指定的桶当中

var Minio = require('minio')

var minioClient = new Minio.Client({
	endPoint: '192.168.101.128',
	port: 9000,
	useSSL: false,
	accessKey: 'admin',
	secretKey: '12345678'
});

var file = './test.html'

minioClient.fPutObject('lzq', 'test.html', file, function(err, etag) {
	if (err) return console.log(err)
	console.log('文件上传成功')
});

这里的话每一次上传的文件的文件名都是相同的话那不就会裂开,所以在这里可以使用一个vue-uuid,用来生成uuid,将uuid作为文件名来保持每个文件的内容都不相同,并且光看文件名完全猜不到文件的内容。首先直接导入依赖。

npm i -S vue-uuid

之后就是在代码当中导入,主要有三种方式:

1、 在全局当中导入

import UUID from "vue-uuid";
Vue.use(UUID);

this.$uuid.v1()

2、 局部导入

import { uuid } from 'vue-uuid';

uuid.v1()

3、 在node当中使用

const uuid = require('uuid')
uuid.v4()

之后就可以直接进行导入使用了,这里就先直接写在js当中,用node来进行启动。

var Minio = require('minio')
const uuid = require('uuid')

var minioClient = new Minio.Client({
	endPoint: '192.168.101.128',
	port: 9000,
	useSSL: false,
	accessKey: 'admin',
	secretKey: '12345678'
});

var file = './test.html'

minioClient.fPutObject('lzq', uuid.v4(), file, function(err, etag) {
	if (err) return console.log(err)
	console.log('文件上传成功')
});

这样每一次上传到minio服务器的文件名都是uuid的值,每个文件的名称都保持了唯一。这里前面是根据文件的所在目录来进行上传文件,还可以通过文件的内容进行转码来进行文件上传。

var Fs = require('fs')
var file = './test.html'
var fileStream = Fs.createReadStream(file)
var fileStat = Fs.stat(file, function(err, stats) {
  if (err) {
    return console.log(err)
  }
  minioClient.putObject('lzq', uuid.v4(), fileStream, stats.size, function(err, objInfo) {
      if(err) {
          return console.log(err) // err should be null
      }
   console.log("Success", objInfo)
  })
})

最后就是文件下载了,在前面可以将文件给进行上传到指定的桶当中,之后就可以直接通过桶去拿桶里面指定的文件了。

var size = 0
function Uint8ArrayToString(fileData) {
  var dataString = ''
  for (var i = 0; i < fileData.length; i++) {
    dataString += String.fromCharCode(fileData[i])
  }
  return dataString
}

let base64Str = ''
minioClient.getObject('lzq', '1.png', function(err, dataStream) {
  if (err) {
    return console.log(err)
  }
  dataStream.on('data', function(chunk) {
	base64Str += Uint8ArrayToString(chunk)
  })
  dataStream.on('end', function() {
	console.log(base64Str)
  })
  dataStream.on('error', function(err) {
    console.log(err)
  })
})

这里的话是图片文件,图片文件转成base64的文件内容就可以直接通过html或者css进行显示到页面上了。

你可能感兴趣的:(中间件,minio,java,linux,javascript)