MinIO学习笔记
简介
对象存储在云环境下是一种基础设施,在大数据、AI领域可以将它作为基本的存储方式。Spark、TensorFlow都可以使用对象存储,它也可以作为HDFS的代替者。
MinIO是一个开源的对象存储解决方案,特点包括:
- 高性能:作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GG/s的写速率
- 可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心
- 云原生:容器化、基于K8S的编排、多租户支持
- 兼容性:兼容S3 API这一事实上的对象存储标准,最先支持S3 Select
- 简单:这一设计原则让MinIO不容易出错、更快启动
- 支持纠删码:MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据
安装配置
单实例
物理机
1 2 3 |
wget https://dl.min.io/server/MinIO/release/linux-amd64/MinIO chmod +x MinIO ./MinIO server /data |
Docker
MinIO需要一个卷来存储配置、数据。默认需要开启9000端口:
1 2 |
# 运行服务器,以 /data为存储目录 docker run -p 9000:9000 --name MinIO1 -v /mnt/data:/data MinIO/MinIO server /data |
纠删码
MinIO使用纠删码、Checksum来防止(多个)硬件错误和静默数据污染(Bit Rot,在没有任何信号的情况下磁盘发生数据错误)。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据。
纠删码是一种数学手段,用于重构出丢失/污染的数据。MinIO使用Reed-Solomon来将对象分片到若干数据块(Data block)和校验块(Partity block)中。对于12磁盘组成的存储,一个对象可以分片到最多6个校验块+6个数据块中,最少2个校验块+10个数据块中。
默认情况下,对象分片到N/2的数据盘、N/2的校验盘中。你可以使用Storage Class修改此配置。
Docker
8磁盘组成的MinIO服务器:
1 2 3 4 5 6 7 8 9 10 |
docker run -p 9000:9000 --name minio \ -v /mnt/data1:/data1 \ -v /mnt/data2:/data2 \ -v /mnt/data3:/data3 \ -v /mnt/data4:/data4 \ -v /mnt/data5:/data5 \ -v /mnt/data6:/data6 \ -v /mnt/data7:/data7 \ -v /mnt/data8:/data8 \ minio/minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8 |
Kubernetes
将MinIO部署到K8S中的途径有多种:
- MinIO-Operator:无缝的创建、更新高可用MinIO集群
- 通过Helm Chart
- 使用YAML文件
Operator
启用MinIO Operator需要K8S 1.15+,安装以下K8S资源:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
apiVersion: v1 kind: Namespace metadata: # 安装到的命名空间 name: minio --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: minioinstances.miniocontroller.min.io spec: group: miniocontroller.min.io version: v1beta1 scope: Namespaced names: kind: MinIOInstance singular: minioinstance plural: minioinstances # 去掉下面这行则1.13也可以用 preserveUnknownFields: true validation: openAPIV3Schema: type: object properties: spec: type: object properties: replicas: type: integer minimum: 1 maximum: 32 version: type: string mountpath: type: string subpath: type: string additionalPrinterColumns: - name: Replicas type: integer JSONPath: ".spec.replicas" --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: minio-operator-role rules: - apiGroups: - "" resources: - namespaces - secrets - pods - services - events verbs: - get - watch - create - list - patch - apiGroups: - apps resources: - statefulsets verbs: - get - create - list - patch - watch - apiGroups: - "certificates.k8s.io" resources: - "certificatesigningrequests" - "certificatesigningrequests/approval" - "certificatesigningrequests/status" verbs: - update - create - get - apiGroups: - miniocontroller.min.io resources: - "*" verbs: - "*" - apiGroups: - min.io resources: - "*" verbs: - "*" --- apiVersion: v1 kind: ServiceAccount metadata: name: minio-operator-sa namespace: minio --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: minio-operator-binding namespace: minio roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: minio-operator-role subjects: - kind: ServiceAccount name: minio-operator-sa namespace: minio --- apiVersion: apps/v1 kind: Deployment metadata: name: minio-operator namespace: minio spec: replicas: 1 selector: matchLabels: name: minio-operator template: metadata: labels: name: minio-operator spec: serviceAccountName: minio-operator-sa containers: - name: minio-operator # Operator镜像 image: docker.gmem.cc/minio/k8s-operator:1.0.4 imagePullPolicy: IfNotPresent |
要创建一个MinIO集群,创建如下CR:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
apiVersion: v1 kind: Secret metadata: name: minio-creds-secret type: Opaque data: # minio accesskey: bWluaW8= # minio123 secretkey: bWluaW8xMjMK --- apiVersion: miniocontroller.min.io/v1beta1 kind: MinIOInstance metadata: name: minio ## 可以指定使用的Pod调度器 # scheduler: # name: my-custom-scheduler spec: ## 由StatefulSet创建的Pod的元数据 metadata: labels: app: minio annotations: prometheus.io/path: /minio/prometheus/metrics prometheus.io/port: "9000" prometheus.io/scrape: "true" ## MinIO服务器镜像 image: docker.gmem.cc/minio/minio:RELEASE.2019-12-17T23-16-33Z ## MinIO示例使用的凭证 credsSecret: name: minio-creds-secret ## 副本份数,如果设置为1则为单实例模式,不支持从单实例模式升级为分布式模式 ## 如果要运行分布式模式,最少设置为4,必须偶数 replicas: 4 ## StatefulSet 使用的PodManagement policy,可选值"OrderedReady"、"Parallel"(默认) ## 如果设置为"OrderedReady"则会禁用Readiness checks podManagementPolicy: Parallel ## 启用基于K8S的证书生成和签名,参考https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster requestAutoCert: false ## 证书关键信息 certConfig: commonName: "" organizationName: [] dnsNames: [] ## 可以指定容忍配置 # tolerations: # - effect: NoSchedule # key: dedicated # operator: Equal # value: storage ## MinIO容器的环境变量 env: - name: MINIO_BROWSER value: "on" # - name: MINIO_STORAGE_CLASS_RRS # value: "EC:2" resources: requests: memory: 512Mi cpu: 250m liveness: httpGet: path: /minio/health/live port: 9000 initialDelaySeconds: 120 periodSeconds: 20 ## Readiness check仅在PodManagementPolicy 为 "Parallel"时工作 readiness: httpGet: path: /minio/health/ready port: 9000 initialDelaySeconds: 120 volumeClaimTemplate: metadata: name: data spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi |
Helm Chart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
helm repo update helm search minio # NAME CHART VERSION APP VERSION DESCRIPTION # kube/minio 5.0.1 master MinIO is a high performance data infrastructure for machi... kubectl create ns minio kubectl -n minio create sa minio kubectl -n minio patch sa minio -p '{"imagePullSecrets": [{"name": "gmemregsecret"}]}' helm install kube/minio --name=minio --namespace=minio \ # 设置访问凭证,注意secretkey至少8字符 分布式 副本份数 每个节点PV个数 --set accessKey=minio,secretKey=minio123,mode=distributed,replicas=4,drivesPerNode=1 \ --set fullnameOverride=minio,image.repository=docker.gmem.cc/minio/minio,image.tag=RELEASE.2019-12-17T23-16-33Z \ --set serviceAccount.name=minio,serviceAccount.create=false,clusterDomain=k8s.gmem.cc |
命令行
MinIO提供了可以操控任何S3兼容对象存储的命令行mc。
安装
下载:https://dl.min.io/client/mc/release/linux-amd64/mc放到$PATH下即可。
子命令
子命令 | 说明 | ||
ls |
列出桶和对象
|
||
tree |
以树形结构列出桶和对象
|
||
mb |
创建一个桶,或创建目录结构
|
||
rb |
移除一个桶
|
||
cat | 查看对象内容 | ||
head | 显示对象的前N行 | ||
pipe | 将标准输入写入STDIN | ||
share | 创建一个用于临时访问对象的URL | ||
cp | 复制对象 | ||
mirror | 和远程站点同步对象 | ||
find | 查找对象 | ||
sql | 针对对象执行SQL查询 | ||
stat | 对象内容的统计信息 | ||
diff | 列出桶之间的差异,包括对象名、尺寸、日期 | ||
rm | 移除对象 | ||
event | 管理对象通知 | ||
watch | 监控对象事件 | ||
policy | 管理对对象的匿名访问 | ||
admin | 管理MinIO服务器 | ||
session | 为cp命令管理已保存的会话 | ||
config |
管理mc配置文件 mc config host,管理可用的S3服务:
|
||
update | 检查软件更新 |
Leave a Reply