Skip to content

ranggaaldosas/cloud-c5-finalproject

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 

Repository files navigation

Laporan Final Project-c5-finalproject

Authors

Nama NRP Task
Keisya Nabila 5027211058 Worker
Rangga Aldo 5027211059 Database
Adiba Zalfa 502721160 Worker
Tarisha Icha 502721161 Worker
Anisa Ghina 502721162 Worker
Dzakirozaan Uzlah Wasata 502721166 Load Balancer
Athaya Reyhan 502721167 Load Balancer

1. Permasalahan

Anda adalah seorang lulusan Teknologi Informasi, sebagai ahli IT, salah satu kemampuan yang harus dimiliki adalah Kemampuan merancang, membangun, mengelola aplikasi berbasis komputer menggunakan layanan awan untuk memenuhi kebutuhan organisasi.(menurut kurikulum IT ITS 2023 😙)

Pada suatu saat teman anda ingin mengajak anda memulai bisnis di bidang digital marketing, anda diberikan sebuah aplikasi berbasis API File: app.py dengan spesifikasi sebagai berikut.

Kemudian anda diminta untuk mendesain arsitektur cloud yang sesuai dengan kebutuhan aplikasi tersebut. Apabila dana maksimal yang diberikan adalah 1 juta rupiah per bulan (65 US$) konfigurasi cloud terbaik seperti apa yang bisa dibuat?

Rancangan Arsitektur dan Tabel Harga Spesifikasi VM

  • Berikut adalah rancangan arsitektur yang telah kami buat untuk final project kami.

    Terdapat 3 rancangan arsitektur yang kami buat:

    1. Database dan Worker

    Screenshot 2023-12-15 140515

    1. Database, Worker 1, Worker 2, dan Load Balancer (Costum Droplet)

    Screenshot 2023-12-15 140610

    1. Database, Worker 1, Worker 2, dan Load Balancer (Digital Ocean)

    Screenshot 2023-12-15 140715

  • Kami memilih untuk menggunakan Digital Ocean sebagai lingkungan cloud yang akan kami gunakan. Berikut adalah tabel harga spesifikasi VM yang kami buat

    Screenshot 2023-12-14 230921

Langkah Implementasi dan Konfigurasi Teknologi

Setup Database

klik tombol create dan pilih yang databases

Untitled

kemudian pilih datacenter terdekat, disini kami pilih singapura dan untuk database enginenya kami pilih mongodb

Untitled 1

selanjutnya kita select budget sesuai dengan rancangan arsitekturnya yaitu $15

Untitled 2

Selanjutnya klik Create Database Cluster. Lalu masukkan IP Worker dan masukkan IP laptop yang digunakan untuk mengakses. Untuk mengecek IP laptop bisa menggunakan link berikut https://whatismyipaddress.com/

Masukkan pada restricted inbound connections seperti berikut

Untitled 3

Lalu pada connection details ganti settingan pada connection string dan klik copy

Untitled 4

Jangan lupa untuk mengganti dengan password yang didapatkan saat membuat database. Kemudian install mongo DBCompass pada link berikut https://www.mongodb.com/products/tools/compass . Setelah selesai instalasi, bukalah mongoDB compass dan buatlah new connection. Kemudian, masukkan connection string beserta password yang sudah kita copy tadi seperti berikut dan klik connect.

Untitled 5

Jangan lupa masukkan nama database (myDatabases) dan nama collection (orders_db) Apabila sudah database akan tersimpan seperti berikut

Untitled 6

Terakhir, untuk menggunakan connection string untuk worker database yang sebelumnya admin bisa diubah dengan myDatabases yang sudah dibuat sebelumnya

Untitled 7

Set Up Worker

Pada digital ocean, klik tombol create dan pilih droplets

WhatsApp Image 2023-12-15 at 13 11 31_83e71d96

Region yang dipilih adalah Singapura karena merupakan negara terdekat

WhatsApp Image 2023-12-15 at 13 14 04_ececae17

