From 502c5f3659c4422c42590fdf489b5e751842ada5 Mon Sep 17 00:00:00 2001 From: Shafaq Arshad Date: Sun, 14 Jul 2024 17:00:03 +0100 Subject: [PATCH] Add Consistent Hashing Session --- README.md | 19 +++++++++++++++++++ images/jsjss.png | Bin 0 -> 35981 bytes 2 files changed, 19 insertions(+) create mode 100644 images/jsjss.png diff --git a/README.md b/README.md index f2285f36..29cc8880 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ Review the [Contributing Guidelines](CONTRIBUTING.md). * [Active-active](#active-active) * [Layer 4 load balancing](#layer-4-load-balancing) * [Layer 7 load balancing](#layer-7-load-balancing) + * [Consistent Hashing](#consistent-hashing) * [Horizontal scaling](#horizontal-scaling) * [Reverse proxy (web server)](#reverse-proxy-web-server) * [Load balancer vs reverse proxy](#load-balancer-vs-reverse-proxy) @@ -689,6 +690,7 @@ Load balancers can route traffic based on various metrics, including: * [Round robin or weighted round robin](https://www.g33kinfo.com/info/round-robin-vs-weighted-round-robin-lb) * [Layer 4](#layer-4-load-balancing) * [Layer 7](#layer-7-load-balancing) +* Consistent Hashing ### Layer 4 load balancing @@ -700,6 +702,23 @@ Layer 7 load balancers look at the [application layer](#communication) to decide 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. +### Consistent Hashing + +Consistent hashing is a technique used in load balancing to distribute requests evenly across multiple servers in a distributed system. + +Here's how it works: + +* Hash Ring: Imagine a virtual circle, called a hash ring. Each server and each incoming request is assigned a position on this circle based on a hash function. The hash function ensures that the same input (server ID or request data) always gets mapped to the same position on the ring. + +* Request Distribution: When a request arrives, its data (often a unique identifier) is hashed to determine its position on the hash ring. The server responsible for handling the request is the one whose position on the ring comes after the hashed request data, continuing clockwise around the circle. + +* Scalability and Consistency: The key benefit of consistent hashing is its scalability. If a server is added or removed, only requests that map to the immediate vicinity of the affected server will be re-routed. Most requests will continue to be directed to the same servers as before. This minimizes data re-caching and avoids creating hotspots where certain servers become overloaded + +

+ +
+

+ ### 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. diff --git a/images/jsjss.png b/images/jsjss.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b82534ce534702e34cb66b1d97ae1419ddba44 GIT binary patch literal 35981 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 R@yOTJRkV}~&tJLwe*iozG+_V$ literal 0 HcmV?d00001