Advertisement

Responsive Advertisement

Load Balancer dengan docker dan nginx

Apa yang Terjadi Saat Website Kelebihan Traffic? Solusinya: Load Balancer!

Bayangkan, kamu sedang asyik berselancar di internet, tiba-tiba sebuah situs web yang ingin kamu akses menjadi sangat lambat atau bahkan tidak bisa diakses sama sekali. Situasi seperti ini sering terjadi ketika sebuah situs mengalami lonjakan traffic yang melebihi kapasitas servernya. Akibatnya, pengalaman pengguna menjadi buruk, dan banyak dari mereka akan beralih ke layanan lain yang lebih responsif. Tidak hanya pengguna yang dirugikan, tetapi pemilik situs web juga kehilangan kepercayaan dan pendapatan.

Nah, untuk mengatasi masalah ini, ada sebuah solusi yang bernama Load Balancer.

Apa Itu Load Balancer?

Load balancer adalah sebuah teknologi penting dalam infrastruktur jaringan yang bertugas untuk mendistribusikan beban kerja secara merata di antara beberapa server. Dengan adanya load balancer, arus lalu lintas jaringan dapat dikelola dengan baik sehingga memastikan website tetap responsif, meskipun sedang mengalami lonjakan traffic yang besar. Load balancer juga berperan dalam menjaga keamanan dan stabilitas sistem, memastikan bahwa layanan selalu tersedia dan berjalan lancar.

Bagaimana Load Balancer Bekerja?

Load balancer bekerja dengan cara membagi beban kerja (misalnya, permintaan akses ke sebuah situs web) ke beberapa server yang tersedia. Jadi, ketika kamu mengirimkan permintaan ke sebuah server, dan server tersebut sedang sibuk atau bahkan down, load balancer akan mengarahkan permintaanmu ke server lain yang masih tersedia. Dengan begitu, pengguna tetap mendapatkan pengalaman yang baik tanpa gangguan, dan situs web tetap online tanpa downtime.

Ini mirip seperti ketika kamu berada di sebuah pusat perbelanjaan yang ramai. Jika satu kasir penuh dengan antrean, kamu bisa pindah ke kasir lain yang lebih kosong. Dalam konteks situs web, load balancer adalah "kasir" yang secara otomatis mengarahkan kamu ke "loket" yang paling cepat.

Kapan Load Balancer Digunakan?

Load balancer banyak digunakan oleh layanan yang harus selalu online dan melayani jumlah pengguna yang besar, seperti e-commerce, layanan streaming, dan aplikasi berbasis cloud. Dengan menggunakan load balancer, layanan ini dapat memastikan bahwa mereka tetap berjalan lancar, cepat, dan aman, bahkan di bawah tekanan traffic yang tinggi.



Ada tiga jenis utama load balancer yang perlu kamu ketahui, masing-masing dengan keunggulan dan cara kerjanya sendiri.

1. Hardware Load Balancer

Hardware Load Balancer adalah perangkat fisik yang biasanya dipasang bersamaan dengan server yang tersedia. Perangkat ini bertugas untuk membagi beban kerja antara server yang aktif dan server yang siaga (standby), memastikan bahwa jika satu server mengalami kelebihan beban atau masalah, server lain dapat mengambil alih tugas tersebut. Hardware load balancer sering digunakan dalam infrastruktur skala besar di mana stabilitas dan performa tinggi sangat diperlukan.

2. Software Load Balancer

Software Load Balancer adalah aplikasi yang disediakan oleh penyedia layanan dan diinstal secara digital saat mengkonfigurasi server. Terdapat dua jenis software load balancer:

  • Komersial: Jenis ini mudah digunakan dan banyak diadopsi oleh berbagai perusahaan karena kemudahan integrasinya.
  • Open Source: Jenis ini lebih fleksibel dan dapat dikustomisasi sesuai kebutuhan spesifik, membuatnya ideal bagi pengguna yang membutuhkan kontrol lebih besar atas infrastruktur mereka.