Kemudian, pilih Image. Image yang kami gunakan adalah Ubuntu versi 22.04 (LTS) x64

WhatsApp Image 2023-12-15 at 13 14 16_0ffa9122

Selanjutnya, pilih Size. Di sini, kami menentukan Droplet Type dan CPU untuk droplet yang akan dijadikan worker. Sesuai dengan rancangan, kami memilih droplet dengan spesifikasi 2GB/2CPUs seharga $12

WhatsApp Image 2023-12-15 at 14 06 52_c02f7135

Untuk authentication mode, kami memilih menggunakan password

WhatsApp Image 2023-12-15 at 13 19 36_c0ee6351

Terakhir, beri nama droplet dan tekan tombol Create Droplet untuk membuat droplet

WhatsApp Image 2023-12-15 at 14 06 10_55785b63

Masuk ke droplet yang sudah dibuat melalui SSH root@178.128.88.111

Kemudian masukkan password yang tadi sudah dibuat

WhatsApp Image 2023-12-15 at 13 56 00_3bdbc203

Jika sudah masuk, lakukan langkah-langkah berikut untuk melakukan set-up worker pada droplet

nano setup-worker.sh

Masukkan code berikut pada file setup-worker.sh

#!/bin/bash

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
apt-cache policy docker-ce
sudo apt install docker-ce -y
sudo systemctl status docker

mkdir worker1
cd worker1

echo 'FROM python:3.9-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
' > Dockerfile

echo 'version: '3.1'

services:
  worker1:
    build: /root/worker1
    restart: always
    ports:
      - "8080:8000"
' > docker-compose.yml

echo 'fastapi==0.78.0
uvicorn==0.18.2
pymongo
pydantic
uuid
Flask
Flask-PyMongo
gunicorn
' > requirements.txt

echo 'from flask import Flask, jsonify, request
from flask_pymongo import PyMongo
from bson import ObjectId

app = Flask(__name__)

# Configuration for MongoDB
app.config['MONGO_URI'] = 'mongodb+srv://doadmin:<password>@db-mongodb-sgp1-55072-cf745936.mongo.ondigitalocean.com/myDatabases?replicaSet=db-mongodb-sgp1-55072&tls=true&authSource=admin'
mongo = PyMongo(app)

# Routes

# Get all orders
@app.route('/orders', methods=['GET'])
def get_orders():
    orders = mongo.db.orders.find()
    orders_list = []
    for order in orders:
        order['_id'] = str(order['_id'])  # Convert ObjectId to string
        orders_list.append(order)
    return jsonify({"orders": orders_list})

# Get a specific order by ID
@app.route('/orders/<string:order_id>', methods=['GET'])
def get_order(order_id):
    order = mongo.db.orders.find_one({'_id': ObjectId(order_id)})
    if order:
        order['_id'] = str(order['_id'])  # Convert ObjectId to string
        return jsonify({"order": order})
    else:
        return jsonify({"message": "Order not found"}), 404

# Create a new order
@app.route('/orders', methods=['POST'])
def create_order():
    data = request.json
    new_order = {
        'product': data['product'],
        'quantity': data['quantity'],
        'customer_name': data['customer_name'],
        'customer_address': data['customer_address']
    }
    result = mongo.db.orders.insert_one(new_order)
    new_order['_id'] = str(result.inserted_id)  # Convert ObjectId to string
    return jsonify({"message": "Order created successfully", "order": new_order})

# Update an order by ID
@app.route('/orders/<string:order_id>', methods=['PUT'])
def update_order(order_id):
    data = request.json
    updated_order = {
        'product': data.get('product'),
        'quantity': data.get('quantity'),
        'customer_name': data.get('customer_name'),
        'customer_address': data.get('customer_address')
    }
    mongo.db.orders.update_one({'_id': ObjectId(order_id)}, {'$set': updated_order})
    updated_order['_id'] = order_id
    return jsonify({"message": "Order updated successfully", "order": updated_order})

