1.Create:
Request:
{
path: "/home/mordyk/readme.txt"
size: "8mb"
}
Response:
{
file_id: "id1",
chunk_size: "4mb",
chunks: [
{
chunk_id: "id1",
servers: ["server1", "server2", "server3"]
},
{
chunk_id: "id2",
servers: ["server1", "server2", "server3"]
}
]
}
2.Read:
Request:
{
path: "/home/mordyk/readme.txt"
}
Response:
{
file_id: "id1",
chunks: [
{
chunk_id: "id1",
servers: ["server1", "server2", "server3"]
},
{
chunk_id: "id2",
servers: ["server1", "server2", "server3"]
}
]
}
3.Delete:
Request:
{
path: "/home/mordyk/readme.txt"
}
Response:
{
status: "deleted"
}
4.List directory:
Request:
{
path: "/home/mordyk/"
}
Response:
{
files: [
"file1",
"file2",
]
}
5.Create/Delete directory:
Request:
{
path: "/home/mordyk/"
}
Response:
{
status: "done"
}
6.Lock file:
Request:
{
path: "/home/mordyk/file.txt",
lockType: "write",
}
Response:
{
lock: "lockid",
status: "aquired",
}
7.Unlock file:
Request:
{
lock: "lockid",
}
Response:
{
status: "done"
}
7.Get Metadata
Request:
{
path: "/home/mordyk/file.txt",
}
Response:
{
file_id: "id1",
size: "8mb",
created_at: timestampt,
version: "ver_1",
owner: "user1",
}
Responsible for managing file/object metadata.
Main components:
Stores the actual user data.
Components:
files - stores files.
files (
file_id: "id",
directory_id: "id",
filename: "name",
owner: "name",
size: "4mb",
version: "1",
created_at: "TIMESTAMP",
updated_at" "TIMESTAMP",
);
Directories - stores directories.
directories (
directory_id: "id",
parent_directory_id: "id",
name: "name",
);
Chunk - each file is divided into chunks.
chunks (
chunk_id: "id",
file_id: "id",
chunk_index: "offset",
checksum: "hash",
version: "1",
size: "64mb",
);
Storage_nodes - represents every storage server.
storage_nodes (
node_id: "id",
hostname: "name",
rack: "rack",
status: "status",
free_space: "12600 mb"
);
chunk_replicas - a chunk can exist on multiple nodes.
chunk_replicas (
chunk_id: "id",
node_id: "id",
);
Lease - tracks who currently coordinates writes.
leases (
chunk_id: "id",
primary_node: "node",
lease_expiry: "TIMESTAMP",
);
API Gateway (API GW) is the single entry point for all client requests into a distributed system:
Metadata service level - stores only metadata:
We need raft to ensure all Metadata Servers have the same data, even if servers crash or the network is unreliable.
Storage Nodes are the workers of a distributed file system. They store the actual file data, while metadata is maintained by the Metadata Server (Master).
A Storage Node is responsible for:
Each Storage Node has:
Optimizations for read operation in storage node:
To scale metadata storage, the Metadata Service uses sharding/partitioning across multiple metadata servers. Files/directories are distributed using strategies like hash-based partitioning or namespace-based partitioning. Each metadata shard is replicated using Raft/Paxos for high availability and consistency. A metadata router directs client requests to the correct shard.
Sharding strategies: