From 0c9b0c79d74676839b6ac2f5e02af0ced3b08978 Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Thu, 25 Apr 2024 16:22:43 +0300 Subject: [PATCH 01/10] Task One - Port 6000 completion of task one via port 6000 --- Dockerfile | 37 ++++++++++++++++++++----------------- server.py | 38 ++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/Dockerfile b/Dockerfile index a566312..3674c60 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,20 @@ -# Use official Python runtime as a parent image -FROM python:3.9 - -#Set the working directory in the container -WORKDIR /app - -#Copy the current directory contenst into container at /app -COPY server.py /app - -#Install Flask -RUN pip install Flask - -#Set SERVER_ID env variable -ENV SERVER_ID "1" - -#Run app.py when container launches -CMD ["python", "server.py"] +# Use official Python runtime as a parent image +FROM python:3.9 + +# Set the working directory in the container +WORKDIR /app + +# Copy the current directory contents into the container at /app +COPY server.py /app + +# Install Flask +RUN pip install Flask + +# Set SERVER_ID environment variable +ENV SERVER_ID="1" + +# Expose port 6000 +EXPOSE 6000 + +# Run server.py when the container launches +CMD ["python", "server.py"] diff --git a/server.py b/server.py index 4af4135..2e4c377 100644 --- a/server.py +++ b/server.py @@ -1,20 +1,18 @@ -#!usr/bin/env python - -from flask import Flask, jsonify - -app = Flask(__name__) - -#Server ID passed as environment variable -import os -SERVER_ID = os.getenv("SERVER_ID", "Unknown") - -@app.route("/home", methods = ["GET"]) -def home(): - return jsonify({"message": f"Hello from Server: {SERVER_ID}", "status": "successful"}), 200 - -@app.route("/heartbeat", methods = ["GET"]) -def heartbeat(): - return "", 200 - -if __name__ == "__main__": - app.run(debug = True, host = "0.0.0.0", port = 5000) +from flask import Flask, jsonify +import os + +app = Flask(__name__) + +# Server ID passed as environment variable +SERVER_ID = os.getenv("SERVER_ID", "Unknown") + +@app.route("/home", methods=["GET"]) +def home(): + return jsonify({"message": f"Hello from Server: {SERVER_ID}", "status": "successful"}), 200 + +@app.route("/heartbeat", methods=["GET"]) +def heartbeat(): + return "", 200 + +if __name__ == "__main__": + app.run(debug=True, host='0.0.0.0', port=6000) From beb02e4ca503921073d0ac454df8d8eb00c2bc4d Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Thu, 25 Apr 2024 20:29:12 +0300 Subject: [PATCH 02/10] Task 2 1. /add_server -> route to add servers 2. /remove_server -> route to remove servers 3. /get_all_servers -> route to view servers added/removed 4. /home -> view all of servers and their requests note: server is running on port 6000 //note: code is compiled at port 6000 --- Dockerfile | 11 +++----- server.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 77 insertions(+), 16 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3674c60..0fcfae0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -# Use official Python runtime as a parent image -FROM python:3.9 +# Use the official Python image +FROM python:3.9-slim # Set the working directory in the container WORKDIR /app @@ -8,12 +8,9 @@ WORKDIR /app COPY server.py /app # Install Flask -RUN pip install Flask +RUN pip install --no-cache-dir Flask -# Set SERVER_ID environment variable -ENV SERVER_ID="1" - -# Expose port 6000 +# Expose port 6000 to the outside world EXPOSE 6000 # Run server.py when the container launches diff --git a/server.py b/server.py index 2e4c377..7622085 100644 --- a/server.py +++ b/server.py @@ -1,18 +1,82 @@ -from flask import Flask, jsonify +from flask import Flask, jsonify, request import os app = Flask(__name__) -# Server ID passed as environment variable -SERVER_ID = os.getenv("SERVER_ID", "Unknown") +class ConsistentHashMap: + def __init__(self, M): + self.M = M # Total number of slots in the consistent hash map + self.hash_map = [[] for _ in range(M)] # Initialize hash map with empty lists + self.added_servers = [] # List to track added servers + self.removed_servers = [] # List to track removed servers -@app.route("/home", methods=["GET"]) + def hash_function(self, Rid): + return Rid % self.M + + def server_hash_function(self, Sid): + return Sid % self.M + + def add_server(self, Sid): + hash_value = self.server_hash_function(Sid) + self.hash_map[hash_value].append({"server_id": Sid, "requests": 0}) # Initialize requests to 0 + self.added_servers.append(Sid) + + def remove_server(self, Sid): + hash_value = self.server_hash_function(Sid) + if Sid in [server['server_id'] for server in self.hash_map[hash_value]]: + self.hash_map[hash_value] = [server for server in self.hash_map[hash_value] if server['server_id'] != Sid] + self.removed_servers.append(Sid) + + def get_server(self, Rid): + hash_value = self.hash_function(Rid) + slots = len(self.hash_map) + for i in range(slots): + slot_index = (hash_value + i) % slots + if self.hash_map[slot_index]: + return self.hash_map[slot_index][0]['server_id'] # Return the server ID + return None + + def update_requests(self, server_id): + for slot in self.hash_map: + for server in slot: + if server['server_id'] == server_id: + server['requests'] += 1 + return + +# Initialize Consistent Hash Map +consistent_hash_map = ConsistentHashMap(512) + +@app.route('/home') def home(): - return jsonify({"message": f"Hello from Server: {SERVER_ID}", "status": "successful"}), 200 + request_id = int(os.environ.get('REQUEST_ID', '0')) # Get request ID from environment variable + server_assigned = consistent_hash_map.get_server(request_id) + if server_assigned is not None: + consistent_hash_map.update_requests(server_assigned) + return jsonify({"message": f"Hello from Server: {server_assigned}", "status": "successful", "servers": consistent_hash_map.hash_map}), 200 + else: + return jsonify({"message": "No servers available", "status": "failed"}), 500 -@app.route("/heartbeat", methods=["GET"]) +@app.route('/heartbeat') def heartbeat(): - return "", 200 + return '', 200 + +@app.route('/add_server', methods=['POST']) +def add_server(): + data = request.json + server_id = data.get('server_id') + consistent_hash_map.add_server(server_id) + return jsonify({"message": f"Server {server_id} added successfully", "status": "successful"}), 200 + +@app.route('/remove_server', methods=['POST']) +def remove_server(): + data = request.json + server_id = data.get('server_id') + consistent_hash_map.remove_server(server_id) + return jsonify({"message": f"Server {server_id} removed successfully", "status": "successful"}), 200 + +@app.route('/view_changes') +def view_changes(): + return jsonify({"added_servers": consistent_hash_map.added_servers, "removed_servers": consistent_hash_map.removed_servers}), 200 -if __name__ == "__main__": - app.run(debug=True, host='0.0.0.0', port=6000) +if __name__ == '__main__': + app.run(host='0.0.0.0', port=6000) From 49a895eb063593d07e5a4ae38dd7b23b93f56d8d Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Fri, 26 Apr 2024 14:18:35 +0300 Subject: [PATCH 03/10] Task 2 Final 1. /add_server -> route to add servers 2. /remove_server -> route to remove servers 3. /view_changes -> route to view servers added/removed 4. /server_stats -> view all of servers and their requests 5. to simulate a request load: a. add requests: @FOR /L %i IN (21,1,30) DO @curl http://localhost:6000/home?REQUEST_ID=%i b. view requests on the servers: curl http://localhost:6000/server_stats note: server is running on port 6000 --- server.py | 86 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/server.py b/server.py index 7622085..43638ca 100644 --- a/server.py +++ b/server.py @@ -3,11 +3,22 @@ app = Flask(__name__) +class Server: + def __init__(self, server_id): + self.id = server_id + self.request_count = 0 + + def increment_request_count(self): + self.request_count += 1 + class ConsistentHashMap: - def __init__(self, M): - self.M = M # Total number of slots in the consistent hash map - self.hash_map = [[] for _ in range(M)] # Initialize hash map with empty lists - self.added_servers = [] # List to track added servers + def __init__(self, N, K): + self.N = N # Total number of server containers + self.K = K # Number of times each server is replicated + self.M = N * K # Total number of slots in the consistent hash map + self.hash_map = [[] for _ in range(self.M)] # Initialize hash map with empty lists + self.server_map = {} # Dictionary to map server IDs to slots + self.added_servers = {} # Dictionary to track added servers self.removed_servers = [] # List to track removed servers def hash_function(self, Rid): @@ -17,15 +28,27 @@ def server_hash_function(self, Sid): return Sid % self.M def add_server(self, Sid): - hash_value = self.server_hash_function(Sid) - self.hash_map[hash_value].append({"server_id": Sid, "requests": 0}) # Initialize requests to 0 - self.added_servers.append(Sid) + if Sid in self.server_map: + return False # Server already exists + for _ in range(self.K): + hash_value = self.server_hash_function(Sid) + while hash_value in self.server_map.values(): # Conflict resolution + Sid += 1 + hash_value = self.server_hash_function(Sid) + self.hash_map[hash_value].append(Sid) + server = Server(Sid) + self.server_map[Sid] = server + self.added_servers[Sid] = server + return True def remove_server(self, Sid): - hash_value = self.server_hash_function(Sid) - if Sid in [server['server_id'] for server in self.hash_map[hash_value]]: - self.hash_map[hash_value] = [server for server in self.hash_map[hash_value] if server['server_id'] != Sid] + if Sid not in self.server_map: + return False # Server not found + for _ in range(self.K): + hash_value = self.server_map.pop(Sid).id + self.hash_map[hash_value].remove(Sid) self.removed_servers.append(Sid) + return True def get_server(self, Rid): hash_value = self.hash_function(Rid) @@ -33,28 +56,20 @@ def get_server(self, Rid): for i in range(slots): slot_index = (hash_value + i) % slots if self.hash_map[slot_index]: - return self.hash_map[slot_index][0]['server_id'] # Return the server ID + server_id = self.hash_map[slot_index][0] + server = self.server_map[server_id] + server.increment_request_count() # Increment request count for the selected server + return server_id # Return the server ID return None - def update_requests(self, server_id): - for slot in self.hash_map: - for server in slot: - if server['server_id'] == server_id: - server['requests'] += 1 - return - -# Initialize Consistent Hash Map -consistent_hash_map = ConsistentHashMap(512) +# Initialize Consistent Hash Map with N=5 server containers and K=20 replicas per server +consistent_hash_map = ConsistentHashMap(N=5, K=20) @app.route('/home') def home(): request_id = int(os.environ.get('REQUEST_ID', '0')) # Get request ID from environment variable server_assigned = consistent_hash_map.get_server(request_id) - if server_assigned is not None: - consistent_hash_map.update_requests(server_assigned) - return jsonify({"message": f"Hello from Server: {server_assigned}", "status": "successful", "servers": consistent_hash_map.hash_map}), 200 - else: - return jsonify({"message": "No servers available", "status": "failed"}), 500 + return jsonify({"message": f"Hello from Server: {server_assigned}", "status": "successful"}), 200 @app.route('/heartbeat') def heartbeat(): @@ -64,19 +79,30 @@ def heartbeat(): def add_server(): data = request.json server_id = data.get('server_id') - consistent_hash_map.add_server(server_id) - return jsonify({"message": f"Server {server_id} added successfully", "status": "successful"}), 200 + success = consistent_hash_map.add_server(server_id) + if success: + return jsonify({"message": f"Server {server_id} added successfully", "status": "successful"}), 200 + else: + return jsonify({"message": f"Server {server_id} already exists", "status": "failed"}), 400 @app.route('/remove_server', methods=['POST']) def remove_server(): data = request.json server_id = data.get('server_id') - consistent_hash_map.remove_server(server_id) - return jsonify({"message": f"Server {server_id} removed successfully", "status": "successful"}), 200 + success = consistent_hash_map.remove_server(server_id) + if success: + return jsonify({"message": f"Server {server_id} removed successfully", "status": "successful"}), 200 + else: + return jsonify({"message": f"Server {server_id} not found", "status": "failed"}), 400 @app.route('/view_changes') def view_changes(): - return jsonify({"added_servers": consistent_hash_map.added_servers, "removed_servers": consistent_hash_map.removed_servers}), 200 + return jsonify({"added_servers": consistent_hash_map.added_servers.keys(), "removed_servers": consistent_hash_map.removed_servers}), 200 + +@app.route('/server_stats') +def server_stats(): + stats = {server_id: server.request_count for server_id, server in consistent_hash_map.added_servers.items()} + return jsonify(stats), 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=6000) From 72e309cf4a9b568de12d5e3dc19f430e50eae107 Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:17:21 +0300 Subject: [PATCH 04/10] Graphs Graphs for Analysis --- images/first/2 servers.png | Bin 0 -> 22231 bytes images/first/3 servers.png | Bin 0 -> 22469 bytes images/first/4 servers.png | Bin 0 -> 22799 bytes images/first/5 servers.png | Bin 0 -> 22875 bytes images/first/6 servers.png | Bin 0 -> 23291 bytes images/first/average.png | Bin 0 -> 37130 bytes images/second/2 servers.png | Bin 0 -> 22207 bytes images/second/3 servers.png | Bin 0 -> 25708 bytes images/second/4 servers.png | Bin 0 -> 22831 bytes images/second/5 servers.png | Bin 0 -> 23330 bytes images/second/6 servers.png | Bin 0 -> 23987 bytes images/second/average.png | Bin 0 -> 43822 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/first/2 servers.png create mode 100644 images/first/3 servers.png create mode 100644 images/first/4 servers.png create mode 100644 images/first/5 servers.png create mode 100644 images/first/6 servers.png create mode 100644 images/first/average.png create mode 100644 images/second/2 servers.png create mode 100644 images/second/3 servers.png create mode 100644 images/second/4 servers.png create mode 100644 images/second/5 servers.png create mode 100644 images/second/6 servers.png create mode 100644 images/second/average.png diff --git a/images/first/2 servers.png b/images/first/2 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d63870a984ec141d751bf5ebdb8857fdc182ce GIT binary patch literal 22231 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 D)AfN; literal 0 HcmV?d00001 diff --git a/images/first/3 servers.png b/images/first/3 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f19f857a67809dab870ecbacdd923ab497f197 GIT binary patch literal 22469 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 literal 0 HcmV?d00001 diff --git a/images/first/4 servers.png b/images/first/4 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0ef01065e0fdfff654019269953ea8f5c348a8 GIT binary patch literal 22799 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 literal 0 HcmV?d00001 diff --git a/images/first/6 servers.png b/images/first/6 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..5658f2bfacfb7a6d248400181ffff4e9e5540fb1 GIT binary patch literal 23291 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�Pns; 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 X_x`cyO4Um8B{Ij(98Era{>uLc>su+& literal 0 HcmV?d00001 diff --git a/images/first/average.png b/images/first/average.png new file mode 100644 index 0000000000000000000000000000000000000000..91b625e02b56e608779d928da64a8b133821328c GIT binary patch literal 37130 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℘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 literal 0 HcmV?d00001 diff --git a/images/second/2 servers.png b/images/second/2 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..91630d11ecf6b8cd268bdb94bf6409100b06bfb9 GIT binary patch literal 22207 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 literal 0 HcmV?d00001 diff --git a/images/second/3 servers.png b/images/second/3 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..ebecc48362214c975deba9d71d99f4d4b0e212e0 GIT binary patch literal 25708 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
Y)bE02`&ZfG$ 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 A!vFvP literal 0 HcmV?d00001 diff --git a/images/second/5 servers.png b/images/second/5 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..91907534bc7196f0752e8421856edf11034600a8 GIT binary patch literal 23330 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 literal 0 HcmV?d00001 diff --git a/images/second/6 servers.png b/images/second/6 servers.png new file mode 100644 index 0000000000000000000000000000000000000000..db88a1b8d385d12dfafe0e73c9b65fcc1f42f437 GIT binary patch literal 23987 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 R5BW0Lq+k08j2s|s>z2!d&X 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 b-xroN$`#!5FCWjM;Bn;O358b&&b$0S0&D_p literal 0 HcmV?d00001 From 198794703049b6ae58f2422efa614d8d7e2cbd83 Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:41:35 +0300 Subject: [PATCH 05/10] Final README.md --- README.md | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 142 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index fb8796b..3853765 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,148 @@ ### This repository contains the implementation of a load balancer using Docker, aimed at efficiently distributing requests among several servers. The load balancer routes requests from multiple clients asynchronously to ensure nearly even distribution of the load across the server replicas. ## Task Description -### Task One -1. Implement a load balancer that routes requests among several servers asynchronously. -2. Use Docker to manage the deployment of the load balancer and servers within a Docker network. -3. Implement a simple web server in Python to handle HTTP requests on specified endpoints (/home and /heartbeat). -4. Use consistent hashing data structure for efficient request distribution. -5. Ensure fault tolerance by spawning new replicas of servers in case of failures. -6. Write clean and well-documented code, along with a README file detailing design choices, assumptions, testing, and performance analysis. -7. Provide a Makefile for deploying and running the code, and version control the project using Git. +### TASK ONE: SERVER +* **Endpoint (/home, method=GET)**: This endpoint returns a string with a unique identifier to distinguish among the replicated server containers. For instance, if a client requests this endpoint and the load balancer schedules the request to Server: 3, then an example return string would be Hello from Server: +Hint: Server ID can be set as an env variable while running a container instance from the docker image of the server + - Command: ``` curl -X GET http://localhost:6000/home ``` + - Response: ```{"message":"Hello from Server: 10","status":"successful"}``` + +* **Endpoint (/heartbeat, method=GET)**: This endpoint sends heartbeat responses upon request. The load balancer further +uses the heartbeat endpoint to identify failures in the set of containers maintained by it. Therefore, you could send an empty +response with a valid response code. + - Command: ```curl -X GET http://localhost:6000/heartbeat``` + - Response: ```Response [EMPTY] ``` + +### TASK TWO: CONSISTENT HASHING + * In this task, you need to implement a consistent hash map using an array, linked list, or any other data structure. This map data +structure details are given in Appendix A. Use the following parameters and hash functions for your implementation. + - Number of Server Containers managed by the load balancer (N) = 3 + - Total number of slots in the consistent hash map (#slots) = 512 + - Number of virtual servers for each server container (K) = log (512) = 9 2 + - Hash function for request mapping H(i) = i + 2i + 17 2 2 + - Hash function for virtual server mapping Φ(i, j) = i + j + 2j + 25 + +* **Consistant Hashing Algorithm Implementation** + - Implementation Details: + - Uses array-based data structure + - Number of Server Containers (N): 3 + - Total number of slots in the consistent hash map (#slots): 512 + - Number of virtual servers for each server container (K): log(512) = 9 + - Hash functions used: + - Hash function for request mapping H(i): H(i) = i + 2i + 17 + - Hash function for virtual server mapping Φ(i, j): Φ(i, j) = i + j + 2j + 25 + +### TASK THREE: LOAD BALANCER +* **Endpoint (/add, method=POST)**: This endpoint adds new server instances in the load balancer to scale up with increasing client numbers in the system. The endpoint expects a JSON payload that mentions the number of newinstances and their preferred hostnames (same as the container name in docker) in a list. An example request and response is below. + - Command: ``` curl -X POST -H "Content-Type: application/json" --data-binary "{\"n\": 6, \"hostnames\": [1, 2, 3, 4, 5, 6]}" http://localhost:6000/add ``` + - Response: ```{"message":{"N":6,"replicas":[{"cpu_usage":0.0,"id":1,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":2,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":3,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":4,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":5,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":6,"memory_usage":27.6,"request_count":0}]},"status":"successful"}``` + - *use of psutil library to improve the consistent hashing algorithm to load balance more efficiently amongst all the servers* + * Perform simple sanity checks on the request payload and ensure that hostnames mentioned in the Payload are less than or equal to newly added instances. Note that the hostnames are preferably set. One can never set the hostnames. In that case, the hostnames (container names) are set randomly. However, sending a hostname list with greater length than newly added instances will result in an error. + - Command: ``` curl -X POST -H "Content-Type: application/json" --data-binary "{\"n\": 3, \"hostnames\": [1, 2, 3, 4, 5, 6]}" http://localhost:6000/add ``` + - Response: ```{"message":" Length of hostname list is more than newly added instances","status":"failure"}``` + +* **Endpoint (/rep, method=GET)**: This endpoint only returns the status of the replicas managed by the load balancer. The response contains the number of replicas and their hostname in the docker internal network:n1 as mentioned in Fig. 1. An example response is shown below. + - Command: ``` curl http://localhost:6000/rep ``` + - Response: ```{"message":{"N":6,"replicas":[{"id":1,"id":2,"id":3,"id":4,"id":5,"id":6}]},"status":"successful"}``` + +* **Endpoint (/rm, method=DELETE)**: This endpoint removes server instances in the load balancer to scale down with decreasing client or system maintenance. The endpoint expects a JSON payload that mentions the number of instances to be removed and their preferred hostnames (same as container name in docker) in a list. An example request and response is below. + - Command: ``` curl -X DELETE -H "Content-Type: application/json" --data-binary "{\"n\": 1, \"hostnames\": [\"5\"]}" http://localhost:6000/rm ``` + - Response: ```{"message":{"N":5,"replicas":[{"cpu_usage":0.0,"id":2,"memory_usage":27.8,"equest_count":0},{"cpu_usage":0.0,"id":3,"memory_usage":27.8,"request_count":0},{"cpu_usage":0.0,"id":4,"memory_usage":27.8,"request_count":0},{"cpu_usage":0.0,"id":5,"memory_usage":27.8,"request_count":0},{"cpu_usage":0.0,"id":6,"memory_usage":27.8,"request_count":0}]},"status":"successful"}``` + - *shows that the sever with id '1' has been removed successfully* + +* **Endpoint (/server_stats, method=GET)**: This endpoint is used to view all of the servers that are currently being used. Additonally, it provides a list of the amount each server has that aids in visualising the load balanccing. An example request and response is below. + - Command: ``` curl http://localhost:6000/server_stats``` + - Response: ``` {"1":33,"2":69} ``` + - *After adding two servers, 1 and 2, and loading 102 requests routed to ```/home```* + +### TASK FOUR: ANALYSIS +* Launch 10000 async requests on N = 3 server containers and report the request count handled by each server instance in a bar chart. Explain your observations in the graph and your view on the performance. + - After adding three servers ('1', '2', '3'): + - Ran 10,000 requests routed to the ```/home``` and used the endpoint ```/server_stats``` to view the number of requests each server recieved + - Graph: + - + - Observations: + - Servers 1 and 2 bear the majority of the load, with Server 2 consistently handling the highest load followed by Server 1. + - In contrast, Server 3 carries a significantly lighter load compared to the other servers, indicating a potential imbalance in the load distribution strategy. + + +* Next, increment N from 2 to 6 and launch 10000 requests on each such increment. Report the average load of the servers at each run in a line chart. Explain your observations in the graph and your view on the scalability of the load balancer implementation + - When N = 2 + - Graph: + - + - When N = 3 + - Graph: + - + - When N = 4 + - Graph: + - + - When N = 5 + - Graph: + - + - When N = 6 + - Graph: + - + - Average load accross each server with 10,000 requests: + - Graph: + - + - Observation: + - In the case of two servers, both servers handle a relatively similar load, with Server 1 slightly edging out Server 2. + - This suggests a relatively balanced load distribution, although there is still room for improvement to ensure equitable resource utilization across the servers. + +* Test all endpoints of the load balancer and show that in case of server failure, the load balancer spawns a new instance quickly to handle the load. + - By simulating a forced exit of a server and the latency betweeen a new server arriving, this is shown in a graph below where ```N``` represents the amount of servers: + - | Number of Servers | Latency for New Server Spawn | + |-------------------|------------------------------| + | 2 servers | 1.2313279 seconds | + | 3 servers | 0.8681224 seconds | + | 4 servers | 0.2518046 seconds | + | 5 servers | 0.2355351 seconds | + +* Finally, modify the hash functions H(i), Φ(i, j) and report the observations from (A-1) and (A-2). + - To achieve a better distribution, the following changes were made to the consistent hashing function: + - Number of Server Containers managed by the load balancer (N) = 50 + - Total number of slots in the consistent hash map (#slots) = 2500 + - Number of virtual servers for each server container (K) = 50 + - Hash function for request mapping H(i) = Rid % M + - Hash function for virtual server mapping Φ(i, j) = (Sid + i) % M + - Additionally, the hashing is enhanced by distributing the load based on what server has the lowest cpu percentage, thus preventing server overload + + * Launch 10000 async requests on N = 3 server containers and report the request count handled by each server instance in a bar chart. Explain your observations in the graph and your view on the performance. + - After adding three servers ('1', '2', '3'): + - Graph: + - + - Observations: + - Server 1 consistently handles the highest load, followed by Server 2 and then Server 3. Despite minor variations, this trend remains consistent across the different server counts. + - The performance of the load balancer appears effective in distributing the load somewhat evenly across the servers, with Server 1 consistently bearing the highest load + + * Next, increment N from 2 to 6 and launch 10000 requests on each such increment. Report the average load of the servers at each run in a line chart. Explain your observations in the graph and your view on the scalability of the load balancer implementation + - When N = 2 + - Graph: + - + - When N = 3 + - Graph: + - + - When N = 4 + - Graph: + - + - When N = 5 + - Graph: + - + - When N = 6 + - Graph: + - + - Average load accross each server with 10,000 requests: + - Graph: + - + - Observation: + - In the case of two servers, Server 1 consistently handles a higher load compared to Server 2, suggesting an imbalance in the load distribution. + - Despite this, the load balancer demonstrates a basic ability to distribute the load across multiple servers as compared to the first consistant hashing which happened to skew more into the first two servers + + + + + + ## Group Members 1. 137991 - Jesse Kamau From ed2c13f5521bdc61fcb5533a1dce71501d4d9ca2 Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:46:32 +0300 Subject: [PATCH 06/10] Final --- Makefile | 22 ++++++++++++++ analysis.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 18 +++++++++++ 3 files changed, 115 insertions(+) create mode 100644 Makefile create mode 100644 analysis.py create mode 100644 docker-compose.yml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c02a26f --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +# Default target: start the stack +start: + docker-compose up -d + +# Stop the stack +stop: + docker-compose down + +# View logs +logs: + docker-compose logs -f + +# Build the load balancer container +build_lb: + docker-compose build load_balancer + +# Build the server container +build_server: + docker-compose build server_container + +# Rebuild the stack +rebuild: build_lb build_server start diff --git a/analysis.py b/analysis.py new file mode 100644 index 0000000..5859c3f --- /dev/null +++ b/analysis.py @@ -0,0 +1,75 @@ +import requests +import matplotlib.pyplot as plt +import numpy as np + +# Function to launch 10000 async requests on N = 3 server containers +def launch_requests(): + url = 'http://localhost:6000/home' + server_counts = 3 + server_request_counts = [0] * server_counts + + # Launch 10000 async requests + for _ in range(10000): + response = requests.get(url) + server_id = int(response.json()['message'].split()[-1]) - 1 + server_request_counts[server_id] += 1 + + # Plot the request count handled by each server instance in a bar chart + plt.bar(np.arange(server_counts) + 1, server_request_counts) + plt.xlabel('Server Instance') + plt.ylabel('Request Count') + plt.title('Request Count Handled by Each Server Instance') + plt.show() + +# Function to increment N from 2 to 6 and launch 10000 requests on each increment +def test_scalability(): + url = 'http://localhost:6000/add' + server_counts = list(range(2, 7)) + average_loads = [] + + # Increment N from 2 to 6 and launch 10000 requests on each increment + for N in server_counts: + data = {'n': N, 'hostnames': [f'server_{i}' for i in range(1, N + 1)]} + response = requests.post(url, json=data) + + # Launch 10000 requests + server_request_counts = [0] * N + for _ in range(10000): + response = requests.get('http://localhost:6000/home') + server_id = int(response.json()['message'].split()[-1]) - 1 + server_request_counts[server_id] += 1 + + # Calculate the average load of the servers + average_load = sum(server_request_counts) / N + average_loads.append(average_load) + + # Plot the average load of the servers at each run in a line chart + plt.plot(server_counts, average_loads, marker='o') + plt.xlabel('Number of Servers') + plt.ylabel('Average Load') + plt.title('Average Load of Servers for Different Number of Servers') + plt.grid(True) + plt.show() + +# Function to test all endpoints of the load balancer and show that it promptly recovers from server container failure +def test_server_failure_recovery(): + # Send requests to view server stats + response = requests.get('http://localhost:6000/server_stats') + print("Initial Server Stats:", response.json()) + + # Simulate server container failure by removing a server + response = requests.post('http://localhost:6000/remove_server', json={'server_id': 'server_1'}) + print("Server Removal Status:", response.json()) + + # Send requests again to view updated server stats + response = requests.get('http://localhost:6000/server_stats') + print("Updated Server Stats:", response.json()) + +# Task A-1: Launch 10000 async requests on N = 3 server containers and report the request count handled by each server instance in a bar chart +launch_requests() + +# Task A-2: Increment N from 2 to 6 and launch 10000 requests on each increment. Report the average load of the servers at each run in a line chart +test_scalability() + +# Task A-3: Test all endpoints of the load balancer and show that in case of server failure, the load balancer spawns a new instance quickly to handle the load +test_server_failure_recovery() diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..598a1e5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3.8' + +services: + load_balancer: + build: ./load_balancer + ports: + - "6000:6000" + environment: + N: 2 # Default value for the number of server containers + K: 20 # Default value for the number of replicas per server + restart: always + + server_container: + build: ./server + environment: + FLASK_APP: server.py + FLASK_RUN_HOST: 0.0.0.0 + restart: always From 6a8ab6cc68cb0c999654b506b5bbff7af24b10a4 Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:48:47 +0300 Subject: [PATCH 07/10] Final --- server.py | 178 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 163 insertions(+), 15 deletions(-) diff --git a/server.py b/server.py index 43638ca..611e726 100644 --- a/server.py +++ b/server.py @@ -1,5 +1,8 @@ from flask import Flask, jsonify, request import os +import random +import string +import psutil app = Flask(__name__) @@ -20,21 +23,30 @@ def __init__(self, N, K): self.server_map = {} # Dictionary to map server IDs to slots self.added_servers = {} # Dictionary to track added servers self.removed_servers = [] # List to track removed servers + self.total_requests = 0 # Total number of requests handled by the system def hash_function(self, Rid): - return Rid % self.M + # Adjusting the hash function for better load balancing + hash_object = hashlib.sha256(str(Rid).encode()) + hash_hex = hash_object.hexdigest() + hash_value = int(hash_hex, 16) % self.M + return hash_value def server_hash_function(self, Sid): - return Sid % self.M + hash_values = [] + for i in range(self.K): # Generate K virtual nodes for each server + combined_id = str(Sid) + "_" + str(i) # Combine server ID and counter + hash_value = hash(combined_id) % self.M # Hash the combined ID + hash_values.append(hash_value) + return hash_values def add_server(self, Sid): if Sid in self.server_map: return False # Server already exists - for _ in range(self.K): - hash_value = self.server_hash_function(Sid) + for hash_value in self.server_hash_function(Sid): while hash_value in self.server_map.values(): # Conflict resolution Sid += 1 - hash_value = self.server_hash_function(Sid) + hash_values = self.server_hash_function(Sid) # Re-generate hash values self.hash_map[hash_value].append(Sid) server = Server(Sid) self.server_map[Sid] = server @@ -51,26 +63,98 @@ def remove_server(self, Sid): return True def get_server(self, Rid): + self.total_requests += 1 # Increment total requests counter hash_value = self.hash_function(Rid) slots = len(self.hash_map) + selected_server = None + min_requests = float('inf') + + # Iterate through the hash map to find the server with the least requests for i in range(slots): slot_index = (hash_value + i) % slots if self.hash_map[slot_index]: server_id = self.hash_map[slot_index][0] server = self.server_map[server_id] - server.increment_request_count() # Increment request count for the selected server - return server_id # Return the server ID - return None + if server.request_count < min_requests: + min_requests = server.request_count + selected_server = server_id + + # If no server is found (which could happen if the server map is empty), + # return None to handle the situation gracefully + if selected_server is None: + return None + + # Increment request count for the selected server + self.server_map[selected_server].increment_request_count() + return selected_server + + + def get_all_servers(self): + return list(self.server_map.keys()) # Initialize Consistent Hash Map with N=5 server containers and K=20 replicas per server -consistent_hash_map = ConsistentHashMap(N=5, K=20) +consistent_hash_map = ConsistentHashMap(N=50, K=50) + +class LoadBalancer: + def __init__(self): + self.replicas = [] + + # Update add_replica method to include server statistics + def add_replica(self, hostname): + server = Server(hostname) + self.replicas.append(server) + + # Update remove_replica method to handle server removal + def remove_replica(self, hostname): + self.replicas = [replica for replica in self.replicas if replica.id != hostname] + + # Update get_replicas_status method to include server health status + def get_replicas_status(self): + status = [] + for server in self.replicas: + server_status = { + "id": server.id, + "request_count": server.request_count, + "cpu_usage": psutil.cpu_percent(), # Get CPU usage + "memory_usage": psutil.virtual_memory().percent # Get memory usage + } + status.append(server_status) + return status + + # Implement a dynamic load balancing algorithm to select the next server based on load + def get_next_server(self): + # Choose the server with the lowest CPU usage + if len(self.replicas) == 0: + return None + elif len(self.replicas) == 1: + return self.replicas[0].id + else: + min_cpu_server = min(self.replicas, key=lambda x: psutil.cpu_percent()) + return min_cpu_server.id + + +# Initialize Load Balancer +load_balancer = LoadBalancer() + @app.route('/home') def home(): - request_id = int(os.environ.get('REQUEST_ID', '0')) # Get request ID from environment variable - server_assigned = consistent_hash_map.get_server(request_id) + request_id = random.randint(0, 1000) # Generate a random request ID + server_assigned = load_balancer.get_next_server() + server = consistent_hash_map.server_map.get(server_assigned) + if server: + server.increment_request_count() return jsonify({"message": f"Hello from Server: {server_assigned}", "status": "successful"}), 200 + + +# Route to view server stats +@app.route('/server_stats') +def server_stats(): + stats = {server_id: server.request_count for server_id, server in consistent_hash_map.server_map.items()} + return jsonify(stats), 200 + + @app.route('/heartbeat') def heartbeat(): return '', 200 @@ -81,6 +165,7 @@ def add_server(): server_id = data.get('server_id') success = consistent_hash_map.add_server(server_id) if success: + load_balancer.add_replica(server_id) return jsonify({"message": f"Server {server_id} added successfully", "status": "successful"}), 200 else: return jsonify({"message": f"Server {server_id} already exists", "status": "failed"}), 400 @@ -91,6 +176,7 @@ def remove_server(): server_id = data.get('server_id') success = consistent_hash_map.remove_server(server_id) if success: + load_balancer.remove_replica(server_id) return jsonify({"message": f"Server {server_id} removed successfully", "status": "successful"}), 200 else: return jsonify({"message": f"Server {server_id} not found", "status": "failed"}), 400 @@ -99,10 +185,72 @@ def remove_server(): def view_changes(): return jsonify({"added_servers": consistent_hash_map.added_servers.keys(), "removed_servers": consistent_hash_map.removed_servers}), 200 -@app.route('/server_stats') -def server_stats(): - stats = {server_id: server.request_count for server_id, server in consistent_hash_map.added_servers.items()} - return jsonify(stats), 200 + +@app.route('/rep', methods=['GET']) +def get_replicas_status(): + response_data = { + "message": { + "N": len(load_balancer.replicas), + "replicas": load_balancer.get_replicas_status() + }, + "status": "successful" + } + return jsonify(response_data), 200 + +@app.route('/add', methods=['POST']) +def add_replicas(): + data = request.json + n = data.get('n') + hostnames = data.get('hostnames') + + # Check if the number of hostnames provided matches the specified number of instances + if len(hostnames) != n: + return jsonify({"message": " Length of hostname list is more than newly added instances", "status": "failure"}), 400 + + # Check if any of the provided hostnames already exist in the replicas + existing_replicas = load_balancer.get_replicas_status() + for hostname in hostnames: + if hostname in existing_replicas: + return jsonify({"message": f" Replica {hostname} already exists", "status": "failure"}), 400 + + # Add new replicas + for hostname in hostnames: + consistent_hash_map.add_server(hostname) + load_balancer.add_replica(hostname) + + response_data = { + "message": { + "N": len(load_balancer.replicas), + "replicas": load_balancer.get_replicas_status() + }, + "status": "successful" + } + return jsonify(response_data), 200 + +@app.route('/rm', methods=['DELETE']) +def remove_replicas(): + data = request.json + n = data.get('n') + hostnames = data.get('hostnames') + + # Check if the number of hostnames provided matches the specified number of instances + if len(hostnames) != n: + return jsonify({"message": " Length of hostname list is more than instances to be removed", "status": "failure"}), 400 + + # Remove replicas + for hostname in hostnames: + consistent_hash_map.remove_server(hostname) + load_balancer.replicas = [replica for replica in load_balancer.replicas if replica.id != hostname] + + response_data = { + "message": { + "N": len(load_balancer.replicas), + "replicas": load_balancer.get_replicas_status() + }, + "status": "successful" + } + return jsonify(response_data), 200 + if __name__ == '__main__': app.run(host='0.0.0.0', port=6000) From c93efd1a17c2e4068522a34a3c5900e85735a7cb Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Tue, 28 May 2024 21:14:20 +0300 Subject: [PATCH 08/10] Update README.md --- README.md | 55 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3853765..df2374e 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,14 @@ ### TASK ONE: SERVER * **Endpoint (/home, method=GET)**: This endpoint returns a string with a unique identifier to distinguish among the replicated server containers. For instance, if a client requests this endpoint and the load balancer schedules the request to Server: 3, then an example return string would be Hello from Server: Hint: Server ID can be set as an env variable while running a container instance from the docker image of the server - - Command: ``` curl -X GET http://localhost:6000/home ``` - - Response: ```{"message":"Hello from Server: 10","status":"successful"}``` + - Command: ```curl -X GET -H "Content-type: application/json" http://localhost:5000/home``` + - Response: ```{"message": "Hello from server_1"}}``` * **Endpoint (/heartbeat, method=GET)**: This endpoint sends heartbeat responses upon request. The load balancer further uses the heartbeat endpoint to identify failures in the set of containers maintained by it. Therefore, you could send an empty response with a valid response code. - - Command: ```curl -X GET http://localhost:6000/heartbeat``` - - Response: ```Response [EMPTY] ``` + - Command: ```curl -X GET -H "Content-type: application/json" http://localhost:5000/heartbeat``` + - Response: ```{}``` ### TASK TWO: CONSISTENT HASHING * In this task, you need to implement a consistent hash map using an array, linked list, or any other data structure. This map data @@ -35,26 +35,36 @@ structure details are given in Appendix A. Use the following parameters and hash ### TASK THREE: LOAD BALANCER * **Endpoint (/add, method=POST)**: This endpoint adds new server instances in the load balancer to scale up with increasing client numbers in the system. The endpoint expects a JSON payload that mentions the number of newinstances and their preferred hostnames (same as the container name in docker) in a list. An example request and response is below. - - Command: ``` curl -X POST -H "Content-Type: application/json" --data-binary "{\"n\": 6, \"hostnames\": [1, 2, 3, 4, 5, 6]}" http://localhost:6000/add ``` - - Response: ```{"message":{"N":6,"replicas":[{"cpu_usage":0.0,"id":1,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":2,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":3,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":4,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":5,"memory_usage":27.6,"request_count":0},{"cpu_usage":0.0,"id":6,"memory_usage":27.6,"request_count":0}]},"status":"successful"}``` - - *use of psutil library to improve the consistent hashing algorithm to load balance more efficiently amongst all the servers* + - Command: ``` curl -X POST -H "Content-Type: application/json" --data-binary "{\"n\": 4, \"hostnames\": [\"server11\", \"server12\", \"server13\", \"new_servers4\"]}" http://localhost:5000/add ``` + - Response: ```{"message": {"N": 5,"replicas": ["server12","new_servers4","server_1","server11","server13"]}, + "status": "successful"}``` * Perform simple sanity checks on the request payload and ensure that hostnames mentioned in the Payload are less than or equal to newly added instances. Note that the hostnames are preferably set. One can never set the hostnames. In that case, the hostnames (container names) are set randomly. However, sending a hostname list with greater length than newly added instances will result in an error. - - Command: ``` curl -X POST -H "Content-Type: application/json" --data-binary "{\"n\": 3, \"hostnames\": [1, 2, 3, 4, 5, 6]}" http://localhost:6000/add ``` - - Response: ```{"message":" Length of hostname list is more than newly added instances","status":"failure"}``` + - Command: ```curl -X POST -H "Content-Type: application/json" --data-binary "{\"n\": 2, \"hostnames\": [\"server11\", \"server12\", \"server13\", \"new_servers4\"]}" http://localhost:5000/add``` + - Response: ```{"message": " Length of hostname list is more than newly added instances","status": "failure"}``` * **Endpoint (/rep, method=GET)**: This endpoint only returns the status of the replicas managed by the load balancer. The response contains the number of replicas and their hostname in the docker internal network:n1 as mentioned in Fig. 1. An example response is shown below. - - Command: ``` curl http://localhost:6000/rep ``` - - Response: ```{"message":{"N":6,"replicas":[{"id":1,"id":2,"id":3,"id":4,"id":5,"id":6}]},"status":"successful"}``` + - Command: ``` curl -X GET -H "Content-type: application/json" http://localhost:5000/rep ``` + - Response: ```{"message": {"N": 0,"replicas": []},"status": "successful"}``` * **Endpoint (/rm, method=DELETE)**: This endpoint removes server instances in the load balancer to scale down with decreasing client or system maintenance. The endpoint expects a JSON payload that mentions the number of instances to be removed and their preferred hostnames (same as container name in docker) in a list. An example request and response is below. - - Command: ``` curl -X DELETE -H "Content-Type: application/json" --data-binary "{\"n\": 1, \"hostnames\": [\"5\"]}" http://localhost:6000/rm ``` - - Response: ```{"message":{"N":5,"replicas":[{"cpu_usage":0.0,"id":2,"memory_usage":27.8,"equest_count":0},{"cpu_usage":0.0,"id":3,"memory_usage":27.8,"request_count":0},{"cpu_usage":0.0,"id":4,"memory_usage":27.8,"request_count":0},{"cpu_usage":0.0,"id":5,"memory_usage":27.8,"request_count":0},{"cpu_usage":0.0,"id":6,"memory_usage":27.8,"request_count":0}]},"status":"successful"}``` - - *shows that the sever with id '1' has been removed successfully* + - Command: ```curl -X POST -H "Content-Type: application/json" --data-binary "{\"n\": 2, \"hostnames\": [\"server11\", \"server12\"] +}" http://localhost:5000/rm ``` + - Response: ```{"message": {"N": 3,"replicas": ["new_servers4","server_1","server13"]},"status": "successful"}``` + - *shows that the server12 and server11 have been removed successfully* -* **Endpoint (/server_stats, method=GET)**: This endpoint is used to view all of the servers that are currently being used. Additonally, it provides a list of the amount each server has that aids in visualising the load balanccing. An example request and response is below. - - Command: ``` curl http://localhost:6000/server_stats``` - - Response: ``` {"1":33,"2":69} ``` - - *After adding two servers, 1 and 2, and loading 102 requests routed to ```/home```* +* **Endpoint (/checkpoint, method=GET)**: This endpoint is used to view all of the servers that are currently being used. Additonally, it provides a list of the amount each server has that aids in visualising the load balancing. An example request and response is below. + - Command: ```curl -X GET -H "Content-type: application/json" http://localhost:5000/checkpoint``` + - Response: ```{"requests": {"new_servers4": 10,"server13": 28,"server_1": 63}, "servers": ["new_servers4","server_1","server13"]}``` + - *Using the existing servers, "new_servers4","server_1","server13", you are able to see the distribution of requests to each server after sending 100 requests to the ```/home``` endpoint* + +* **Endpoint (/graph, method=GET)**: This endpoint is used to create a bar graph using the distribution data from the ```/checkpoint``` endpoint, where the server names are on the x-axis, and the number of requests are on the y-axis. An example request and response is below. + - Command: ```curl -X GET -H "Content-type: application/json" -o endpoint_example.png http://localhost:5000/graph``` + - Response: ``` % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 100 23576 100 23576 0 0 57646 0 --:--:-- --:--:-- --:--:-- 57784``` + - *a new graph is created, "endpoint_example.png", that shows the distribution as seen in ```checkpoint``` data* + - Graph: + - ### TASK FOUR: ANALYSIS * Launch 10000 async requests on N = 3 server containers and report the request count handled by each server instance in a bar chart. Explain your observations in the graph and your view on the performance. @@ -101,12 +111,13 @@ structure details are given in Appendix A. Use the following parameters and hash * Finally, modify the hash functions H(i), Φ(i, j) and report the observations from (A-1) and (A-2). - To achieve a better distribution, the following changes were made to the consistent hashing function: - - Number of Server Containers managed by the load balancer (N) = 50 - - Total number of slots in the consistent hash map (#slots) = 2500 - - Number of virtual servers for each server container (K) = 50 + - Number of Server Containers managed by the load balancer (N) = 3 + - Total number of slots in the consistent hash map (#slots) = 512 + - Number of virtual servers for each server container (K) = 20 - Hash function for request mapping H(i) = Rid % M - Hash function for virtual server mapping Φ(i, j) = (Sid + i) % M - - Additionally, the hashing is enhanced by distributing the load based on what server has the lowest cpu percentage, thus preventing server overload + - Although there is still a bias towards one of the servers, the load balancer is able to effectively balance the load accross all respective servers + - Additionally, after closing a healthy server using the ```/rm``` endpoint, all of its previous requests are distributed amongst the existing healthy servers * Launch 10000 async requests on N = 3 server containers and report the request count handled by each server instance in a bar chart. Explain your observations in the graph and your view on the performance. - After adding three servers ('1', '2', '3'): From 707d4212f193af01b127018a9f63345c915ef2c6 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 30 May 2024 11:15:47 +0300 Subject: [PATCH 09/10] final --- .dockerignore | 2 + Dockerfile | 44 ++++-- Makefile | 22 --- analysis.py | 75 ---------- consistent_hash.py | 59 ++++++++ docker-compose.yml | 18 --- images/task4_a42_2servers.png | Bin 0 -> 23896 bytes images/task4_a42_3servers.png | Bin 0 -> 21960 bytes images/task4_a42_4servers.png | Bin 0 -> 23984 bytes images/task4_a42_5servers.png | Bin 0 -> 24223 bytes images/task4_a42_6servers.png | Bin 0 -> 23760 bytes load_balancer.py | 232 ++++++++++++++++++++++++++++++ server.py | 256 ---------------------------------- utils.py | 83 +++++++++++ 14 files changed, 409 insertions(+), 382 deletions(-) create mode 100644 .dockerignore delete mode 100644 Makefile delete mode 100644 analysis.py create mode 100644 consistent_hash.py delete mode 100644 docker-compose.yml create mode 100644 images/task4_a42_2servers.png create mode 100644 images/task4_a42_3servers.png create mode 100644 images/task4_a42_4servers.png create mode 100644 images/task4_a42_5servers.png create mode 100644 images/task4_a42_6servers.png create mode 100644 load_balancer.py delete mode 100644 server.py create mode 100644 utils.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3cf8c6d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +env +__pycache__ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 0fcfae0..46eb3b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,39 @@ -# Use the official Python image -FROM python:3.9-slim +FROM python:3.10.12-slim -# Set the working directory in the container WORKDIR /app -# Copy the current directory contents into the container at /app -COPY server.py /app +RUN pip install flask requests asyncio httpx Flask-APScheduler matplotlib -# Install Flask -RUN pip install --no-cache-dir Flask +RUN apt-get update +RUN apt-get -y install sudo -# Expose port 6000 to the outside world -EXPOSE 6000 +RUN apt-get -y update +RUN apt-get -y install ca-certificates curl gnupg +RUN install -m 0755 -d /etc/apt/keyrings +RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg +RUN chmod a+r /etc/apt/keyrings/docker.gpg -# Run server.py when the container launches -CMD ["python", "server.py"] +RUN echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + tee /etc/apt/sources.list.d/docker.list > /dev/null +RUN apt-get -y update + +RUN apt-get -y install docker-ce-cli + +ENV USER=theuser +RUN adduser --home /home/$USER --disabled-password --gecos GECOS $USER \ + && echo "$USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USER \ + && chmod 0440 /etc/sudoers.d/$USER \ + && groupadd docker \ + && usermod -aG docker $USER \ + && chsh -s /bin/zsh $USER +USER $USER + +ENV HOME=/home/$USER + +COPY . /app + +CMD ["python", "load_balancer.py"] + +EXPOSE 5000 diff --git a/Makefile b/Makefile deleted file mode 100644 index c02a26f..0000000 --- a/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# Default target: start the stack -start: - docker-compose up -d - -# Stop the stack -stop: - docker-compose down - -# View logs -logs: - docker-compose logs -f - -# Build the load balancer container -build_lb: - docker-compose build load_balancer - -# Build the server container -build_server: - docker-compose build server_container - -# Rebuild the stack -rebuild: build_lb build_server start diff --git a/analysis.py b/analysis.py deleted file mode 100644 index 5859c3f..0000000 --- a/analysis.py +++ /dev/null @@ -1,75 +0,0 @@ -import requests -import matplotlib.pyplot as plt -import numpy as np - -# Function to launch 10000 async requests on N = 3 server containers -def launch_requests(): - url = 'http://localhost:6000/home' - server_counts = 3 - server_request_counts = [0] * server_counts - - # Launch 10000 async requests - for _ in range(10000): - response = requests.get(url) - server_id = int(response.json()['message'].split()[-1]) - 1 - server_request_counts[server_id] += 1 - - # Plot the request count handled by each server instance in a bar chart - plt.bar(np.arange(server_counts) + 1, server_request_counts) - plt.xlabel('Server Instance') - plt.ylabel('Request Count') - plt.title('Request Count Handled by Each Server Instance') - plt.show() - -# Function to increment N from 2 to 6 and launch 10000 requests on each increment -def test_scalability(): - url = 'http://localhost:6000/add' - server_counts = list(range(2, 7)) - average_loads = [] - - # Increment N from 2 to 6 and launch 10000 requests on each increment - for N in server_counts: - data = {'n': N, 'hostnames': [f'server_{i}' for i in range(1, N + 1)]} - response = requests.post(url, json=data) - - # Launch 10000 requests - server_request_counts = [0] * N - for _ in range(10000): - response = requests.get('http://localhost:6000/home') - server_id = int(response.json()['message'].split()[-1]) - 1 - server_request_counts[server_id] += 1 - - # Calculate the average load of the servers - average_load = sum(server_request_counts) / N - average_loads.append(average_load) - - # Plot the average load of the servers at each run in a line chart - plt.plot(server_counts, average_loads, marker='o') - plt.xlabel('Number of Servers') - plt.ylabel('Average Load') - plt.title('Average Load of Servers for Different Number of Servers') - plt.grid(True) - plt.show() - -# Function to test all endpoints of the load balancer and show that it promptly recovers from server container failure -def test_server_failure_recovery(): - # Send requests to view server stats - response = requests.get('http://localhost:6000/server_stats') - print("Initial Server Stats:", response.json()) - - # Simulate server container failure by removing a server - response = requests.post('http://localhost:6000/remove_server', json={'server_id': 'server_1'}) - print("Server Removal Status:", response.json()) - - # Send requests again to view updated server stats - response = requests.get('http://localhost:6000/server_stats') - print("Updated Server Stats:", response.json()) - -# Task A-1: Launch 10000 async requests on N = 3 server containers and report the request count handled by each server instance in a bar chart -launch_requests() - -# Task A-2: Increment N from 2 to 6 and launch 10000 requests on each increment. Report the average load of the servers at each run in a line chart -test_scalability() - -# Task A-3: Test all endpoints of the load balancer and show that in case of server failure, the load balancer spawns a new instance quickly to handle the load -test_server_failure_recovery() diff --git a/consistent_hash.py b/consistent_hash.py new file mode 100644 index 0000000..957a311 --- /dev/null +++ b/consistent_hash.py @@ -0,0 +1,59 @@ +import hashlib + +class ConsistantHash: + def __init__(self): + self.slots = 512 + self.k = 20 + self.consistant_hash = [0] * self.slots + self.map = {} + + def h(self, i: int) -> int: + return (i*i + 2*i + 17) % self.slots + + def fi(self, i: int, j: int) -> int: + return (i*i + j*j + 2*j + 25) % self.slots + + def get_server_id(self, server: str) -> int: + return int(hashlib.md5(server.encode()).hexdigest(), 16) % self.slots + + def build(self, server_list: set[str]): + for server in server_list: + self.add_server_to_hash(server) + + def get_server_from_request(self, request_id: int) -> str: + req_pos = self.h(request_id) + for i in range(self.slots): + if self.consistant_hash[req_pos] != 0: + return self.consistant_hash[req_pos] + else: + req_pos = (req_pos + 1) % self.slots + return None + + def add_server_to_hash(self, server: str): + server_id = self.get_server_id(server) + for j in range(self.k): + pos = self.fi(server_id, j) + if self.consistant_hash[pos] == 0: + self.consistant_hash[pos] = server + else: + original_pos = pos + while self.consistant_hash[pos] != 0: + pos = (pos + 1) % self.slots + if pos == original_pos: + raise Exception("Hash table is full") + self.consistant_hash[pos] = server + self.map[server] = server_id + + def remove_server_from_hash(self, server: str, request_counts: dict): + server_id = self.map[server] + for i in range(self.slots): + if self.consistant_hash[i] == server: + self.consistant_hash[i] = 0 + del self.map[server] + + total_requests = request_counts.pop(server, 0) + servers = list(self.map.keys()) + if servers: + requests_per_server = total_requests // len(servers) + for s in servers: + request_counts[s] += requests_per_server diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 598a1e5..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: '3.8' - -services: - load_balancer: - build: ./load_balancer - ports: - - "6000:6000" - environment: - N: 2 # Default value for the number of server containers - K: 20 # Default value for the number of replicas per server - restart: always - - server_container: - build: ./server - environment: - FLASK_APP: server.py - FLASK_RUN_HOST: 0.0.0.0 - restart: always diff --git a/images/task4_a42_2servers.png b/images/task4_a42_2servers.png new file mode 100644 index 0000000000000000000000000000000000000000..2ceb37240e0c9a06591960343d995b3e7cad2eec GIT binary patch literal 23896 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 GbN>T0u6%R= literal 0 HcmV?d00001 diff --git a/images/task4_a42_3servers.png b/images/task4_a42_3servers.png new file mode 100644 index 0000000000000000000000000000000000000000..724c0eec1de52920213bdafc3015c71f89dffc7b GIT binary patch literal 21960 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 literal 0 HcmV?d00001 diff --git a/images/task4_a42_4servers.png b/images/task4_a42_4servers.png new file mode 100644 index 0000000000000000000000000000000000000000..2114a31ad071453ba5ad8fed7e8c0954873b5249 GIT binary patch literal 23984 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 V^|5#>oSshYQQN1QtYUHY{{iUK>y!Wh literal 0 HcmV?d00001 diff --git a/images/task4_a42_5servers.png b/images/task4_a42_5servers.png new file mode 100644 index 0000000000000000000000000000000000000000..df0b3ebc5bbc6942939011842941fae241c22936 GIT binary patch literal 24223 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°r+4j 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 literal 0 HcmV?d00001 diff --git a/load_balancer.py b/load_balancer.py new file mode 100644 index 0000000..e99c2e1 --- /dev/null +++ b/load_balancer.py @@ -0,0 +1,232 @@ +from apscheduler.schedulers.background import BackgroundScheduler +from flask import Flask, jsonify, request, Response +from subprocess import Popen, PIPE +from consistent_hash import ConsistantHash +from utils import ( + errHostnameListInconsistent, + errInvalidRequest, + get_container_rm_command, + get_container_run_command, + get_random_name, + get_random_number, + get_server_health, + get_unhealty_servers, + validateRequest, +) + +import signal +import asyncio +import logging as log +import random +import matplotlib.pyplot as plt +import io + + +NETWORK_NAME = "load_balancer_network" + +app = Flask(__name__) +consistant_hash = ConsistantHash() +servers = {'Server-1', 'Server-2'} +request_counts = {server: 0 for server in servers} + +def check_servers(): + global servers + + log.debug("Checking server health...") + unhealthy_servers = asyncio.run(get_unhealty_servers(servers)) + print("Unhealthy servers: ", unhealthy_servers, flush=True) + for server in unhealthy_servers: + print(f"Removing {server}", flush=True) + command = get_container_rm_command(server, NETWORK_NAME) + res = Popen(command, stdout=PIPE, stderr=PIPE) + stdout, stderr = res.communicate() + if res.returncode != 0: + log.error(f"Error in removing {server}: {stderr.decode().strip()}") + else: + log.info(f"Removed {server}") + consistant_hash.remove_server_from_hash(server, request_counts) + servers.remove(server) + request_counts.pop(server, None) + +sched = BackgroundScheduler(daemon=True) +sched.add_job(check_servers, 'interval', seconds=30) +sched.start() + +@app.route('/heartbeat', methods=['GET']) +def heartbeat(): + return jsonify({}), 200 + +@app.route('/rep', methods=['GET']) +def rep(): + global servers + + healthy_servers = asyncio.run(get_server_health(servers)) + output = { + 'message': { + 'N': len(healthy_servers), + 'replicas': healthy_servers + }, + 'status': 'successful' + } + return jsonify(output), 200 + +@app.route('/add', methods=['POST']) +def add(): + global servers, request_counts + + n, hostnames, err = validateRequest(request) + if err is errInvalidRequest: + return jsonify({ + 'message': ' Request payload in invalid format', + 'status': 'failure' + }), 400 + if err is errHostnameListInconsistent: + return jsonify({ + 'message': ' Length of hostname list is more than newly added instances', + 'status': 'failure' + }), 400 + + random_servers = 0 + for hostname in hostnames: + if hostname in servers: + log.info(f"Server {hostname} already exists") + random_servers += 1 + continue + + command = get_container_run_command(hostname, NETWORK_NAME) + res = Popen(command, stdout=PIPE, stderr=PIPE) + stdout, stderr = res.communicate() + if res.returncode != 0: + log.error(f"Error in adding {hostname}: {stderr.decode().strip()}") + else: + servers.add(hostname) + request_counts[hostname] = 0 + consistant_hash.add_server_to_hash(hostname) + log.info(f"Added {hostname}") + + random_servers += n - len(hostnames) + random_servers_up = 0 + while random_servers_up < random_servers: + server_name = get_random_name(7) + command = get_container_run_command(server_name) + res = Popen(command, stdout=PIPE, stderr=PIPE) + stdout, stderr = res.communicate() + if res.returncode != 0: + log.error(f"Error in adding server with random name {server_name}: {stderr.decode().strip()}") + else: + servers.add(server_name) + request_counts[server_name] = 0 + consistant_hash.add_server_to_hash(server_name) + log.info(f"Added {server_name}") + random_servers_up += 1 + + output = { + 'message': { + 'N': len(servers), + 'replicas': list(servers) + }, + 'status': 'successful' + } + return jsonify(output), 200 + +@app.route('/rm', methods=['POST']) +def rm(): + global servers, request_counts + + n, hostnames, err = validateRequest(request) + if err is errInvalidRequest: + return jsonify({ + 'message': ' Request payload in invalid format', + 'status': 'failure' + }), 400 + if err is errHostnameListInconsistent: + return jsonify({ + 'message': ' Length of hostname list is more than removable instances', + 'status': 'failure' + }), 400 + + random_servers = 0 + for hostname in hostnames: + if hostname not in servers: + log.info(f"Server {hostname} does not exist") + random_servers += 1 + continue + + command = get_container_rm_command(hostname) + res = Popen(command, stdout=PIPE, stderr=PIPE) + stdout, stderr = res.communicate() + if res.returncode != 0: + log.error(f"Error in removing {hostname}: {stderr.decode().strip()}") + else: + log.info(f"Removed {hostname}") + consistant_hash.remove_server_from_hash(hostname, request_counts) + servers.remove(hostname) + request_counts.pop(hostname, None) + + random_servers += n - len(hostnames) + random_servers_up = 0 + while random_servers_up < random_servers: + server_name = random.choice(list(servers)) + command = get_container_rm_command(server_name) + res = Popen(command, stdout=PIPE, stderr=PIPE) + stdout, stderr = res.communicate() + if res.returncode != 0: + log.error(f"Error in removing random server with name {server_name}: {stderr.decode().strip()}") + else: + log.info(f"Removed {server_name}") + consistant_hash.remove_server_from_hash(server_name, request_counts) + servers.remove(server_name) + request_counts.pop(server_name, None) + random_servers_up += 1 + + output = { + 'message': { + 'N': len(servers), + 'replicas': list(servers) + }, + 'status': 'successful' + } + return jsonify(output), 200 + +@app.route('/checkpoint', methods=['GET']) +def checkpoint(): + global servers, request_counts + output = { + 'servers': list(servers), + 'requests': request_counts + } + return jsonify(output), 200 + +@app.route('/home', methods=['GET']) +def home(): + global servers, request_counts + + server_name = consistant_hash.get_server_from_request(get_random_number(6)) + request_counts[server_name] += 1 + return jsonify({"message": f"Hello from {server_name}"}), 200 + +@app.route('/graph', methods=['GET']) +def generate_graph(): + global servers, request_counts + + # Create lists for servers and request counts + server_names = list(servers) + counts = [request_counts[server] for server in server_names] + + # Create a bar plot + plt.bar(server_names, counts) + plt.xlabel('Server Name') + plt.ylabel('Requests Per Server') + plt.title('Distribution of Requests Among Servers Using Updated Algorithm') + + # Save the plot to a byte buffer + buffer = io.BytesIO() + plt.savefig(buffer, format='png') + buffer.seek(0) + + # Return the plot as a response + return Response(buffer.getvalue(), mimetype='image/png') + +if __name__ == '__main__': + consistant_hash.build(servers) + app.run(debug=True, host='0.0.0.0', port='5000') diff --git a/server.py b/server.py deleted file mode 100644 index 611e726..0000000 --- a/server.py +++ /dev/null @@ -1,256 +0,0 @@ -from flask import Flask, jsonify, request -import os -import random -import string -import psutil - -app = Flask(__name__) - -class Server: - def __init__(self, server_id): - self.id = server_id - self.request_count = 0 - - def increment_request_count(self): - self.request_count += 1 - -class ConsistentHashMap: - def __init__(self, N, K): - self.N = N # Total number of server containers - self.K = K # Number of times each server is replicated - self.M = N * K # Total number of slots in the consistent hash map - self.hash_map = [[] for _ in range(self.M)] # Initialize hash map with empty lists - self.server_map = {} # Dictionary to map server IDs to slots - self.added_servers = {} # Dictionary to track added servers - self.removed_servers = [] # List to track removed servers - self.total_requests = 0 # Total number of requests handled by the system - - def hash_function(self, Rid): - # Adjusting the hash function for better load balancing - hash_object = hashlib.sha256(str(Rid).encode()) - hash_hex = hash_object.hexdigest() - hash_value = int(hash_hex, 16) % self.M - return hash_value - - def server_hash_function(self, Sid): - hash_values = [] - for i in range(self.K): # Generate K virtual nodes for each server - combined_id = str(Sid) + "_" + str(i) # Combine server ID and counter - hash_value = hash(combined_id) % self.M # Hash the combined ID - hash_values.append(hash_value) - return hash_values - - def add_server(self, Sid): - if Sid in self.server_map: - return False # Server already exists - for hash_value in self.server_hash_function(Sid): - while hash_value in self.server_map.values(): # Conflict resolution - Sid += 1 - hash_values = self.server_hash_function(Sid) # Re-generate hash values - self.hash_map[hash_value].append(Sid) - server = Server(Sid) - self.server_map[Sid] = server - self.added_servers[Sid] = server - return True - - def remove_server(self, Sid): - if Sid not in self.server_map: - return False # Server not found - for _ in range(self.K): - hash_value = self.server_map.pop(Sid).id - self.hash_map[hash_value].remove(Sid) - self.removed_servers.append(Sid) - return True - - def get_server(self, Rid): - self.total_requests += 1 # Increment total requests counter - hash_value = self.hash_function(Rid) - slots = len(self.hash_map) - selected_server = None - min_requests = float('inf') - - # Iterate through the hash map to find the server with the least requests - for i in range(slots): - slot_index = (hash_value + i) % slots - if self.hash_map[slot_index]: - server_id = self.hash_map[slot_index][0] - server = self.server_map[server_id] - if server.request_count < min_requests: - min_requests = server.request_count - selected_server = server_id - - # If no server is found (which could happen if the server map is empty), - # return None to handle the situation gracefully - if selected_server is None: - return None - - # Increment request count for the selected server - self.server_map[selected_server].increment_request_count() - return selected_server - - - def get_all_servers(self): - return list(self.server_map.keys()) - -# Initialize Consistent Hash Map with N=5 server containers and K=20 replicas per server -consistent_hash_map = ConsistentHashMap(N=50, K=50) - -class LoadBalancer: - def __init__(self): - self.replicas = [] - - # Update add_replica method to include server statistics - def add_replica(self, hostname): - server = Server(hostname) - self.replicas.append(server) - - # Update remove_replica method to handle server removal - def remove_replica(self, hostname): - self.replicas = [replica for replica in self.replicas if replica.id != hostname] - - # Update get_replicas_status method to include server health status - def get_replicas_status(self): - status = [] - for server in self.replicas: - server_status = { - "id": server.id, - "request_count": server.request_count, - "cpu_usage": psutil.cpu_percent(), # Get CPU usage - "memory_usage": psutil.virtual_memory().percent # Get memory usage - } - status.append(server_status) - return status - - # Implement a dynamic load balancing algorithm to select the next server based on load - def get_next_server(self): - # Choose the server with the lowest CPU usage - if len(self.replicas) == 0: - return None - elif len(self.replicas) == 1: - return self.replicas[0].id - else: - min_cpu_server = min(self.replicas, key=lambda x: psutil.cpu_percent()) - return min_cpu_server.id - - -# Initialize Load Balancer -load_balancer = LoadBalancer() - - -@app.route('/home') -def home(): - request_id = random.randint(0, 1000) # Generate a random request ID - server_assigned = load_balancer.get_next_server() - server = consistent_hash_map.server_map.get(server_assigned) - if server: - server.increment_request_count() - return jsonify({"message": f"Hello from Server: {server_assigned}", "status": "successful"}), 200 - - - -# Route to view server stats -@app.route('/server_stats') -def server_stats(): - stats = {server_id: server.request_count for server_id, server in consistent_hash_map.server_map.items()} - return jsonify(stats), 200 - - -@app.route('/heartbeat') -def heartbeat(): - return '', 200 - -@app.route('/add_server', methods=['POST']) -def add_server(): - data = request.json - server_id = data.get('server_id') - success = consistent_hash_map.add_server(server_id) - if success: - load_balancer.add_replica(server_id) - return jsonify({"message": f"Server {server_id} added successfully", "status": "successful"}), 200 - else: - return jsonify({"message": f"Server {server_id} already exists", "status": "failed"}), 400 - -@app.route('/remove_server', methods=['POST']) -def remove_server(): - data = request.json - server_id = data.get('server_id') - success = consistent_hash_map.remove_server(server_id) - if success: - load_balancer.remove_replica(server_id) - return jsonify({"message": f"Server {server_id} removed successfully", "status": "successful"}), 200 - else: - return jsonify({"message": f"Server {server_id} not found", "status": "failed"}), 400 - -@app.route('/view_changes') -def view_changes(): - return jsonify({"added_servers": consistent_hash_map.added_servers.keys(), "removed_servers": consistent_hash_map.removed_servers}), 200 - - -@app.route('/rep', methods=['GET']) -def get_replicas_status(): - response_data = { - "message": { - "N": len(load_balancer.replicas), - "replicas": load_balancer.get_replicas_status() - }, - "status": "successful" - } - return jsonify(response_data), 200 - -@app.route('/add', methods=['POST']) -def add_replicas(): - data = request.json - n = data.get('n') - hostnames = data.get('hostnames') - - # Check if the number of hostnames provided matches the specified number of instances - if len(hostnames) != n: - return jsonify({"message": " Length of hostname list is more than newly added instances", "status": "failure"}), 400 - - # Check if any of the provided hostnames already exist in the replicas - existing_replicas = load_balancer.get_replicas_status() - for hostname in hostnames: - if hostname in existing_replicas: - return jsonify({"message": f" Replica {hostname} already exists", "status": "failure"}), 400 - - # Add new replicas - for hostname in hostnames: - consistent_hash_map.add_server(hostname) - load_balancer.add_replica(hostname) - - response_data = { - "message": { - "N": len(load_balancer.replicas), - "replicas": load_balancer.get_replicas_status() - }, - "status": "successful" - } - return jsonify(response_data), 200 - -@app.route('/rm', methods=['DELETE']) -def remove_replicas(): - data = request.json - n = data.get('n') - hostnames = data.get('hostnames') - - # Check if the number of hostnames provided matches the specified number of instances - if len(hostnames) != n: - return jsonify({"message": " Length of hostname list is more than instances to be removed", "status": "failure"}), 400 - - # Remove replicas - for hostname in hostnames: - consistent_hash_map.remove_server(hostname) - load_balancer.replicas = [replica for replica in load_balancer.replicas if replica.id != hostname] - - response_data = { - "message": { - "N": len(load_balancer.replicas), - "replicas": load_balancer.get_replicas_status() - }, - "status": "successful" - } - return jsonify(response_data), 200 - - -if __name__ == '__main__': - app.run(host='0.0.0.0', port=6000) diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..c2ca4d6 --- /dev/null +++ b/utils.py @@ -0,0 +1,83 @@ +from flask import Request +import asyncio +import httpx +import random +import string + +errInvalidRequest = "Invalid request" +errHostnameListInconsistent = "Hostname List Inconsistent" + +def validateRequest(request: Request): + req = request.get_json() + + if req['n'] is None or req['n'] <= 0: + return None, None, errInvalidRequest + if req['n'] > 0 and len(req['hostnames']) > req['n']: + return None, None, errHostnameListInconsistent + + if req['hostnames'] is None: + return req['n'], [], None + + return req['n'], req['hostnames'], None + +async def fetch_url(url) -> bool: + async with httpx.AsyncClient() as client: + try: + response = await client.get(url, timeout=5) + response.raise_for_status() + return True + except: + return False + +async def fetch_all_urls(urls) -> list[bool]: + tasks = [asyncio.create_task(fetch_url(url)) for url in urls] + responses = await asyncio.gather(*tasks) + return responses + +async def get_server_health(servers: list[str]) -> list[str]: + urls = [f"http://{server}:5000/heartbeat" for server in servers] + responses = await fetch_all_urls(urls) + + output: list[str] = [] + + for server, result in zip(servers, responses): + if result == True: + output.append(server) + + return output + +async def get_unhealty_servers(servers: list[str]) -> set[str]: + urls = [f"http://{server}:5000/heartbeat" for server in servers] + responses = await fetch_all_urls(urls) + + output: set[str] = set() + + for server, result in zip(servers, responses): + if result == False: + output.add(server) + + return output + +def get_container_run_command(hostname: str, network_name: str) -> list[str]: + output = ["sudo", "docker", "run", + "--name", hostname, + "--network", network_name, + "--network-alias", hostname, + "-e", f"SERVER_ID={hostname}", + "-d", "server" + ] + return output + +def get_container_rm_command(hostname: str) -> list[str]: + output = ["sudo", "docker", "rm", "-f", hostname] + return output + +def get_random_name(length: int) -> str: + output = ''.join(random.choices(string.ascii_lowercase + string.digits, k=length)) + + return output + +def get_random_number(length: int) -> int: + output = ''.join(random.choices(string.digits, k=length)) + + return int(output) \ No newline at end of file From fe188b521df2db936900f4f74cc9584604a47e44 Mon Sep 17 00:00:00 2001 From: Jeevyy <112507117+Jeevyy@users.noreply.github.com> Date: Thu, 30 May 2024 11:22:10 +0300 Subject: [PATCH 10/10] Final README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index df2374e..4f422a8 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ structure details are given in Appendix A. Use the following parameters and hash - - Average load accross each server with 10,000 requests: - Graph: - - + - - Observation: - In the case of two servers, both servers handle a relatively similar load, with Server 1 slightly edging out Server 2. - This suggests a relatively balanced load distribution, although there is still room for improvement to ensure equitable resource utilization across the servers. @@ -122,7 +122,7 @@ structure details are given in Appendix A. Use the following parameters and hash * Launch 10000 async requests on N = 3 server containers and report the request count handled by each server instance in a bar chart. Explain your observations in the graph and your view on the performance. - After adding three servers ('1', '2', '3'): - Graph: - - + - - Observations: - Server 1 consistently handles the highest load, followed by Server 2 and then Server 3. Despite minor variations, this trend remains consistent across the different server counts. - The performance of the load balancer appears effective in distributing the load somewhat evenly across the servers, with Server 1 consistently bearing the highest load @@ -130,22 +130,22 @@ structure details are given in Appendix A. Use the following parameters and hash * Next, increment N from 2 to 6 and launch 10000 requests on each such increment. Report the average load of the servers at each run in a line chart. Explain your observations in the graph and your view on the scalability of the load balancer implementation - When N = 2 - Graph: - - + - - When N = 3 - Graph: - - + - - When N = 4 - Graph: - - + - - When N = 5 - Graph: - - + - - When N = 6 - Graph: - - + - - Average load accross each server with 10,000 requests: - Graph: - - + - - Observation: - In the case of two servers, Server 1 consistently handles a higher load compared to Server 2, suggesting an imbalance in the load distribution. - Despite this, the load balancer demonstrates a basic ability to distribute the load across multiple servers as compared to the first consistant hashing which happened to skew more into the first two servers