Files
leetcode/apps/docs/content/system-design/(02-core-designs)/15-google-drive.mdx
T

254 lines
9.1 KiB
Plaintext
Raw Normal View History

2026-10-07 14:18:14 -04:00
---
title: "Design Google Drive"
description: "Upload, sync and share files across devices with block storage, delta sync, a metadata database, and notifications."
icon: hard-drive
sidebar:
label: "Google Drive"
---
## Introduction
Google Drive is a cloud-based file storage and synchronization service that allows users to store, access, and share files from various devices. This chapter discusses designing a scalable system with the following features:
- **File Upload and Download**
- **File Sync Across Devices**
- **File Sharing**
- **File Revision History**
- **Notifications for Edits, Deletes, and Shares**
---
## Step 1: Understanding the Problem
### Key Requirements
#### Functional Requirements:
- Upload and download files.
- Sync files across multiple devices.
- Maintain file revisions.
- Enable file sharing with permissions.
- Send notifications on file edits, deletions, and shares.
#### Non-Functional Requirements:
- **Reliability:** Data loss is unacceptable.
- **Fast Sync Speed:** Avoid user impatience with delayed syncing.
- **Bandwidth Efficiency:** Minimize unnecessary data usage.
- **Scalability:** Handle 10 million daily active users (DAU).
- **High Availability:** Operate seamlessly during server failures or network issues.
### Constraints and Assumptions
- Users get **10 GB free space**.
- Maximum file size: **10 GB**.
- Average file upload size: **500 KB**.
- Upload frequency: **2 files per day per user**.
- Total storage required: **500 PB**.
---
## Step 2: High-Level Design
### Single-Server Setup
A basic setup includes:
1. **Web Server:** Handles uploads and downloads.
2. **Metadata Database:** to keep track of metadata like user data, login info, files info/
3. **Storage Directory:** Holds files organized by namespaces.
<Frame caption="Namespaces">
![Namespaces](./images/google-drive/namespaces.png)
</Frame>
- A web server and a directory called drive/ is set up as the root directory to store uploaded files.
- Under drive/ directory, there is a list of directories called namespaces.
- Each namespace contains all the uploaded files for that user.
- Each file or folder can be uniquely identified by joining the namespace and the relative path.
This design serves as a starting point but is inadequate for scaling.
#### APIs
1. **Upload a file to Google Drive:** Two types of uploads are supported
- Simple upload: Used when file size is small.
- Resumable upload:
- Endpoint: https://api.example.com/files/upload?uploadType=resumable
- Send the initial request to retrieve the resumable URL.
- Upload the data and monitor upload state
- If upload is disturbed, resume the upload.
2. **Download a file from Google Drive:** To download a file
- Endpoint: https://api.example.com/files/download
3. **Get file revisions:**
- Endpoint: https://api.example.com/files/list_revisions
### Moving to Distributed Systems
#### Improvements:
1. **Sharding:** Split storage across servers based on `user_id`.
2. **Amazon S3:** Use S3 for scalable and redundant file storage with cross-region replication.
<Frame caption="Replication">
![Replication](./images/google-drive/replication.png)
</Frame>
3. **Load Balancer:** Distribute traffic across multiple web servers.
4. **Metadata Database Replication:** Ensure availability through database sharding and replication.
#### Sync Conflicts:
For a large storage system like Google Drive, sync conflicts happen from time to time.
When two users modify the same file or folder at the same time, a conflict happens.
<Frame caption="Sync Conflicts">
![Sync Conflicts](./images/google-drive/sync-conflicts.png)
</Frame>
- In the example user 1 and user 2 tries to update the same file at the same time, but user 1’s file is processed by our system first.
- User 1’s update operation goes through, but, user 2 gets a sync conflict.
- The system presents both copies of the same file: user 2’s local copy and the latest version from the server.
- User 2 has the option to merge both files or override one version with the other.
### Improved design
<Frame caption="High Level Design">
![High Level Design](./images/google-drive/high-level-design.png)
</Frame>
1. **User Interaction:**: Users access the application via browser or mobile app.
2. **Block Servers:**
- Files are split into **4 MB blocks** (maximum size) and assigned unique hash values.
- Blocks are stored independently in cloud storage (e.g., Amazon S3).
- File reconstruction involves joining blocks in a specific order.
3. **Cloud Storage:** Blocks are stored in cloud storage for scalability and redundancy.
4. **Cold Storage:** Inactive files are moved to cold storage to reduce costs.
5. **Load Balancer:** Distributes requests evenly among API servers to ensure efficient operation.
6. **API Servers:**
- Handle user authentication, profile management, and file metadata updates.
- Manage all non-uploading workflows.
7. **Metadata Database and Cache:**
- Stores metadata for users, files, blocks, and versions.
- Frequently accessed metadata is cached for faster retrieval.
8. **Notification Service:**
- A **publisher/subscriber system** that notifies clients about file changes (add, edit, delete).
- Ensures clients can pull the latest updates.
9. **Offline Backup Queue:** Temporarily stores file change information for offline clients to sync when back online.
---
## Step 3: Design Deep Dive
### Metadata Database
A highly simplified is shown below version as it only includes the most important tables and fields.
#### Schema Design:
- **User Table:** Stores user profiles and preferences.
- **File Table:** Maintains file metadata (e.g., size, name, path).
- **Block Table:** Tracks file blocks for reconstructing files.
- **File Version Table:** Stores file revision history.
<Frame caption="Metadata Database">
![Metadata Database](./images/google-drive/metadata-database.png)
</Frame>
---
### File Upload Flow
1. **File Upload:**
- File is split into blocks, compressed, and encrypted by the block server.
- Blocks are uploaded to block servers and stored in S3.
2. **Metadata Upload:**
- Client sends metadata to the API server.
- Metadata is stored in the database with status `pending`.
3. **Completion:**
- S3 triggers a callback to update the file status to `uploaded`.
- Notification service informs relevant users.
<Frame caption="Upload Flow">
![Upload Flow](./images/google-drive/upload-flow.png)
</Frame>
---
### File Sync
1. **Delta Sync:** Transfer only modified blocks instead of the entire file.
<Frame caption="Delta Sync">
![Delta Sync](./images/google-drive/delta-sync.png)
</Frame>
2. **Compression:** Blocks are compressed using compression algorithms depending on file types.
3. **Conflict Resolution:**
- First processed version wins.
- Conflicting versions are saved separately for user resolution.
<Frame caption="File Synce">
![File Synce](./images/google-drive/file-sync.png)
</Frame>
---
### File Download Flow
Download flow is triggered when a file is added or edited elsewhere. There are two ways a client can know:
- If client A is online while a file is changed by another client, notification service will inform client A.
- If client A is offline while a file is changed by another client, data will be saved to the cache. When the offline client is online again, it pulls the latest changes.
Once a client knows a file is changed, it first requests metadata via API servers, then
downloads blocks to construct the file.
1. **Trigger:** Notification service informs the client of file updates.
2. **Metadata Fetch:** Client retrieves updated metadata via API.
3. **Block Download:** Client downloads updated blocks from block servers and reconstructs the file.
<Frame caption="Upload Flow">
![Upload Flow](./images/google-drive/download-flow.png)
</Frame>
---
### Notification Service
1. **Purpose:** Keeps clients updated about file changes.
2. **Mechanism:** Implements **long polling** for asynchronous notifications.
3. **Example:** When a file is added, edited, or deleted, notifications are pushed to all relevant clients.
---
### Storage Optimization
1. **De-duplication:** Remove duplicate blocks at the account level using hash-based comparisons.
2. **Versioning Strategy:**
- Limit the number of saved revisions.
- Prioritize recent versions for frequently edited files.
3. **Cold Storage:** Move rarely accessed files to cheaper storage solutions (e.g., Amazon S3 Glacier).
---
### Failure Handling
1. **Load Balancer Failure:** Secondary load balancer becomes active.
2. **Block Server Failure:** Pending tasks are reassigned to other servers.
3. **Metadata Database Failure:**
- Promote a slave node to master.
- Redirect traffic to remaining replicas.
4. **Cloud Storage Failure:** Use cross-region replication to fetch unavailable files.
5. **Notification Service Failure:** Clients reconnect to alternative servers.
## Further reading
- [Differential Synchronization](https://neil.fraser.name/writing/sync/)
- [Differential Synchronization Video](https://www.youtube.com/watch?v=S2Hp_1jqpY8)
- [How We've Scaled Dropbox](https://www.youtube.com/watch?v=PE4gwstWhmc&feature=youtu.be)