MinIO (网站 https://min.io/) 是开源的对象存储项目, 用Go实现, 支持Linux环境, 客户端支Java,Python,Javacript, Go等语言. 在分布式项目中, 可以代替本地磁盘存储和NFS等旧的存储共享方式, 方便步调以s3接口形式访问文件. 在项目使用 MinIO 代替直接文件操作, 便于扩展, 便于在本地和云服务的对象存储接口之间切换.
安装
Docker 安装
参考 https://min.io/docs/minio/container/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html
从 quay.io 或 docker hub 拉取镜像- # quay.io
- docker pull quay.io/minio/minio
- # DockerHub
- docker pull docker://minio/minio
复制代码 创建设置文件 /etc/docker/minio/config.env
- 这个文件将被映射到 minio 容器
- MINIO_VOLUMES 是 minio 容器启动后使用的存储位置, 与后面创建容器时的映射要同等
- # MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
- # This user has unrestricted permissions to perform S3 and administrative API operations on any reso
- urce in the deployment.
- # Omit to use the default values 'minioadmin:minioadmin'.
- # MinIO recommends setting non-default values as a best practice, regardless of environment
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minio123
- # MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.
- MINIO_VOLUMES="/mnt/data"
- # MINIO_OPTS sets any additional commandline options to pass to the MinIO server.
- # For example, `--console-address :9001` sets the MinIO Console listen port
- MINIO_OPTS="--console-address :9001"
复制代码 设置好硬盘挂载, 如果是测试环境, 可以创建一个目次, 例如当前使用 /var/minio, 然后启动容器
- 如果不是从 quay 拉取的镜像, 需要更换一下镜像路径
- 用-v /var/minio:/mnt/data映射minio的存储目次, 要与设置文件中的定义同等
- 用-e "MINIO_CONFIG_ENV_FILE=/etc/config.env"指定设置文件路径, 要与上面的映射同等
- docker run -dt --name minio \
- -p 9000:9000 -p 9001:9001 \
- -v /var/minio:/mnt/data \
- -v /etc/docker/minio/config.env:/etc/config.env \
- -e "MINIO_CONFIG_ENV_FILE=/etc/config.env" \
- quay.io/minio/minio \
- server --console-address ":9001"
复制代码 启动后就可以用浏览器访问 9000 端口查看 MinIO 控制台
设置
MinIO的名词定义
- Policy
- Policy 是权限管理的基础设置, JSON格式
- User
- 用户用于登录控制台(Console)
- 用户的权限通过两种方式设置, 一种是直接设置 Policies, 例如 readwrite 就对所有bucket都有读写权限; 另一种是用户组, 可以继承地点用户组的 Policies
- Group
- Access Key
- access_key 由用户本身创建
- 每个用户可以有多个 access key, 每个 access_key 与 secret_key 构成一对, 用于接口访问时验证身份
- Bucket
- Bucket 是一个文件桶, 类似于目次的概念. 可以设置容量限制, 是否保持文件版本, 是否锁定文件(防止被删除)
- 通过 Anonymous Access Rule 控制匿名访问的权限, 设置时需要设置一个路径前缀(不能使用通配符*).
- 如果可匿名读取, 那么访问文件的路径就是 http://[host]:9000/[bucket]/[file path]
Policy设置
设置含义
- Version 指定要使用的计谋语言版本. 建议使用最新的 2012-10-17 版本
- Statement 将该主要计谋元素作为以下元素的容器, 可以在一个计谋中包罗多个语句
- Sid (optional) 包括可选的语句 ID 以区分差别的语句
- Effect Allow 或 Deny 标识计谋是允许还是拒绝访问
- Principal 仅在某些环境下需要, 如果创建基于资源的计谋, 必须指示要允许或拒绝访问的账户, 用户, 角色或团结身份用户. 如果要创建 IAM 权限计谋以附加到用户或角色, 则不能包罗该元素, 此时潜在的主体为该用户或角色.
- Action 包括计谋允许或拒绝的操作列表
- Resource 如果创建 IAM 权限计谋, 必须指定操作适用的资源列表. 如果创建基于资源的计谋, 则该元素是可选的. 如果不包罗该元素, 则该操作适用的资源是计谋附加到的资源.
- Condition (optional) 指定计谋在哪些环境下授予权限
通过指定Principal(谁)针对Resource(资源对象)在什么Condition(条件)下Effect(允许还是拒绝)做什么Action(事情), 定义一条policy(计谋)
全局只读
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": [
- "s3:GetObject",
- "s3:GetBucketLocation"
- ],
- "Resource": [
- "arn:aws:s3:::*"
- ]
- }
- ]
- }
复制代码 全局只写
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": [
- "s3:PutObject"
- ],
- "Resource": [
- "arn:aws:s3:::*"
- ]
- }
- ]
- }
复制代码 全局读写
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": [
- "s3:*"
- ],
- "Resource": [
- "arn:aws:s3:::*"
- ]
- }
- ]
- }
复制代码 桶操作
针对bucket2025这个桶做的 policy, 将这个policy关联到一个minio用户后, 这个用户就可以对 bucket2025 做全部操作- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": [
- "s3:*"
- ],
- "Resource": [
- "arn:aws:s3:::bucket2025",
- "arn:aws:s3:::bucket2025/*"
- ]
- }
- ]
- }
复制代码 如果要限制用户对桶的操作, 仅允许读写内部文件, 可以束缚为下面的action列表- "Action": [
- "s3:DeleteObject",
- "s3:GetBucketLocation",
- "s3:GetObject",
- "s3:ListAllMyBuckets",
- "s3:ListBucket",
- "s3:PutObject"
- ],
复制代码 Java 调用
增长MinIO SDK依赖- <dependency>
- <groupId>io.minio</groupId>
- <artifactId>minio</artifactId>
- <version>8.5.17</version>
- </dependency>
复制代码 创建 MinioClient 实例, 这个可以复用, 但是步调退出时需要close 否则会阻塞退出, 实际使用时最好放到 try 里面- MinioClient minioClient =
- MinioClient.builder()
- .endpoint("http://192.168.1.2:9000")
- .credentials("A1DbqKtKkeukiznEM123", "B3IZXZXYD7RbVJuFP8KEAc5U2q0kHZ7yaQx11122")
- .build();
复制代码 上传文件
使用 uploadObject 方法- // Ensure bucket exists
- boolean found =
- minioClient.bucketExists(BucketExistsArgs.builder().bucket("202502").build());
- if (!found) {
- log.info("Bucket '202502' doesn't exist");
- return;
- //minioClient.makeBucket(MakeBucketArgs.builder().bucket("202502").build());
- } else {
- log.info("Bucket '202502' already exists.");
- }
- minioClient.uploadObject(
- UploadObjectArgs.builder()
- .bucket("202502")
- .object("111.png")
- .filename("D:/Documents/111.png")
- .build());
复制代码 使用 putObject, stream 方式上传大文件, 实测上传 2.3GB 文件没标题- File file = new File("big.tar.gz");
- try (MinioClient minioClient =
- MinioClient.builder()
- .endpoint("http://192.168.2.2:9000")
- .credentials("A1DbqKtKkeukiznEM123", "B3IZXZXYD7RbVJuFP8KEAc5U2q0kHZ7yaQx11122")
- .build();
- InputStream is = new FileInputStream(file);
- ) {
- minioClient.putObject(
- PutObjectArgs.builder()
- .bucket("202502")
- .object("big.tar.gz")
- .stream(is, file.length(), 1024*1024*10)
- .build());
- log.info("successfully uploaded");
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
复制代码 下载文件
下载 MinIO 上的文件到本地, 实测 2.3GB 文件没标题, 下载速度大致是上传速度的两倍- minioClient.downloadObject(
- DownloadObjectArgs.builder()
- .bucket("202502")
- .object("big.tar.gz")
- .filename("D:/Documents/big.tar.gz")
- .build());
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |