What is CAP theorem?
CAP(Consistency-Availability-Partition Tolerance)
theorem says that a distributed system cannot guarantee C, A and P
simultaneously. It can at max provide any 2 of the 3 guarantees. Let us
understand this with the help of a distributed database system.
- Consistency: This states that the
data has to remain consistent after the execution of an operation in the
database. For example, post database updation, all queries should retrieve
the same result.
- Availability: The databases cannot
have downtime and should be available and responsive always.
- Partition Tolerance: The database system
should be functioning despite the communication becoming unstable.
How is Horizontal scaling different from Vertical
scaling?
- Horizontal
scaling refers to the addition of more
computing machines to the network that shares the processing and memory
workload across a distributed network of devices. In simple words, more
instances of servers are added to the existing pool and the traffic load is
distributed across these devices in an efficient manner.
- Vertical
scaling refers to the concept of upgrading
the resource capacity such as increasing RAM, adding efficient processors
etc of a single machine or switching to a new machine with more capacity.
The capability of the server can be enhanced without the need for code
manipulation.
What do you understand by load balancing?
When a server goes down, the
load balancer redirects traffic to the remaining available servers. When a new
server gets added to the configuration, the requests are automatically
redirected to it. Following are the benefits of load balancers:
·
They
help to prevent requests from going to unhealthy or unavailable servers.
·
Helps
to prevent resources overloading.
·
Helps
to eliminate a single point of failure since the requests are routed to
available servers whenever a server goes down.
·
Requests
sent to the servers are encrypted and the responses are decrypted. It aids in
SSL termination and removes the need to install X.509 certificates on every
server.
·
Load
balancing impacts system security and allows continuous software updates for accommodating changes in the system.
What do you understand by
Latency, throughput, and availability of a system?
Performance is an important
factor in system design as it helps in making our services fast and reliable.
Following are the three key metrics for measuring the performance:
·
Latency: This
is the time taken in milliseconds for delivering a single message.
·
Throughput:
This is the amount of data successfully transmitted through a system in a given
amount of time. It is measured in bits per second.
·
Availability:
This determines the amount of time a system is available to respond to
requests. It is calculated: System Uptime / (System Uptime+Downtime).
5. What is Sharding?
Sharding is a process of
splitting the large logical dataset into multiple databases. It also refers to
horizontal partitioning of data as it will be stored on multiple machines. By
doing so, a sharded database becomes capable of handling more requests than a
single large machine. Consider an example - in the following image, assume that
we have around 1TB of data present in the database, when we perform sharding,
we divide the large 1TB data into smaller chunks of 256GB into partitions
called shards.
Sharding helps to scale
databases by helping to handle the increased load by providing increased
throughput, storage capacity and ensuring high availability.
How is NoSQL database
different from SQL databases?
Category |
SQL |
NoSQL |
Model |
Follows relational
model. |
Follows the non-relational
model. |
Data |
Deals with structured
data. |
Deals with semi-structured
data. |
Flexibility |
SQL follows a strict
schema. |
NoSQL deals with dynamic
schema and is very flexible. |
Transactions |
Follows ACID (Atomicity,
Consistency, Isolation, Durability) properties. |
Follows BASE (Basic
Availability, Soft-state, Eventual consistency) properties. |
How is sharding different from partitioning?
·
Database Sharding - Sharding is a technique for dividing a single dataset among many
databases, allowing it to be stored across multiple workstations. Larger
datasets can be divided into smaller parts and stored in numerous data nodes,
boosting the system’s total storage capacity. A sharded database, similarly,
can accommodate more requests than a single system by dividing the data over
numerous machines. Sharding, also known as horizontal scaling or scale-out, is
a type of scaling in which more nodes are added to distribute the load.
Horizontal scaling provides near-limitless scalability for handling large
amounts of data and high-volume tasks.
·
Database Partitioning - Partitioning is the process of separating stored
database objects (tables, indexes, and views) into distinct portions. Large
database items are partitioned to improve controllability, performance, and
availability. Partitioning can enhance performance when accessing partitioned
tables in specific instances. Partitioning can act as a leading column in
indexes, reducing index size and increasing the likelihood of finding the most
desired indexes in memory. When a large portion of one area is used in the resultset,
scanning that region is much faster than accessing data scattered throughout
the entire table by index. Adding and deleting sections allows for large-scale
data uploading and deletion, which improves performance. Data that are rarely
used can be uploaded to more affordable data storage devices.
How is performance and scalability related to each other?
A system is
said to be scalable if there is increased performance is proportional to the
resources added. Generally, performance increase in terms of scalability refers
to serving more work units. But this can also mean being able to handle larger
work units when datasets grow. If there is a performance problem in the
application, then the system will be slow only for a single user. But if there
is a scalability problem, then the system may be fast for a single user but it
can get slow under heavy user load on the application.
What is Caching? What are
the various cache update strategies available in caching?
Caching refers to the
process of storing file copies in a temporary storage location called cache
which helps in accessing data more quickly thereby reducing site latency. The
cache can only store a limited amount of data. Due to this, it is important to
determine cache update strategies that are best suited for the business
requirements. Following are the various caching strategies available:
·
Cache-aside:
In this strategy, our application is responsible to write and read data from
the storage. Cache interaction with the storage is not direct. Here, the
application looks for an entry in the cache, if the result is not found, then
the entry is fetched from the database and is added to the cache for further
use. Memcached is an example of using this update strategy.
Cache-aside strategy is also known as lazy loading because only the requested entry will be cached thereby avoiding unnecessary caching of the data. Some of the disadvantages of this strategy are:
·
In
cases of a cache miss, there would be a noticeable delay as it results in
fetching data from the database and then caching it.
·
The
chances of data being stale are more if it is updated in the database. This can
be reduced by defining the time-to-live parameter which forces an update of the
cache entry.
·
When
a cache node fails, it will be replaced by a new, empty node which results in
increased latency.
Write-through: In this strategy, the cache will be considered as the main data store by the system and the system reads and writes data into it. The cache then updates the database accordingly as shown in the database.
·
The
system adds or updates the entry in the cache.
· The cache synchronously writes entries to the database. This strategy is overall a slow operation because of the synchronous write operation. However, the subsequent reads of the recently written data will be very fast. This strategy also ensures that the cache is not stale. But, there are chances that the data written in the cache might never be read. This issue can be reduced by providing appropriate TTL.
Write-behind (write-back): In this strategy, the application does the following steps:
o Add or update an entry in the cache
o Write the entry into the data store
asynchronously for improving the write performance. This is demonstrated in the
image below:
The main disadvantage of
this method is that there are chances of data loss if the cache goes down
before the contents of the cache are written into the database.
·
Refresh-ahead:
Using this strategy, we can configure the cache to refresh the cache entry
automatically before its expiration.
This cache strategy results
in reduced latency if it can predict accurately what items are needed in
future.
What are the various
Consistency patterns available in system design?
Consistency from the CAP
theorem states that every read request should get the most recently written
data. When there are multiple data copies available, there arises a problem of
synchronizing them so that the clients get fresh data consistently. Following
are the consistency patterns available:
·
Weak consistency: After a data write, the read request may or may not be able to get the
new data. This type of consistency works well in real-time use cases like VoIP,
video chat, real-time multiplayer games etc. For example, when we are on a
phone call, if we lose network for a few seconds, then we lose information
about what was spoken during that time.
·
Eventual consistency: Post data write, the reads will eventually see the latest data within
milliseconds. Here, the data is replicated asynchronously. These are seen in
DNS and email systems. This works well in highly available systems.
·
Strong consistency: After a data write, the subsequent reads will see the latest data.
Here, the data is replicated synchronously. This is seen in RDBMS and file
systems and are suitable in systems requiring transactions of data.
What do
you understand by Content delivery network?
Content
delivery network or in short CDN is a globally distributed proxy server network
that serves content from locations close by to the end-users. Usually, in
websites, static files like HTML, CSS, JS files, images and videos are served
from CDN.
Using CDN
in delivering content helps to improve performance:
· Since
users receive data from center's close to them as shown in the image
below, they don't have to wait for long.
· Load
on the servers is reduced significantly as some of the responsibility is shared
by CDNs.
There are two types of CDNs, they are:
· Push
CDNs: Here, the content is received by the CDNs whenever changes occur on
the server. The responsibility lies in us for uploading the content to CDNs.
Content gets updated to the CDN only when it is modified or added which in turn
maximises storage by minimising the traffic. Generally, sites with lesser
traffic or content work well using push CDNs.
· Pull
CDNs: Here new content is grabbed from the server when the first user
requests the content from the site. This leads to slower requests for the first
time till the content gets stored/cached on the CDN. These CDNs minimizes space
utilized on CDN but can lead to redundant traffic when expired files are pulled
before they are changed. Websites having heavy traffic work well when used with
pull CDNs.
What are
some of the design issues in distributed systems?
Following
are some of the issues found in distributed systems:
·
Heterogeneity: The Internet allows applications to run
over a heterogeneous collection of computers and networks. There would be
different types of networks and the differences are masked by the usage of
standard Internet protocols for communicating with each other. This becomes an
issue while designing distributed applications
·
Openness: Openness represents the measure by which a
system can be extended and re-implemented in different ways. In distributed
systems, it specifies the degree to which new sharing services can be added and
made available for client usage.
·
Security: The information maintained in distributed
systems need to be secure as they are valuable to the users. The
confidentiality, availability and integrity of the distributed systems have to
be maintained and this sometimes becomes a challenge.
·
Scalability: A system is scalable if it remains
effective when there is a significant increase in the request traffic and
resources. Designing a distributed system involves planning well in advance how
well the system can be made scalable under varying user loads.
·
Failure Handling: In a distributed environment, the failures
are partial, meaning if some components fail, others would still function. It
becomes challenging to handle these failures as it involves identifying right
components where the failures occur.
No comments:
Post a Comment