mirror of
https://github.com/donnemartin/system-design-primer.git
synced 2024-03-22 13:11:35 +08:00
848 lines
50 KiB
Markdown
848 lines
50 KiB
Markdown
# The System Design Primer
|
||
|
||
<p align="center">
|
||
<img src="http://i.imgur.com/jrUBAF7.png">
|
||
<br/>
|
||
</p>
|
||
|
||
## Motivation
|
||
|
||
> Learn how to design large scale systems from the open source community.
|
||
>
|
||
> Understand real-world architectures.
|
||
>
|
||
> Prep for the system design interview.
|
||
|
||
### Learn how to design large scale systems
|
||
|
||
Learning how to design scalable systems will make you a better engineer.
|
||
|
||
System design is a broad topic. There is a **vast amount of resources scattered throughout the web** on system design principles.
|
||
|
||
This repo is an **organized collection** of resources to help you learn how to build systems at scale.
|
||
|
||
Topics for learning system design:
|
||
|
||
* [System design topic summaries](#index-of-system-design-topics)
|
||
* [Real world architectures](#real-world-architectures)
|
||
* [Engineering blogs](#company-engineering-blogs)
|
||
|
||
#### Learn from the open source community
|
||
|
||
This is an **early draft** of a **continually updated, open source** project.
|
||
|
||
[Contributions](#contributin) are welcome!
|
||
|
||
### Prep for the system design interview
|
||
|
||
In addition to coding interviews, system design is a **required component** of the **technical interview process** at many tech companies.
|
||
|
||
**Practice common system design interview questions** and **compare** your results with sample **discussions, code, and diagrams**.
|
||
|
||
Additional topics for interview prep:
|
||
|
||
* [Study guide](#study-guide)
|
||
* [How to approach a system design interview question](#how-to-approach-a-system-design-interview-question)
|
||
* [System design interview questions, **with solutions**](#system-design-interview-questions-with-solutions)
|
||
* [Object-oriented design interview questions, **with solutions**](#object-oriented-design-interview-questions-with-solutions)
|
||
* [Additional system design interview questions](#additional-system-design-interview-questions)
|
||
|
||
#### For interviews, do I need to know everything here?
|
||
|
||
**No, you don't need to know everything here to prepare for the interview**.
|
||
|
||
What you are asked in an interview depends on variables such as:
|
||
|
||
* How much experience you have
|
||
* What your technical background is
|
||
* What positions you are interviewing for
|
||
* Which companies you are interviewing with
|
||
* Luck
|
||
|
||
More experienced candidates are generally expected to know more about system design. Architects or team leads might be expected to know more than individual contributors. Top tech companies are likely to have one or more design interview rounds.
|
||
|
||
#### Any resources to prep for coding interviews?
|
||
|
||
Check out the sister repo [**interactive-coding-challenges**](https://github.com/donnemartin/interactive-coding-challenges) for coding interview resources.
|
||
|
||
## Contributing
|
||
|
||
> Learn from the community.
|
||
|
||
Feel free to submit pull requests to help:
|
||
|
||
* Fix errors
|
||
* Improve sections
|
||
* Add new sections
|
||
|
||
Content that needs some polishing is placed [under development](#under-development).
|
||
|
||
Review the [Contributing Guidelines](https://github.com/donnemartin/awesome-aws/blob/master/CONTRIBUTING.md).
|
||
|
||
## Index of system design topics
|
||
|
||
> Summaries of various system design topics, including pros and cons. **Everything is a trade-off**.
|
||
>
|
||
> Each section contains links to more in-depth resources.
|
||
|
||
![Imgur](http://i.imgur.com/jj3A5N8.png)
|
||
|
||
* [System design topics: start here](#system-design-topics-start-here)
|
||
* [Step 1: Review the scalability video lecture](#step-1-review-the-scalability-video-lecture)
|
||
* [Step 2: Review the scalability article](#step-2-review-the-scalability-article)
|
||
* [Next steps](#next-steps)
|
||
* [Performance vs scalability](#performance-vs-scalability)
|
||
* [Latency vs throughput](#latency-vs-throughput)
|
||
* [Availability vs consistency](#availability-vs-consistency)
|
||
* [CAP theorem](#cap-theorem)
|
||
* [CP - consistency and partition tolerance](#cp-consistency-and-partition-tolerance)
|
||
* [AP - availability and partition tolerance](#ap-availability-and-partition-tolerance)
|
||
* [Consistency patterns](#consistency-patterns)
|
||
* [Weak consistency](#weak-consistency)
|
||
* [Eventual consistency](#eventual-consistency)
|
||
* [Strong consistency](#strong-consistency)
|
||
* [Availability patterns](#availability-patterns)
|
||
* [Fail-over](#fail-over)
|
||
* [Replication](#replication)
|
||
* [Domain name system](#domain-name-system)
|
||
* [Content delivery network](#content-delivery-network)
|
||
* [Push CDNs](#push-cdns)
|
||
* [Pull CDNs](#pull-cdns)
|
||
* [Load balancer](#load-balancer)
|
||
* [Active-passive](#active-passive)
|
||
* [Active-active](#active-active)
|
||
* [Layer 4 load balancing](#layer-4-load-balancing)
|
||
* [Layer 7 load balancing](#layer-7-load-balancing)
|
||
* [Horizontal scaling](#horizontal-scaling)
|
||
* [Reverse proxy (web server)](#reverse-proxy-web-server)
|
||
* [Load balancer vs reverse proxy](#load-balancer-vs-reverse-proxy)
|
||
* [Application layer](#application-layer)
|
||
* [Microservices](#microservices)
|
||
* [Service discovery](#service-discovery)
|
||
* [Database](#database)
|
||
* [SQL](#sql)
|
||
* [Relational database management system (RDBMS)](relational-database-management-system-rdbms)
|
||
* [Scaling SQL](#scaling-sql)
|
||
* [Master-slave replication](#master-slave-replication)
|
||
* [Federation](#federation)
|
||
* [Sharding](#sharding)
|
||
* [Denormalization](#denormalization)
|
||
* [SQL tuning](#sql-tuning)
|
||
* [NoSQL](#nosql)
|
||
* [Key-value store](#key-value-store)
|
||
* [Document store](#document-store)
|
||
* [Wide column store](#wide-column-store)
|
||
* [Graph Database](#graph-database)
|
||
* [SQL or NoSQL](#sql-or-nosql)
|
||
* [Cache](#cache)
|
||
* [Client caching](#client-caching)
|
||
* [CDN caching](#cdn-caching)
|
||
* [Web server caching](#web-server-caching)
|
||
* [Database caching](#database-caching)
|
||
* [Application caching](#application-caching)
|
||
* [Caching at the database query level](#caching-at-the-database-query-level)
|
||
* [Caching at the object level](#caching-at-the-object-level)
|
||
* [When to update the cache](#when-to-update-the-cache)
|
||
* [Cache-aside](#cache-aside)
|
||
* [Write-through](#write-through)
|
||
* [Write-behind (write-back)](#write-behind-write-back)
|
||
* [Refresh-ahead](#refresh-ahead)
|
||
* [Asynchronism](#asynchronism)
|
||
* [Message queues](#message-queues)
|
||
* [Task queues](#task-queues)
|
||
* [Back pressure](#back-pressure)
|
||
* [Communication](#communication)
|
||
* [Transmission control protocol (TCP)](#transmission-control-protocol-tcp)
|
||
* [User datagram protocol (UDP)](#user-datagram-protocol-udp)
|
||
* [Remote procedure call (RPC)](#remote-procedure-call-rpc)
|
||
* [Representational state transfer (REST)](#representational-state-transfer-rest)
|
||
* [Security](#security)
|
||
* [Appendix](#appendix)
|
||
* [Powers of two table](#powers-of-two-table)
|
||
* [Latency numbers every programmer should know](#latency-numbers-every-programmer-should-know)
|
||
* [Under development](#under-development)
|
||
* [Distributed computing](#distributed-computing)
|
||
* [Consistent hashing](#consistent-hashing)
|
||
* [Scatter gather](#scatter-gather)
|
||
* [Contribute](#contributing)
|
||
* [Credits](#credits)
|
||
* [Contact info](#contact-info)
|
||
* [License](#license)
|
||
|
||
## Study guide
|
||
|
||
> Suggested topics to review based on your interview timeline (short, medium, long).
|
||
|
||
![Imgur](http://i.imgur.com/Klsu4cw.png)
|
||
|
||
Start broad and go deeper in a few areas. It helps to know a little about various key system design topics. Adjust the following guide based on your experience, what positions you are interviewing for, and which companies you are interviewing with.
|
||
|
||
* **Short** - Aim for **breadth** with system design topics. Practice by solving **some** interview questions.
|
||
* **Medium** - Aim for **breadth** and **some depth** with system design topics. Practice by solving a **many** interview questions.
|
||
* **Long** - Aim for **breadth** and **more depth** with system design topics. Practice by solving a **most** interview questions.
|
||
|
||
| | Short | Medium | Long |
|
||
|---|---|---|---|
|
||
| Read through the [System design topics](#index-of-system-design-topics) to get a broad understanding of how systems work | :+1: | :+1: | :+1: |
|
||
| Read through a few articles in the [Company engineering blogs](#company-engineering-blogs) for the companies you are interviewing with | :+1: | :+1: | :+1: |
|
||
| Read through a few [Real world architectures](#real-world-architectures) | :+1: | :+1: | :+1: |
|
||
| Review [How to approach a system design interview question](#how-to-approach-a-system-design-interview-question) | :+1: | :+1: | :+1: |
|
||
| Work through [System design interview questions with solutions](#system-design-interview-questions-with-solutions) | Some | Many | Most |
|
||
| Work through [Object-oriented design interview questions with solutions](#object-oriented-design-interview-questions-with-solutions) | Some | Many | Most |
|
||
| Review [Additional system design interview questions](#additional-system-design-interview-questions) | Some | Many | Most |
|
||
|
||
## How to approach a system design interview question
|
||
|
||
> How to tackle a system design interview question.
|
||
|
||
The system design interview is an **open-ended conversation**. You are expected to lead it.
|
||
|
||
You can use the following steps to guide the discussion. To help solidify this process, work through the [System design interview questions with solutions](#system-design-interview-questions-with-solutions) section using the following steps.
|
||
|
||
### Step 1: Outline use cases, constraints, and assumptions
|
||
|
||
Gather requirements and scope the problem. Ask questions to clarify use cases and constraints. Discuss assumptions.
|
||
|
||
* Who is going to use it?
|
||
* How are they going to use it?
|
||
* How many users are there?
|
||
* What does the system do?
|
||
* What are the inputs and outputs of the system?
|
||
* How much data do we expect to handle?
|
||
* How many requests per second do we expect?
|
||
* What is the expected read to write ratio?
|
||
|
||
### Step 2: Create a high level design
|
||
|
||
Outline a high level design with all important components.
|
||
|
||
* Sketch the main components and connections
|
||
* Justify your ideas
|
||
|
||
### Step 3: Design core components
|
||
|
||
Dive into details for each core component. For example, if you were asked to [design a url shortening service](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/pastebin/README.md), discuss:
|
||
|
||
* Generating and storing a hash of the full url
|
||
* [MD5](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/pastebin/README.md) and [Base62](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/pastebin/README.md)
|
||
* Hash collisions
|
||
* SQL or NoSQL
|
||
* Database schema
|
||
* Translating a hashed url to the full url
|
||
* Database lookup
|
||
* API and object-oriented design
|
||
|
||
### Step 4: Scale the design
|
||
|
||
Identify and address bottlenecks, given the constraints. For example, do you need the following to address scalability issues?
|
||
|
||
* Load balancer
|
||
* Horizontal scaling
|
||
* Caching
|
||
* Database sharding
|
||
|
||
Discuss potential solutions and trade-offs. Everything is a trade-off. Address bottlenecks using [principles of scalable system design](#index-of-system-design-topics).
|
||
|
||
### Back-of-the-envelope calculations
|
||
|
||
You might be asked to do some estimates by hand. Refer to the [Appendix](#appendix) for the following resources:
|
||
|
||
* [Use back of the envelope calculations](http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html)
|
||
* [Powers of two table](#powers-of-two-table)
|
||
* [Latency numbers every programmer should know](#latency-numbers-every-programmer-should-know)
|
||
|
||
### Source(s) and further reading
|
||
|
||
Check out the following links to get a better idea of what to expect:
|
||
|
||
* [How to ace a systems design interview](https://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/)
|
||
* [The system design interview](http://www.hiredintech.com/system-design)
|
||
* [Intro to Architecture and Systems Design Interviews](https://www.youtube.com/watch?v=ZgdS0EUmn70)
|
||
|
||
## System design interview questions with solutions
|
||
|
||
> Common system design interview questions with sample discussions, code, and diagrams.
|
||
>
|
||
> Solutions linked to content in the `solutions/` folder.
|
||
|
||
| Question | |
|
||
|---|---|
|
||
| Design Pastebin.com (or Bit.ly) | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/pastebin/README.md) |
|
||
| Design the Twitter timeline (or Facebook feed)<br/>Design Twitter search (or Facebook search) | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/twitter/README.md) |
|
||
| Design a web crawler | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/web_crawler/README.md) |
|
||
| Design Mint.com | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/mint/README.md) |
|
||
| Design the data structures for a social network | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/social_graph/README.md) |
|
||
| Design a key-value store for a search engine | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/query_cache/README.md) |
|
||
| Design Amazon's sales ranking by category feature | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/sales_rank/README.md) |
|
||
| Design a system that scales to millions of users on AWS | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/scaling_aws/README.md) |
|
||
| Add a system design question | [Contribute](#contributing) |
|
||
|
||
### Design Pastebin.com (or Bit.ly)
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/pastebin/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/4edXG0T.png)
|
||
|
||
### Design the Twitter timeline and search (or Facebook feed and search)
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/twitter/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/jrUBAF7.png)
|
||
|
||
### Design a web crawler
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/web_crawler/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/bWxPtQA.png)
|
||
|
||
### Design Mint.com
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/mint/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/V5q57vU.png)
|
||
|
||
### Design the data structures for a social network
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/social_graph/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/cdCv5g7.png)
|
||
|
||
### Design a key-value store for a search engine
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/query_cache/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/4j99mhe.png)
|
||
|
||
### Design Amazon's sales ranking by category feature
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/sales_rank/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/MzExP06.png)
|
||
|
||
### Design a system that scales to millions of users on AWS
|
||
|
||
[View exercise and solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/scaling_aws/README.md)
|
||
|
||
![Imgur](http://i.imgur.com/jj3A5N8.png)
|
||
|
||
## Object-oriented design interview questions with solutions
|
||
|
||
> Common object-oriented design interview questions with sample discussions, code, and diagrams.
|
||
>
|
||
> Solutions linked to content in the `solutions/` folder.
|
||
|
||
>**Note: This section is under development**
|
||
|
||
| Question | |
|
||
|---|---|
|
||
| Design a deck of cards to be used for blackjack | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/object_oriented_design/deck_of_cards/deck_of_cards.ipynb) |
|
||
| Design a call center | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/object_oriented_design/call_center/call_center.ipynb) |
|
||
| Design a hash map | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/object_oriented_design/hash_table/hash_map.ipynb) |
|
||
| Design a least recently used cache | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/object_oriented_design/lru_cache/lru_cache.ipynb) |
|
||
| Design a parking lot | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/object_oriented_design/parking_lot/parking_lot.ipynb) |
|
||
| Design a chat server | [Solution](https://github.com/donnemartin/system-design-primer/blob/master/solutions/object_oriented_design/chat_server/chat_server.ipynb) |
|
||
| Design a circular array | [Contribute](#contributing) |
|
||
| Add an object-oriented design question | [Contribute](#contributing) |
|
||
|
||
## Additional system design interview questions
|
||
|
||
> Common system design interview questions, with links to resources on how to solve each.
|
||
|
||
| Question | Reference(s) |
|
||
|---|---|
|
||
| Design a file sync service like Dropbox | [youtube.com](https://www.youtube.com/watch?v=PE4gwstWhmc) |
|
||
| Design a search engine like Google | [queue.acm.org](http://queue.acm.org/detail.cfm?id=988407)<br/>[stackexchange.com](http://programmers.stackexchange.com/questions/38324/interview-question-how-would-you-implement-google-search)<br/>[ardendertat.com](http://www.ardendertat.com/2012/01/11/implementing-search-engines/)<br>[stanford.edu](http://infolab.stanford.edu/~backrub/google.html) |
|
||
| Design a scalable web crawler like Google | [quora.com](https://www.quora.com/How-can-I-build-a-web-crawler-from-scratch) |
|
||
| Design Google docs | [code.google.com](https://code.google.com/p/google-mobwrite/)<br/>[neil.fraser.name](https://neil.fraser.name/writing/sync/) |
|
||
| Design a key-value store like Redis | [slideshare.net](http://www.slideshare.net/dvirsky/introduction-to-redis) |
|
||
| Design a cache system like Memcached | [slideshare.net](http://www.slideshare.net/oemebamo/introduction-to-memcached) |
|
||
| Design a recommendation system like Amazon's | [hulu.com](http://tech.hulu.com/blog/2011/09/19/recommendation-system.html)<br/>[ijcai13.org](http://ijcai13.org/files/tutorial_slides/td3.pdf) |
|
||
| Design a tinyurl system like Bitly | [n00tc0d3r.blogspot.com](http://n00tc0d3r.blogspot.com/) |
|
||
| Design a chat app like WhatsApp | [highscalability.com](http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html)
|
||
| Design a picture sharing system like Instagram | [highscalability.com](http://highscalability.com/flickr-architecture)<br/>[highscalability.com](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html) |
|
||
| Design the Facebook news feed function | [quora.com](http://www.quora.com/What-are-best-practices-for-building-something-like-a-News-Feed)<br/>[quora.com](http://www.quora.com/Activity-Streams/What-are-the-scaling-issues-to-keep-in-mind-while-developing-a-social-network-feed)<br/>[slideshare.net](http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture) |
|
||
| Design the Facebook timeline function | [facebook.com](https://www.facebook.com/note.php?note_id=10150468255628920)<br/>[highscalability.com](http://highscalability.com/blog/2012/1/23/facebook-timeline-brought-to-you-by-the-power-of-denormaliza.html) |
|
||
| Design the Facebook chat function | [erlang-factory.com](http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf)<br/>[facebook.com](https://www.facebook.com/note.php?note_id=14218138919&id=9445547199&index=0) |
|
||
| Design a graph search function like Facebook's | [facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-building-out-the-infrastructure-for-graph-search/10151347573598920)<br/>[facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-indexing-and-ranking-in-graph-search/10151361720763920)<br/>[facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-the-natural-language-interface-of-graph-search/10151432733048920) |
|
||
| Design a content delivery network like CloudFlare | [cmu.edu](http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci) |
|
||
| Design a trending topic system like Twitter's | [michael-noll.com](http://www.michael-noll.com/blog/2013/01/18/implementing-real-time-trending-topics-in-storm/)<br/>[snikolov .wordpress.com](http://snikolov.wordpress.com/2012/11/14/early-detection-of-twitter-trends/) |
|
||
| Design a random ID generation system | [blog.twitter.com](https://blog.twitter.com/2010/announcing-snowflake)<br/>[github.com](https://github.com/twitter/snowflake/) |
|
||
| Return the top k requests during a time interval | [ucsb.edu](https://icmi.cs.ucsb.edu/research/tech_reports/reports/2005-23.pdf)<br/>[wpi.edu](http://davis.wpi.edu/xmdv/docs/EDBT11-diyang.pdf) |
|
||
| Design a system that serves data from multiple data centers | [highscalability.com](http://highscalability.com/blog/2009/8/24/how-google-serves-data-from-multiple-datacenters.html) |
|
||
| Design an online multiplayer card game | [indieflashblog.com](http://www.indieflashblog.com/how-to-create-an-asynchronous-multiplayer-game.html)<br/>[buildnewgames.com](http://buildnewgames.com/real-time-multiplayer/) |
|
||
| Design a garbage collection system | [stuffwithstuff.com](http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/)<br/>[washington.edu](http://courses.cs.washington.edu/courses/csep521/07wi/prj/rick.pdf) |
|
||
| Add a system design question | [Contribute](#contributing) |
|
||
|
||
## Real world architectures
|
||
|
||
> Articles on how real world systems are designed.
|
||
|
||
<p align="center">
|
||
<img src="http://i.imgur.com/TcUo2fw.png">
|
||
<br/>
|
||
<i><a href=https://www.infoq.com/presentations/Twitter-Timeline-Scalability>Source: Twitter timelines at scale</a></i>
|
||
</p>
|
||
|
||
**Don't focus on nitty gritty details for the following articles, instead:**
|
||
|
||
* Identify shared principles, common technologies, and patterns within these articles
|
||
* Study what problems are solved by each component, where it works, where it doesn't
|
||
* Review the lessons learned
|
||
|
||
|Type | System | Reference(s) |
|
||
|---|---|---|
|
||
| Data processing | **MapReduce** - Distributed data processing from Google | [research.google.com](http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/mapreduce-osdi04.pdf) |
|
||
| Data processing | **Spark** - Distributed data processing from Databricks | [slideshare.net](http://www.slideshare.net/AGrishchenko/apache-spark-architecture) |
|
||
| Data processing | **Storm** - Distributed data processing from Twitter | [slideshare.net](http://www.slideshare.net/previa/storm-16094009) |
|
||
| | | |
|
||
| Data store | **Bigtable** - Distributed column-oriented database from Google | [harvard.edu](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf) |
|
||
| Data store | **HBase** - Open source implementation of Bigtable | [slideshare.net](http://www.slideshare.net/alexbaranau/intro-to-hbase) |
|
||
| Data store | **Cassandra** - Distributed column-oriented database from Facebook | [slideshare.net](http://www.slideshare.net/planetcassandra/cassandra-introduction-features-30103666)
|
||
| Data store | **DynamoDB** - Document-oriented database from Amazon | [harvard.edu](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf) |
|
||
| Data store | **MongoDB** - Document-oriented database | [slideshare.net](http://www.slideshare.net/mdirolf/introduction-to-mongodb) |
|
||
| Data store | **Spanner** - Globally-distributed database from Google | [research.google.com](http://research.google.com/archive/spanner-osdi2012.pdf) |
|
||
| Data store | **Memcached** - Distributed memory caching system | [slideshare.net](http://www.slideshare.net/oemebamo/introduction-to-memcached) |
|
||
| Data store | **Redis** - Distributed memory caching system with persistence and value types | [slideshare.net](http://www.slideshare.net/dvirsky/introduction-to-redis) |
|
||
| | | |
|
||
| File system | **Google File System (GFS)** - Distributed file system | [research.google.com](http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/gfs-sosp2003.pdf) |
|
||
| File system | **Hadoop File System (HDFS)** - Open source implementation of GFS | [apache.org](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html) |
|
||
| | | |
|
||
| Misc | **Chubby** - Lock service for loosely-coupled distributed systems from Google | [research.google.com](http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/archive/chubby-osdi06.pdf) |
|
||
| Misc | **Dapper** - Distributed systems tracing infrastructure | [research.google.com](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/36356.pdf)
|
||
| Misc | **Kafka** - Pub/sub message queue from LinkedIn | [slideshare.net](http://www.slideshare.net/mumrah/kafka-talk-tri-hug) |
|
||
| Misc | **Zookeeper** - Centralized infrastructure and services enabling synchronization | [slideshare.net](http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) |
|
||
| | Add an architecture | [Contribute](#contributing) |
|
||
|
||
### Company architectures
|
||
|
||
| Company | Reference(s) |
|
||
|---|---|
|
||
| Amazon | [Amazon architecture](http://highscalability.com/amazon-architecture) |
|
||
| Cinchcast | [Producing 1,500 hours of audio every day](http://highscalability.com/blog/2012/7/16/cinchcast-architecture-producing-1500-hours-of-audio-every-d.html) |
|
||
| DataSift | [Realtime datamining At 120,000 tweets per second](http://highscalability.com/blog/2011/11/29/datasift-architecture-realtime-datamining-at-120000-tweets-p.html) |
|
||
| DropBox | [How we've scaled Dropbox](https://www.youtube.com/watch?v=PE4gwstWhmc) |
|
||
| ESPN | [Operating At 100,000 duh nuh nuhs per second](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html) |
|
||
| Google | [Google architecture](http://highscalability.com/google-architecture) |
|
||
| Instagram | [14 million users, terabytes of photos](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html)<br/>[What powers Instagram](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances) |
|
||
| Justin.tv | [Justin.Tv's live video broadcasting architecture](http://highscalability.com/blog/2010/3/16/justintvs-live-video-broadcasting-architecture.html) |
|
||
| Facebook | [Scaling memcached at Facebook](https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/key-value/fb-memcached-nsdi-2013.pdf)<br/>[TAO: Facebook’s distributed data store for the social graph](https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/data-store/tao-facebook-distributed-datastore-atc-2013.pdf)<br/>[Facebook’s photo storage](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf) |
|
||
| Flickr | [Flickr architecture](http://highscalability.com/flickr-architecture) |
|
||
| Mailbox | [From 0 to one million users in 6 weeks](http://highscalability.com/blog/2013/6/18/scaling-mailbox-from-0-to-one-million-users-in-6-weeks-and-1.html) |
|
||
| Pinterest | [From 0 To 10s of billions of page views a month](http://highscalability.com/blog/2013/4/15/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a.html)<br/>[18 million visitors, 10x growth, 12 employees](http://highscalability.com/blog/2012/5/21/pinterest-architecture-update-18-million-visitors-10x-growth.html) |
|
||
| Playfish | [50 million monthly users and growing](http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html) |
|
||
| PlentyOfFish | [PlentyOfFish architecture](http://highscalability.com/plentyoffish-architecture) |
|
||
| Salesforce | [How they handle 1.3 billion transactions a day](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html) |
|
||
| Stack Overflow | [Stack Overflow architecture](http://highscalability.com/blog/2009/8/5/stack-overflow-architecture.html) |
|
||
| TripAdvisor | [40M visitors, 200M dynamic page views, 30TB data](http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view.html) |
|
||
| Tumblr | [15 billion page views a month](http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html) |
|
||
| Twitter | [Making Twitter 10000 percent faster](http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster)<br/>[Storing 250 million tweets a day using MySQL](http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html)<br/>[150M active users, 300K QPS, a 22 MB/S firehose](http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html)<br/>[Timelines at scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)<br/>[Big and small data at Twitter](https://www.youtube.com/watch?v=5cKTP36HVgI)<br/>[Operations at Twitter: scaling beyond 100 million users](https://www.youtube.com/watch?v=z8LU0Cj6BOU) |
|
||
| Uber | [How Uber scales their real-time market platform](http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html) |
|
||
| WhatsApp | [The WhatsApp architecture Facebook bought for $19 billion](http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html) |
|
||
| YouTube | [YouTube scalability](https://www.youtube.com/watch?v=w5WVu624fY8)<br/>[YouTube architecture](http://highscalability.com/youtube-architecture) |
|
||
|
||
## Company engineering blogs
|
||
|
||
> Architectures for companies you are interviewing with.
|
||
>
|
||
> Questions you encounter might be from the same domain.
|
||
|
||
* [Airbnb Engineering](http://nerds.airbnb.com/)
|
||
* [Atlassian Developers](https://developer.atlassian.com/blog/)
|
||
* [Autodesk Engineering](http://cloudengineering.autodesk.com/blog/)
|
||
* [AWS Blog](https://aws.amazon.com/blogs/aws/)
|
||
* [Bitly Engineering Blog](http://word.bitly.com/)
|
||
* [Box Blogs](https://www.box.com/blog/engineering/)
|
||
* [Cloudera Developer Blog](http://blog.cloudera.com/blog/)
|
||
* [Dropbox Tech Blog](https://tech.dropbox.com/)
|
||
* [Engineering at Quora](http://engineering.quora.com/)
|
||
* [Ebay Tech Blog](http://www.ebaytechblog.com/)
|
||
* [Evernote Tech Blog](https://blog.evernote.com/tech/)
|
||
* [Etsy Code as Craft](http://codeascraft.com/)
|
||
* [Facebook Engineering](https://www.facebook.com/Engineering)
|
||
* [Flickr Code](http://code.flickr.net/)
|
||
* [Foursquare Engineering Blog](http://engineering.foursquare.com/)
|
||
* [GitHub Engineering Blog](http://githubengineering.com/)
|
||
* [Google Research Blog](http://googleresearch.blogspot.com/)
|
||
* [Groupon Engineering Blog](https://engineering.groupon.com/)
|
||
* [Heroku Engineering Blog](https://engineering.heroku.com/)
|
||
* [Hubspot Engineering Blog](http://product.hubspot.com/blog/topic/engineering)
|
||
* [High Scalability](http://highscalability.com/)
|
||
* [Instagram Engineering](http://instagram-engineering.tumblr.com/)
|
||
* [Intel Software Blog](https://software.intel.com/en-us/blogs/)
|
||
* [Jane Street Tech Blog](https://blogs.janestreet.com/category/ocaml/)
|
||
* [LinkedIn Engineering](http://engineering.linkedin.com/blog)
|
||
* [Microsoft Engineering](https://engineering.microsoft.com/)
|
||
* [Microsoft Python Engineering](https://blogs.msdn.microsoft.com/pythonengineering/)
|
||
* [Netflix Tech Blog](http://techblog.netflix.com/)
|
||
* [Paypal Developer Blog](https://devblog.paypal.com/category/engineering/)
|
||
* [Pinterest Engineering Blog](http://engineering.pinterest.com/)
|
||
* [Quora Engineering](https://engineering.quora.com/)
|
||
* [Reddit Blog](http://www.redditblog.com/)
|
||
* [Salesforce Engineering Blog](https://developer.salesforce.com/blogs/engineering/)
|
||
* [Slack Engineering Blog](https://slack.engineering/)
|
||
* [Spotify Labs](https://labs.spotify.com/)
|
||
* [Twilio Engineering Blog](http://www.twilio.com/engineering)
|
||
* [Twitter Engineering](https://engineering.twitter.com/)
|
||
* [Uber Engineering Blog](http://eng.uber.com/)
|
||
* [Yahoo Engineering Blog](http://yahooeng.tumblr.com/)
|
||
* [Yelp Engineering Blog](http://engineeringblog.yelp.com/)
|
||
* [Zynga Engineering Blog](https://www.zynga.com/blogs/engineering)
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [kilimchoi/engineering-blogs](https://github.com/kilimchoi/engineering-blogs)
|
||
|
||
## System design topics: start here
|
||
|
||
New to system design?
|
||
|
||
First, you'll need a basic understanding of common principles, learning about what they are, how they are used, and their pros and cons.
|
||
|
||
### Step 1: Review the scalability video lecture
|
||
|
||
[Scalability Lecture at Harvard](https://www.youtube.com/watch?v=-W9F__D3oY4)
|
||
|
||
* Topics covered:
|
||
* Vertical scaling
|
||
* Horizontal scaling
|
||
* Caching
|
||
* Load balancing
|
||
* Database replication
|
||
* Database partitioning
|
||
|
||
### Step 2: Review the scalability article
|
||
|
||
[Scalability](http://www.lecloud.net/tagged/scalability)
|
||
|
||
* Topics covered:
|
||
* [Clones](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones)
|
||
* [Databases](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database)
|
||
* [Caches](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache)
|
||
* [Asynchronism](http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism)
|
||
|
||
### Next steps
|
||
|
||
Next, we'll look at high-level trade-offs:
|
||
|
||
* **Performance** vs **scalability**
|
||
* **Latency** vs **throughput**
|
||
* **Availability** vs **consistency**
|
||
|
||
Keep in mind that **everything is a trade-off**.
|
||
|
||
Then we'll dive into more specific topics such as DNS, CDNs, and load balancers.
|
||
|
||
## Performance vs scalability
|
||
|
||
A service is **scalable** if it results in increased **performance** in a manner proportional to resources added. Generally, increasing performance means serving more units of work, but it can also be to handle larger units of work, such as when datasets grow.<sup><a href=http://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html>1</a></sup>
|
||
|
||
Another way to look at performance vs scalability:
|
||
|
||
* If you have a **performance** problem, your system is slow for a single user.
|
||
* If you have a **scalability** problem, your system is fast for a single user but slow under heavy load.
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [A word on scalability](http://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html)
|
||
* [Scalability, availability, stability, patterns](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/)
|
||
|
||
## Latency vs throughput
|
||
|
||
**Latency** is the time to perform some action or to produce some result.
|
||
|
||
**Throughput** is the number of such actions or results per unit of time.
|
||
|
||
Generally, you should aim for **maximal throughput** with **acceptable latency**.
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [Understanding latency vs throughput](https://community.cadence.com/cadence_blogs_8/b/sd/archive/2010/09/13/understanding-latency-vs-throughput)
|
||
|
||
## Availability vs consistency
|
||
|
||
### CAP theorem
|
||
|
||
<p align="center">
|
||
<img src="http://i.imgur.com/bgLMI2u.png">
|
||
<br/>
|
||
<i><a href=http://robertgreiner.com/2014/08/cap-theorem-revisited>Source: CAP theorem revisited</a></i>
|
||
</p>
|
||
|
||
In a distributed computer system, you can only support two of the following guarantees:
|
||
|
||
* **Consistency** - Every read receives the most recent write or an error
|
||
* **Availability** - Every request receives a response, without guarantee that it contains the most recent version of the information
|
||
* **Partition Tolerance** - The system continues to operate despite arbitrary partitioning due to network failures
|
||
|
||
*Networks aren't reliable, so you'll need to support partition tolerance. You'll need to make a software tradeoff between consistency and availability.*
|
||
|
||
#### CP - consistency and partition tolerance
|
||
|
||
Waiting for a response from the partitioned node might result in a timeout error. CP is a good choice if your business needs require atomic reads and writes.
|
||
|
||
#### AP - availability and partition tolerance
|
||
|
||
Responses return the most recent version of the data, which might not be the latest. Writes might take some time to propagate when the partition is resolved.
|
||
|
||
AP is a good choice if the business needs allow for [eventual consistency](#eventual-consistency) or when the system needs to continue working despite external errors.
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [CAP theorem revisited](http://robertgreiner.com/2014/08/cap-theorem-revisited/)
|
||
* [A plain english introduction to CAP theorem](http://ksat.me/a-plain-english-introduction-to-cap-theorem/)
|
||
* [CAP FAQ](https://github.com/henryr/cap-faq)
|
||
|
||
## Consistency patterns
|
||
|
||
With multiple copies of the same data, we are faced with options on how to synchronize them so clients have a consistent view of the data. Recall the definition of consistency from the [CAP theorem](#cap-theorem) - Every read receives the most recent write or an error.
|
||
|
||
### Weak consistency
|
||
|
||
After a write, reads may or may not see it. A best effort approach is taken.
|
||
|
||
This approach is seen in systems such as memcached. Weak consistency works well in real time use cases such as VoIP, video chat, and realtime multiplayer games. For example, if you are on a phone call and lose reception for a few seconds, when you regain connection you do not hear what was spoken during connection loss.
|
||
|
||
### Eventual consistency
|
||
|
||
After a write, reads will eventually see it (typically within milliseconds). Data is replicated asynchronously.
|
||
|
||
This approach is seen in systems such as DNS and email. Eventual consistency works well in highly available systems.
|
||
|
||
### Strong consistency
|
||
|
||
After a write, reads will see it. Data is replicated synchronously.
|
||
|
||
This approach is seen in file systems and RDBMSes. Strong consistency works well in systems that need transactions.
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [Transactions across data centers](http://snarfed.org/transactions_across_datacenters_io.html)
|
||
|
||
## Availability patterns
|
||
|
||
There are two main patterns to support high availability: **fail-over** and **replication**.
|
||
|
||
### Fail-over
|
||
|
||
#### Active-passive
|
||
|
||
With active-passive fail-over, heartbeats are sent between the active and the passive server on standby. If the heartbeat is interrupted, the passive server takes over the active's IP address and resumes service.
|
||
|
||
The length of downtime is determined by whether the passive server is already running in 'hot' standy or whether it needs to start up from 'cold' standby. Only the active server handles traffic.
|
||
|
||
Active-passive failover can also be referred to as master-slave failover.
|
||
|
||
#### Active-active
|
||
|
||
In active-active, both servers are managing traffic, spreading the load between them.
|
||
|
||
If the servers are public-facing, the DNS would need to know about the public IPs of both servers. If the servers are internal-facing, application logic would need to know about both servers.
|
||
|
||
Active-active failover can also be referred to as master-master failover.
|
||
|
||
### Disadvantage(s): failover
|
||
|
||
* Fail-over adds more hardware and additional complexity.
|
||
* There is a potential for loss of data if the active system fails before any newly written data can be replicated to the passive.
|
||
|
||
### Replication
|
||
|
||
#### Master-slave and master-master
|
||
|
||
This topic is further discussed in the [Database](#database) section:
|
||
|
||
* [Master-slave replication](#master-slave-replication)
|
||
* [Master-master replication](#master-master-replication)
|
||
|
||
## Domain name system
|
||
|
||
<p align="center">
|
||
<img src="http://i.imgur.com/IOyLj4i.jpg">
|
||
<br/>
|
||
<i><a href=http://www.slideshare.net/srikrupa5/dns-security-presentation-issa>Source: DNS security presentation</a></i>
|
||
</p>
|
||
|
||
A Domain Name System (DNS) translates a domain name such as www.example.com to an IP address.
|
||
|
||
DNS is hierarchical, with a few authoritative servers at the top level. Your router or ISP provides information about which DNS server(s) to contact when doing a lookup. Lower level DNS servers cache mappings, which could become stale due to DNS propagation delays. DNS results can also be cached by your browser or OS for a certain period of time, determined by the [time to live (TTL)](https://en.wikipedia.org/wiki/Time_to_live).
|
||
|
||
* **NS record (name server)** - Specifies the DNS servers for your domain/subdomain.
|
||
* **MX record (mail exchange)** - Specifies the mail servers for accepting messages.
|
||
* **A record (address)** - Points a name to an IP address.
|
||
* **CNAME (canonical)** - Points a name to another name or `CNAME` (example.com to www.example.com) or to an `A` record.
|
||
|
||
Services such as [CloudFlare](https://www.cloudflare.com/dns/) and [Route 53](https://aws.amazon.com/route53/) provide managed DNS services. Some DNS services can route traffic through various methods:
|
||
|
||
* [Weighted round robin](http://g33kinfo.com/info/archives/2657)
|
||
* Prevent traffic from going to servers under maintenance
|
||
* Balance between varying cluster sizes
|
||
* A/B testing
|
||
* Latency-based
|
||
* Geolocation-based
|
||
|
||
### Disadvantage(s): DNS
|
||
|
||
* Accessing a DNS server introduces a slight delay, although mitigated by caching described above.
|
||
* DNS server management could be complex, although they are generally managed by [governments, ISPs, and large companies](http://superuser.com/questions/472695/who-controls-the-dns-servers/472729).
|
||
* DNS services have recently come under DDoS attack, preventing users from accessing websites such as Twitter without knowing Twitter's IP address(es).
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [DNS architecture](https://technet.microsoft.com/en-us/library/dd197427(v=ws.10).aspx)
|
||
* [Wikipedia](https://en.wikipedia.org/wiki/Domain_Name_System)
|
||
* [DNS articles](https://support.dnsimple.com/categories/dns/)
|
||
|
||
## Content delivery network
|
||
|
||
<p align="center">
|
||
<img src="http://i.imgur.com/h9TAuGI.jpg">
|
||
<br/>
|
||
<i><a href=https://www.creative-artworks.eu/why-use-a-content-delivery-network-cdn/>Source: Why use a CDN</a></i>
|
||
</p>
|
||
|
||
A content delivery network (CDN) is a globally distributed network of proxy servers, serving content from locations closer to the user. Generally, static files such as HTML/CSS/JSS, photos, and videos are served from CDN, although some CDNs such as Amazon's CloudFront support dynamic content. The site's DNS resolution will tell clients which server to contact.
|
||
|
||
Serving content from CDNs can significantly improve performance in two ways:
|
||
|
||
* Users receive content at data centers close to them
|
||
* Your servers do not have to serve requests that the CDN fulfills
|
||
|
||
### Push CDNs
|
||
|
||
Push CDNs receive new content whenever changes occur on your server. You take full responsibility for providing content, uploading directly to the CDN and rewriting URLs to point to the CDN. You can configure when content expires and when it is updated. Content is uploaded only when it is new or changed, minimizing traffic, but maximizing storage.
|
||
|
||
Sites with a small amount of traffic or sites with content that isn't often updated work well with push CDNs. Content is placed on the CDNs once, instead of being re-pulled at regular intervals.
|
||
|
||
### Pull CDNs
|
||
|
||
Pull CDNs grab new content from your server when the first user requests the content. You leave the content on your server and rewrite URLs to point to the CDN. This results in a slower request until the content is cached on the server.
|
||
|
||
A [time-to-live (TTL)](https://en.wikipedia.org/wiki/Time_to_live) determines how long content is cached. Pull CDNs minimize storage space on the CDN, but can create redundant traffic if files expire and are pulled before they have actually changed.
|
||
|
||
Sites with heavy traffic work well with pull CDNs, as traffic is spread out more evenly with only recently-requested content remaining on the CDN.
|
||
|
||
### Disadvantage(s): CDN
|
||
|
||
* CDN costs could be significant depending on traffic, although this should be weighed with additional costs you would incur not using a CDN.
|
||
* Content might be stale if it is updated before the TTL expires it.
|
||
* CDNs require changing URLs for static content to point to the CDN.
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [Globally distributed content delivery](http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci)
|
||
* [The differences between push and pull CDNs](http://www.travelblogadvice.com/technical/the-differences-between-push-and-pull-cdns/)
|
||
* [Wikipedia](https://en.wikipedia.org/wiki/Content_delivery_network)
|
||
|
||
## Load balancer
|
||
|
||
<p align="center">
|
||
<img src="http://i.imgur.com/h81n9iK.png">
|
||
<br/>
|
||
<i><a href=http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html>Source: Scalable system design patterns</a></i>
|
||
</p>
|
||
|
||
Load balancers distribute incoming client requests to computing resources such as application servers and databases. In each case, the load balancer returns the response from the computing resource to the appropriate client. Load balancers are effective at:
|
||
|
||
* Preventing requests from going to unhealthy servers
|
||
* Preventing overloading resources
|
||
* Helping eliminate single points of failure
|
||
|
||
Load balancers can be implemented with hardware (expensive) or with software such as HAProxy.
|
||
|
||
Additional benefits include:
|
||
|
||
* **SSL termination** - Decrypt incoming requests and encrypt server responses so backend servers do not have to perform these potentially expensive operations
|
||
* Removes the need to install [X.509 certificates](https://en.wikipedia.org/wiki/X.509) on each server
|
||
* **Session persistence** - Issue cookies and route a specific client's requests to same instance if the web apps do not keep track of sessions
|
||
|
||
To protect against failures, it's common to set up multiple load balancers, either in [active-passive](#active-passive) or [active-active](#active-active) mode.
|
||
|
||
Load balancers can route traffic based on various metrics, including:
|
||
|
||
* Random
|
||
* Least loaded
|
||
* Seesion/cookies
|
||
* [Round robin or weighted round robin](http://g33kinfo.com/info/archives/2657)
|
||
* [Layer 4](#layer-4-load-balancing)
|
||
* [Layer 7](#layer-7-load-balancing)
|
||
|
||
### Layer 4 load balancing
|
||
|
||
Layer 4 load balancers look at info at the [transport layer](#communication) to decide how to distribute requests. Generally, this involves the source, destination IP addresses, and ports in the header, but not the contents of the packet. Layer 4 load balancers forward network packets to and from the upstream server, performing [Network Address Translation (NAT)](https://www.nginx.com/resources/glossary/layer-4-load-balancing/).
|
||
|
||
### layer 7 load balancing
|
||
|
||
Layer 7 load balancers look at the [application layer](#communication) to decide how to distribute requests. This can involve contents of the header, message, and cookies. Layer 7 load balancers terminates network traffic, reads the message, makes a load-balancing decision, then opens a connection to the selected server. For example, a layer 7 load balancer can direct video traffic to servers that host videos while directing more sensitive user billing traffic to security-hardened servers.
|
||
|
||
At the cost of flexibility, layer 4 load balancing requires less time and computing resources than Layer 7, although the performance impact can be minimal on modern commodity hardware.
|
||
|
||
### Horizontal scaling
|
||
|
||
Load balancers can also help with horizontal scaling, improving performance and availability. Scaling out using commodity machines is more cost efficient and results in higher availability than scaling up a single server on more expensive hardware, called **Vertical Scaling**. It is also easier to hire for talent working on commodity hardware than it is for specialized enterprise systems.
|
||
|
||
#### Disadvantage(s): horizontal scaling
|
||
|
||
* Scaling horizontally introduces complexity and involves cloning servers
|
||
* Servers should be stateless: they should not contain any user-related data like sessions or profile pictures
|
||
* Sessions can be stored in a centralized data store such as a [database](#database) (SQL, NoSQL) or a persistent [cache](#cache) (Redis, Memcached)
|
||
* Downstream servers such as caches and databases need to handle more simultaneous connections as upstream servers scale out
|
||
|
||
### Disadvantage(s): load balancer
|
||
|
||
* The load balancer can become a performance bottleneck if it does not have enough resources or if it is not configured properly.
|
||
* Introducing a load balancer to help eliminate single points of failure results in increased complexity.
|
||
* A single load balancer is a single point of failure, configuring multiple load balancers further increases complexity.
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [NGINX architecture](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)
|
||
* [HAProxy architecture guide](http://www.haproxy.org/download/1.2/doc/architecture.txt)
|
||
* [Scalability](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones)
|
||
* [Wikipedia](https://en.wikipedia.org/wiki/Load_balancing_(computing))
|
||
* [Layer 4 load balancing](https://www.nginx.com/resources/glossary/layer-4-load-balancing/)
|
||
* [Layer 7 load balancing](https://www.nginx.com/resources/glossary/layer-7-load-balancing/)
|
||
* [ELB listener config](http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-listener-config.html)
|
||
|
||
## Reverse proxy (web server)
|
||
|
||
<p align="center">
|
||
<img src="http://i.imgur.com/p7xHS4Z.png">
|
||
<br/>
|
||
<i><a href=https://commons.wikimedia.org/wiki/File:Proxy_concept_en.svg>Source: Wikipedia</a></i>
|
||
<br/>
|
||
</p>
|
||
|
||
A reverse proxy is a web server that centralizes internal services and provides unified interfaces to the public. Requests from clients are forwarded to a server that can fulfill it before the reverse proxy returns the server's response to the client.
|
||
|
||
Additional benefits include:
|
||
|
||
* **Increased security** - Hide information about backend servers, blacklist IPs, limit number of connections per client
|
||
* **Increased scalability and flexibility** - Clients only see the reverse proxy's IP, allowing you to scale servers or change their configuration
|
||
* **SSL termination** - Decrypt incoming requests and encrypt server responses so backend servers do not have to perform these potentially expensive operations
|
||
* Removes the need to install [X.509 certificates](https://en.wikipedia.org/wiki/X.509) on each server
|
||
* **Compression** - Compress server responses
|
||
* **Caching** - Return the response for cached requests
|
||
* **Static content** - Serve static content directly
|
||
* HTML/CSS/JS
|
||
* Photos
|
||
* Videos
|
||
* Etc
|
||
|
||
### Load balancer vs reverse proxy
|
||
|
||
* Deploying a load balancer is useful when you have multiple servers. Often, load balancers route traffic to a set of servers serving the same function.
|
||
* Reverse proxies can be useful even with just one web server or application server, opening up the benefits described in the previous section.
|
||
* Solutions such as NGINX and HAProxy can support both layer 7 reverse proxying and load balancing.
|
||
|
||
### Disadvantage(s): reverse proxy
|
||
|
||
* Introducing a reverse proxy results in increased complexity.
|
||
* A single reverse proxy is a single point of failure, configuring multiple reverse proxies (ie a [failover](https://en.wikipedia.org/wiki/Failover)) further increases complexity.
|
||
|
||
### Source(s) and further reading
|
||
|
||
* [Reverse proxy vs load balancer](https://www.nginx.com/resources/glossary/reverse-proxy-vs-load-balancer/)
|
||
* [NGINX architecture](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)
|
||
* [HAProxy architecture guide](http://www.haproxy.org/download/1.2/doc/architecture.txt)
|
||
* [Wikipedia](https://en.wikipedia.org/wiki/Reverse_proxy)
|