UPDATE : Thanks for the great response on this article. This article is selected as leetcode's pick. Thanks a lot for the support and Thank you @LeetCode for providing this opportunity.
Note: The proxy being referred to in this article is actually a "reverse proxy" . Thanks to @madno for clearing this out
Hello Leetcoders!
Many companies like media[dot]net, Goldman Sachs, BookMyShow ask questions related to system design. Most questions revolve around designing a highly available system which can process multiple client requests at the same time and has minimal response time.
In this post, I will walk you through the process of arriving to a solution when asked of such a problem. There is no one go to solution for SD problems, you have to communicate with your interviewer to know the requirements.
What are Distributed systems ?
The CAP Theorm
Highly available System Design with example
I won't be discussing a specific problem statement as I want that this article should help you develop the thinking process behind arriving to a solution. This will be a very high level design involving no code at all. This is just to get you started with SD.
Suppose you are in an interview and the interviewer asks you to design a highly available system which has multiple concurrent read and write requests.
The first thing you should do is to clarify the functionalities required when asked a specific question. For example, if you are asked to design youtube , ask the interviewer what all exactly he/she wants to be implemented and then you design from there.
Lets start with the thought process you would go through:

There are many problems in this design as you might've guessed.
It is a monolithic architecture which can handle less load and has a single point of failure. The DB or server goes down? your app is down.
Solutions ?
This would look something like this:

Here, DB replica refers to a copy of the original database. This replica can be used if the main db goes down.
Probelms :
To achieve the above mentioned architecture, we need to introduce a load balancer for DBs also as the requests need to be distributed between the DBs.

Now your interviewer is happy with your design. But they question you that what if the proxy itself goes down? After all it is also a software or a hardware proxy depending on what you have implemented , and can fail anyday.
What trick can you think of from the above designs that help us solve the problem of SPOF (single point of failure) ?. If you guessed that we should add more instances of the same proxy then I guess this article is helping you.
The improved design would look like this:

Now, the interviewer is satisfied that your system doesn't atleast have a single point of failure and can work as a highly available system.
But, as the requests increase, even 2 database servers can't handle the load. What would you do now? Add more replicas? but that still doesn't solve your problem in the long term.
Make use of microservices architecture

So, is this is finally a good design? NOO!!
Improvements ?
Summary
We went from a monolithic design to a microservice architecture.
I hope the steps and method I followed helped you in understanding how can you tackle a System design problem.
System design is a very broad topic and one post alone can't help you crack all kinds of problem statements. I recommend the following posts for different kinds of problems:
If you are placed and waiting for your job to start , do read up on this article.
https://leetcode.com/discuss/general-discussion/1122551/What-after-placement-placed-life-set-SDE-9-to-5-Is-DSA-used-in-day-to-day-life
P.S. This was my first article on leetcode. Any and all feedback is appreciated . Thanks!