Minio 是如何拆分数据多节点存储的?
MinIO 使用 Reed-Solomon erasure coding 技术,将数据分成多个数据片(data shards)和冗余片(parity shards)。
这些片段被分布存储在不同的节点上。以下是如何将数据拆分并在每个节点存储的详细说明。
Erasure Coding 基础
在 erasure coding 中,数据被分成 n 个数据片和 m 个冗余片。为了恢复原始数据,至少需要 n 个片段(数据片或冗余片)。
典型配置如下:
- (n, m) = (2, 2):2 个数据片和 2 个冗余片,总共 4 个片段。
- (n, m) = (2, 1):2 个数据片和 1 个冗余片,总共 3 个片段。
数据拆分和存储示例
配置 (2, 2) - 4 个节点
-
原始数据:
假设我们有一个原始数据块 D。 -
数据拆分:
- D 被分成两个数据片:Data1 和 Data2。
- 生成两个冗余片:Parity1 和 Parity2。
-
存储在节点上:
- Node1 存储 Data1。
- Node2 存储 Data2。
- Node3 存储 Parity1。
- Node4 存储 Parity2。
Node1: Data1
Node2: Data2
Node3: Parity1
Node4: Parity2
配置 (2, 1) - 3 个节点
-
原始数据:
假设我们有一个原始数据块 D。 -
数据拆分:
- D 被分成两个数据片:Data1 和 Data2。
- 生成一个冗余片:Parity1。
-
存储在节点上:
- Node1 存储 Data1。
- Node2 存储 Data2。
- Node3 存储 Parity1。
Node1: Data1
Node2: Data2
Node3: Parity1
冗余和容错能力
(2, 2) 配置的容错能力
- 可以容忍最多 2 个节点故障。
- 需要至少 2 个数据片才能恢复原始数据。
例如:
- 如果 Node1 和 Node2 都故障,剩下的 Parity1 和 Parity2 可以恢复 Data1 和 Data2。
- 如果 Node1 和 Node3 都故障,剩下的 Data2 和 Parity2 可以恢复 Data1。
(2, 1) 配置的容错能力
- 可以容忍 1 个节点故障。
- 需要至少 2 个片段(包括数据片和冗余片)才能恢复原始数据。
例如:
- 如果 Node1 故障,剩下的 Data2 和 Parity1 可以恢复 Data1。
- 如果 Node3 故障,剩下的 Data1 和 Data2 已经足够恢复原始数据。
具体的拆分和存储过程
-
拆分数据:
- MinIO 使用 Reed-Solomon 算法将原始数据分割成 n 个数据片和 m 个冗余片。
-
存储分片:
- 每个片段被存储在不同的节点上,以确保冗余和高可用性。
-
数据恢复:
- 当一个或多个节点故障时,MinI