Software load balancer sering dipilih karena kepraktisannya dan fleksibilitas dalam menyesuaikan dengan berbagai kebutuhan sistem.

3. Virtual Load Balancer

Virtual Load Balancer adalah gabungan dari hardware dan software load balancer. Ini sering ditawarkan sebagai layanan bundling oleh penyedia cloud dan sangat berguna sebagai solusi cadangan (backup) ketika hardware atau software load balancer mengalami masalah. Virtual load balancer dapat terintegrasi dengan baik ke dalam infrastruktur cloud, menawarkan keandalan dan skalabilitas yang dibutuhkan oleh aplikasi modern.




Case Diagram




Pada diagram ini, kita dapat melihat bagaimana masalah overload traffic pada server terjadi dan solusi yang dapat diterapkan menggunakan load balancer. Dengan menggunakan load balancer, kita dapat membagi traffic yang masuk ke website secara merata ke beberapa server, sehingga mencegah server dari kelebihan beban. Dalam contoh ini, saya menggunakan load balancer untuk mengelola traffic dan menghubungkan empat server secara efisien.

Solusi dengan Load Balancer:

  1. Distribusi Traffic: Load balancer akan mendistribusikan beban kerja yang masuk ke empat server yang terhubung, memastikan tidak ada satu server pun yang kelebihan beban.
  2. Failover Management: Jika salah satu server down atau tidak tersedia, load balancer akan mengarahkan traffic ke server lain yang masih berfungsi.
  3. Scalability: Dengan menambah server baru ke dalam jaringan, load balancer dapat dengan mudah menyesuaikan kapasitas tanpa mengganggu layanan yang sedang berjalan.

Struktur Direktori:

Untuk mengatur file dan konfigurasi dalam proyek ini, kita bisa menyusun struktur direktori seperti berikut:

loadbalancer/
├── docker-compose.yml
├── load_balancer/
│   └── nginx.conf
├── server1/
│   └── index.php
├── server2/
│   └── index.php
├── server3/
│   └── index.php
├── server4/
    └── index.php
 atau jika mulai dari awal kita coba buat struktur directori nya dengan 

mkdir my-load-balancer-app
cd my-load-balancer-app
mkdir load_balancer server1 server2 server3 server4


lalu di setiap server kita isi file php nya untuk menampilkan alamat ip 

<?php
$server_ip = $_SERVER['SERVER_ADDR'];
echo "Dimuat dari IP: $server_ip";
?>
//pada code ini 
File ini hanya menampilkan IP server yang melayani permintaan.

atau kita bisa menambahkan html nya agar kita bisa melihat log ip yang di refresh dan masuk di traffic sebanyak berapa kali 

kita juga bisa mengcustom bentuk htmlnya dan melihat log ip yang tersedia 
 
<?php
session_start();

$server_ip = $_SERVER['SERVER_ADDR'];
if (!isset($_SESSION['visited_ips'])) {
    $_SESSION['visited_ips'] = [];
}
$_SESSION['visited_ips'][] = $server_ip;
?>

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Server Info</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f0f4f8;
            color: #333;
            text-align: center;
            padding: 20px;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            background-color: #fff;
            border-radius: 8px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }
        h1 {
            color: #007BFF;
        }
        .ip-list {
            margin-top: 20px;
            padding: 0;
            list-style-type: none;
        }
        .ip-list li {
            padding: 10px;
            border-bottom: 1px solid #eee;
        }
        .ip-list li:last-child {
            border-bottom: none;
        }
        .footer {
            margin-top: 30px;
            font-size: 0.9em;
            color: #777;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Server Information</h1>
        <P>Server 4 oi</P>
        <p>Dimuat dari IP: <strong><?php echo htmlspecialchars($server_ip); ?></strong></p>
        <p>IP yang pernah diakses:</p>
        <ul class="ip-list">
            <?php foreach ($_SESSION['visited_ips'] as $ip): ?>
                <li><?php echo htmlspecialchars($ip); ?></li>
            <?php endforeach; ?>
        </ul>
        <div class="footer">
        </div>
    </div>
</body>
</html>




lalu senajutnya kita configi untuk docker compose nya
Buat file docker-compose.yml di direktori root proyek: 
version: '3.8'

services:
  load_balancer:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./load_balancer/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - my-network

  server1:
    image: php:7.4-apache
    volumes:
      - ./server1:/var/www/html
    networks:
      - my-network

  server2:
    image: php:7.4-apache
    volumes:
      - ./server2:/var/www/html
    networks:
      - my-network

  server3:
    image: php:7.4-apache
    volumes:
      - ./server3:/var/www/html
    networks:
      - my-network

  server4:
    image: php:7.4-apache
    volumes:
      - ./server4:/var/www/html
    networks:
      - my-network

networks:
  my-network:
    driver: bridge



dari docker compose tersebut kita akan membuat 4 server dan i load balancer dalam i images load balancer 
dan untuk menjalankanya kita hanya menggunakan iperintah docker compose up -d 
kita kan menginstal environtment yang disediakan oelh docker dan akan berjalan 4 server dan load balancernya

kita juga  config dockerfile nya dengan 

# server1/Dockerfile
FROM php:7.4-apache

COPY ./index.php /var/www/html/index.php

EXPOSE 80


dan untuk load balancer nya kita buat file nginx.conf di dalam direktori load_balancer/:

events {}

http {
    upstream backend_servers {
        server server1:80;
        server server2:80;
        server server3:80;
        server server4:80;
    }

    server {
        listen 80;

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

//Konfigurasi ini mengarahkan semua permintaan yang masuk ke salah satu dari empat server secara acak.

untuk menjalankanya kita juga bisa menggunakan command 

docker-compose up -d

maka semua requirement nya kaan terbentuk dan berjalan dan untuk memberhentikan bisa dengan comand

docker compose stop

untuk menmulai lagi dengan perintah 

docker compose start 

untuk menghapus 

docker compose down 

untuk melihat project yang berjalan 

docker ps 

untuk memerikasa log
 
docker-compose logs

untuk mengakses kita pergi ke berowserr dan akses http://localhost:8080 untuk melihat konten dari server yang berbeda dimuat secara acak. Setiap kali Anda memuat ulang halaman, Anda akan melihat IP server yang berbeda dari mana konten dimuat.

  • Load Balancer (Nginx) mendistribusikan permintaan ke empat server PHP.
  • Server 1 - Server 4 masing-masing menjalankan konten yang sama dan menampilkan IP mereka.
  • Docker Compose digunakan untuk mengatur dan menjalankan semua container.
  • Setiap kali halaman dimuat, IP server yang melayani permintaan ditampilkan, dan dapat disimpan ke dalam array PHP untuk ditampilkan kembali.



  • Pengujian traffic dan server yang mati

    jika kita ingin meguji dengan tarffict yang masuk kita bisa mengujikan dengan script melalui pithon, php, shell atau yang lain 

    dalam case ini saya mengujiknya dengan powersheel yang berjalan dan dapat mengirim tarffict requesta yang diinginkan 
    kita buat file dengan nama send_traffic.ps1

    # URL server yang akan dikirimkan permintaan
    $url = "http://localhost:8080/"  # Ganti dengan URL atau IP server Anda

    # Jumlah permintaan yang akan dikirim
    $requestCount = 50  # Jumlah permintaan

    # Interval waktu antar permintaan (dalam detik)
    $interval = 1  # Menunggu 1 detik

    # Kirim permintaan secara berulang
    for ($i = 1; $i -le $requestCount; $i++) {
        try {
            $response = Invoke-WebRequest -Uri $url -UseBasicP

            if ($response.StatusCode -eq 200) {
                Write-Output "Permintaan ke $url berhasil"
            } else {
                Write-Output "Permintaan ke $url gagal dengan status kode $($response.StatusCode)"
            }
        } catch {
            Write-Output "Permintaan ke $url gagal dengan error: $_"
        }

        # Menunggu sebelum mengirim permintaan berikutnya
        Start-Sleep -Seconds $interval
    }


    untuk menjalankan dengan command 
    .\send_traffic.ps1

    maka akan mengirim request ke server docker yang berjalan 





    disini kita bisa melihat log yang berjalan dan tarffing nya berhasil mengirim ke server dockernya






    Dalam proyek Docker ini, Docker network dan image webserver berperan penting dalam mengatur komunikasi antar container dan menjalankan server web. Mari kita bahas lebih detail tentang masing-masing:

    1. Docker Network

    Docker network digunakan untuk menghubungkan container sehingga mereka bisa berkomunikasi satu sama lain. Dalam file docker-compose.yml yang telah kita buat, terdapat definisi jaringan:

    networks:
      my-network:
        driver: bridge

  • networks:: Bagian ini mendefinisikan jaringan Docker yang digunakan dalam proyek.
  • my-network:: Nama jaringan yang dibuat. Anda dapat memilih nama lain sesuai kebutuhan.
  • driver: bridge: Driver jaringan yang digunakan. Driver bridge adalah driver default untuk jaringan di Docker yang menghubungkan container di satu host.
  • 2. Image Webserver

    Image webserver merujuk pada image Docker yang digunakan untuk menjalankan server web. Dalam proyek ini, kita menggunakan dua jenis image:

    • Nginx: Untuk load balancer.
    • PHP-Apache: Untuk server web yang menjalankan file PHP.

    Image Nginx

    • Image: nginx:latest

    • Digunakan untuk load balancer yang menjalankan konfigurasi Nginx.

    • Didefinisikan dalam docker-compose.yml di bagian load_balancer:

    load_balancer:
      image: nginx:latest
      ports:
        - "8080:80"
      volumes:
        - ./load_balancer/nginx.conf:/etc/nginx/nginx.conf
      networks:
        - my-network
  • Image PHP-Apache
    • Image: php:7.4-apache

    • Digunakan untuk server web yang menjalankan PHP.

    • Didefinisikan dalam docker-compose.yml di bagian server1, server2, server3, dan server4 dengan opsi build:


        server1:
      build:
        context: ./server1
      networks:
        - my-network
  • build:: Menggunakan Dockerfile yang ada di direktori ./server1 untuk membangun image.


  • Docker Network: Jaringan my-network didefinisikan dalam docker-compose.yml untuk memastikan bahwa semua container (load balancer dan server) dapat berkomunikasi satu sama lain.

  • Image Webserver:

    • Nginx: Menggunakan image nginx:latest untuk load balancer. Konfigurasi Nginx di nginx.conf memungkinkan load balancer mendistribusikan permintaan ke server.
    • PHP-Apache: Menggunakan image php:7.4-apache untuk setiap server web. Dockerfile di masing-masing server (server1, server2, server3, server4) mengatur bagaimana server PHP diatur dan dijalankan.

      Cara Kerja Load Balancer

      1. Dapatkan Permintaan Klien: Load balancer mendengarkan permintaan pada port 80 dan menerima semua permintaan dari klien yang masuk ke port 8080 di host.

      2. Distribusi Permintaan: Berdasarkan konfigurasi dalam nginx.conf, Nginx mendistribusikan permintaan ke server backend (server1, server2, server3, server4) secara bergantian.

      3. Tanggapan dari Server: Server yang menerima permintaan akan memprosesnya dan mengirimkan tanggapan kembali ke Nginx.

      4. Kirim Tanggapan ke Klien: Nginx mengirimkan tanggapan yang diterima dari server backend ke klien.

  • Post a Comment

    1 Comments