# Delete an order by ID
@app.route('/orders/<string:order_id>', methods=['DELETE'])
def delete_order(order_id):
    result = mongo.db.orders.delete_one({'_id': ObjectId(order_id)})
    if result.deleted_count > 0:
        return jsonify({"message": "Order deleted successfully"})
    else:
        return jsonify({"message": "Order not found"}), 404

if __name__ == '__main__':
    app.run(debug=True)
' > app.py

cd /root

Kemudian, pada direktori root jalankan command

chmod +x worker-setup.sh

./worker-setup.sh

Setelah command dijalankan, worker akan ter set up hanya saja belum dijalankan. Worker akan dijalankan menggunakan docker dengan command berikut

(command dijalankan pada direktori worker1)

cd worker1

Membuat docker images : docker build -t worker1-app -f Dockerfile .

Menjalankan container : docker run -p 8000:8000 -d worker1-app

Kita bisa melihat apakah worker sudah berhasil berjalan melalui command docker ps Jika berhasil, maka akan keluar seperti berikut

WhatsApp Image 2023-12-15 at 13 46 07_e316005a

Untuk memeriksa apakah worker sudah berjalan di IP, port, dan endpoint yang sesuai, kita bisa mengeceknya melalui Insomnia/Postman

Di sini, kami memeriksa menggunakan endpoint GET /orders

WhatsApp Image 2023-12-15 at 14 05 29_b517e646

Lakukan hal yang sama pada droplet lain untuk mengsetup worker, jangan lupa untuk menyesuaikan nama sesuai kebutuhan.

Set Up LoadBalancer

Spesifikasi

Load balancer kami buat dengan menggunakan image Ubuntu 23.10 dan memiliki spesifikasi 1 CPU, 1 GB Memory, dan 25 GB SSD. Pricing yang dimiliki load balancer kami ada di angka 6 dolar.

Konfigurasi

  1. Pertama-tama klik tombol Create pada navbar Digital Ocean dan pilih menu Load Balancer.

  2. Kemudian, pilih region sesuai dengan region kita saat ini.

Screenshot 2023-12-15 011745

  1. Lalu sesuaikan jumlah droplet yang ingin terhubung ke Load Balancer. Pada arsitektur yang kami buat, kami menggunakan 2 worker.

Screenshot 2023-12-15 011947

  1. Setelah itu atur forwarding rules untuk melakukan konfigurasi port dari Load Balancer menuju ke 2 worker. Disini kami menggunakan port 8000 untuk keduanya.

Screenshot 2023-12-15 012235

  1. Terakhir berikan nama yang sesuai untuk Load Balancer yang ingin kita buat, kemudian klik Create untuk membuat Load Balancer.

Screenshot 2023-12-15 012415


Setelah Load Balancer berhasil dibuat, kita dapat mengakses dashboard Load Balancer untuk melihat status droplet yang terhubung ke Load Balancer kita. Apabila Load Balancer sudah berjalan dan tidak ada masalah pada kedua node, maka harusnya health check di dashboard bernilai 100%.

Screenshot 2023-12-15 012711

Konfigurasi Load Balancer Nginx

Spesifikasi

Load balancer kami buat dengan menggunakan image Ubuntu 23.10 dan memiliki spesifikasi 1 CPU, 1 GB Memory, dan 25 GB SSD. Pricing yang dimiliki load balancer kami ada di angka 6 dolar.

Konfigurasi

Load balancer kami menggunakan nginx. Pertama-tama, lakukan sudo apt-get update dan lakukan instalasi nginx dengan menjalankan command sudo apt-get install nginx -y.

Setelah berhasil, buatlah konfigurasi nginx untuk membuat load balancer. Konfigurasi nginx kami adalah sebagai berikut:

upstream app {
    server 178.128.88.111:8000;
    server 139.59.243.183:8000;
}

server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://app;
    }
}

Konfigurasi kami buat di direktori /etc/nginx/sites-enabled dengan cara melakukan symlink dengan command sudo ln -s /etc/nginx/sites-available/loadbalancer /etc/nginx/sites-enabled/.

Screenshot 2023-12-15 005928

Selanjutnya, restart service nginx dan pastikan nginx sudah berjalan dengan menjalankan command sudo service nginx status.

Screenshot 2023-12-15 010221

Hasil Pengujian Load Balancer Nginx

Peak concurrency maksimum (spawn rate 25, rps 60 detik)

WhatsApp Image 2023-12-14 at 4 56 44 PM

-- Peak concurrency maksimum (spawn rate 25, rps 60 detik)

WhatsApp Image 2023-12-13 at 11 13 37 AM

Analisis

Didapatkan RPS yang lebih tinggi ketika menggunakan load balancer buatan kami sendiri menggunakan Nginx. Namun, setelah beberapa kali testing seringkali RPS yang tinggi juga diikuti dengan tingkat failures sebesar 5-9 persen. Apabila dibandingkan dengan Load Balancer dari Digital Ocean, Load Balancer Nginx memiliki potensi untuk menghandle request yang jauh lebih besar dengan harga yang lebih fleksibel, namun tidak lebih konsisten dibandingkan dengan Load Balancer dari Digital Ocean

Hasil Pengujian Setiap Endpoint

  1. Get All Orders WhatsApp Image 2023-12-15 at 12 05 40 AM

  2. Get a Specific Orders by ID WhatsApp Image 2023-12-15 at 12 06 25 AM

  3. Create a New Order WhatsApp Image 2023-12-15 at 12 07 01 AM

  4. Update an Order by ID WhatsApp Image 2023-12-15 at 12 07 33 AM

  5. Delete an Order by ID WhatsApp Image 2023-12-15 at 12 08 04 AM

Hasil Pengujian dan Analisis Loadtesting Locust

Berikut ini merupakan hasil dari 3 rancangan arsitektur kelompok kami

Hasil terbaik didapatkan oleh rancangan arsitektur pertama yaitu

Berikut ini adalah hasil screenshot dari testing arsitektur pertama

  1. Endpoint /order
  • RPS Maksimum (load testing 60 detik)
  • Peak Concurrency Maksimum (spawn rate 25, load testing 60 detik)

  • Peak Concurrency Maksimum (spawn rate 50, load testing 60 detik)

  • Peak Concurrency Maksimum (spawn rate 100, load testing 60 detik)

Kesimpulan dan Saran

  • Setelah melakukan perbandingan harga digital ocean dan azure, harga untuk digital ocean lebih murah
  • Setelah percobaan yang kami lakukan berulang kali dengan menggunakan 3 topologi yang berbeda, kita mendapat kesimpulan:

a.) Topologi 1 menggunakan worker yang spesifikasinya sangat tinggi sehingga dapat menangani request user yang banyak

b.) Topologi 2 menggunakan load balancer custom dapat mudah untuk melakukan config yang dimana dapat meningkatkan performa rps, tetapi dari kelompok kami mendapat kendala kurangnya config untuk menghilangkan cache atau meningkatkan performa pada load balancer sehingga dari uji coba kelompok kami mendapat banyak failure ketika Concurrency tinggi walaupun rps terbilang cukup bagus

c.) Topologi 3 menggunakan load balancer milik vendor digital ocean lebih mudah untuk digunakan tetapi sulit untuk meningkatkan performa karena tidak dapat diconfig melalui ssh, dan juga jika ingin meningkatkan performa kita perlu mengeluarkan biaya tambahan. Untuk hasil uji coba kita mendapatkan rps yang lebih stabil dan mendapat 0 failure untuk keseluruhan percobaan (1000-2000 Concurrency)

Kesimpulan Dilihat dari data yang didapat, jika dilihat dari performa untuk yang lebih baik adalah topologi 1, tetapi jika dilihat dari environment yang lebih sehat, stabil, dan pada umumnya digunakan adalah topologi 3

Saran jumlah load balancer sebaiknya sama dengan jumlah worker karena ketika kami mencoba menggunakan 1 load balancer dan 3 worker terjadi down pada ketiga worker tersebut down

About

Kelas C - Kelompok 5 - Final Project Cloud Computing

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published