{"id":1334,"date":"2026-05-25T18:00:50","date_gmt":"2026-05-25T11:00:50","guid":{"rendered":"https:\/\/www.jakhoster.com\/blog\/arsitektur-penjelasan-linux-high-availability-ubuntu\/"},"modified":"2026-05-25T20:01:53","modified_gmt":"2026-05-25T13:01:53","slug":"arsitektur-penjelasan-linux-high-availability-ubuntu","status":"publish","type":"post","link":"https:\/\/www.jakhoster.com\/blog\/arsitektur-penjelasan-linux-high-availability-ubuntu\/","title":{"rendered":"Arsitektur High-Availability dengan Ubuntu Server"},"content":{"rendered":"<h2>Dalam Dunia Nyata: Kasus Server High-Availability<\/h2>\n<p>Kami sedang menghadapi tantangan serius di lingkungan produksi kami. Sebuah aplikasi web yang kami host di beberapa server Ubuntu mengalami lonjakan traffic yang tidak terduga, menyebabkan downtime dan mengganggu layanan pelanggan. Dengan kecepatan bisnis yang semakin cepat, kami ingin memastikan bahwa infrastruktur kami tidak hanya dapat menangani beban saat ini, tetapi juga siap untuk pertumbuhan di masa depan. Di sinilah penjelasan Linux berperan, membantu kami membangun arsitektur yang tahan banting dan dapat diandalkan.<\/p>\n<h2>Memilih Distro dan Menyiapkan Lingkungan<\/h2>\n<p>Pertama-tama, kami memilih <strong>Ubuntu Server<\/strong> karena stabilitas dan kemudahan pengelolaannya. Untuk langkah awal, kita mulai dengan membuat beberapa VM di cloud server menggunakan <strong>VirtualBox<\/strong> atau <strong>AWS EC2<\/strong>. Mari kita lihat perintah dasar yang diperlukan:<\/p>\n<pre><code>sudo apt update &amp;&amp; sudo apt upgrade -y<\/code><\/pre>\n<p>Perintah ini memperbarui daftar paket dan mengupgrade semua paket yang terinstal. Penggunaan <code>-y<\/code> di akhir perintah memungkinkan kami melewatkan konfirmasi manual agar pembaruan berjalan otomatis, penting dalam operasi skala besar.<\/p>\n<h2>Arsitektur High-Availability Menggunakan Docker<\/h2>\n<p>Untuk memastikan ketersediaan tinggi, kami memutuskan untuk menggunakan <strong>Docker<\/strong> sebagai bagian dari pendekatan containerization kami. Dengan pendekatan ini, kami dapat dengan mudah mengatur beberapa kontainer untuk melayani permintaan pengguna. <\/p>\n<pre><code>version: '3'\nservices:\n  web:\n    image: nginx\n    ports:\n      - '80:80'\n  app:\n    image: my_php_app\n    depends_on:\n      - db\n  db:\n    image: mariadb\n    environment:\n      MYSQL_ROOT_PASSWORD: example<\/code><\/pre>\n<p>File ini mendefinisikan tiga layanan: <code>web<\/code>, <code>app<\/code>, dan <code>db<\/code>. Dengan <code>depends_on<\/code>, kami memastikan bahwa kontainer database kami siap sebelum aplikasi web mencoba terhubung. Aspek penting dari Docker adalah kemudahan scaling; jika traffic meningkat, kita cukup menambah jumlah replika dari kontainer web dengan perintah:<\/p>\n<pre><code>docker-compose up --scale web=3<\/code><\/pre>\n<p>Ini akan membuat tiga instansi dari layanan web kami, yang sangat penting untuk memastikan aplikasi kami dapat menampung lonjakan pengguna.<\/p>\n<p> Implementasi dari Docker dalam arsitektur high-availability ini berjalan seiring dengan prinsip-prinsip yang diterapkan dalam <a href=\"https:\/\/www.jakhoster.com\/blog\/apache-nginx-linux-infrastruktur-website-modern\/\" target=\"_blank\" rel=\"noopener\">Apache Nginx Linux dalam Website Modern<\/a>, di mana keandalan dan skalabilitas menjadi kunci utama dalam memberikan pengalaman yang optimal bagi pengguna. <\/p>\n<h2>Pengaturan Load Balancer dengan Nginx<\/h2>\n<p>Sekarang, setelah kami memiliki beberapa kontainer, kami perlu mengatur <strong>load balancer<\/strong> untuk mendistribusikan traffic secara merata. Kami menggunakan Nginx sebagai reverse proxy. <\/p>\n<pre><code>http {\n    upstream app {\n        server app1:80;\n        server app2:80;\n        server app3:80;\n    }\n    server {\n        listen 80;\n        location \/ {\n            proxy_pass http:\/\/app;\n        }\n    }\n}<\/code><\/pre>\n<p>Di sini, <code>upstream<\/code> mendefinisikan grup server yang akan menerima traffic. Konfigurasi <code>proxy_pass<\/code> mengarahkan semua permintaan ke grup server aplikasi kita. Dengan cara ini, jika satu kontainer aplikasi gagal, Nginx dapat mengalihkan traffic ke kontainer lain yang aktif, membantu menjaga uptime.<\/p>\n<h2>Keamanan: Hardening Server dan Mengatasi Serangan Brute Force<\/h2>\n<p>Kemudian, kita harus mempertimbangkan aspek keamanan. Menurut <em>OWASP<\/em>, serangan berbasis brute force adalah salah satu ancaman yang paling umum. Kami menggunakan <strong>fail2ban<\/strong> untuk memblokir alamat IP yang mencurigakan. <\/p>\n<pre><code>sudo apt install fail2ban<\/code><\/pre>\n<p>Setelah penginstalan selesai, kita perlu membuat salinan file konfigurasi default:<\/p>\n<pre><code>sudo cp \/etc\/fail2ban\/jail.conf \/etc\/fail2ban\/jail.local<\/code><\/pre>\n<p>File <code>jail.local<\/code> memungkinkan kita untuk menyesuaikan pengaturan. Mari kita edit file ini dan tambahkan konfigurasi dasar:<\/p>\n<pre><code>[sshd]\nenabled = true\nmaxretry = 3\nbantime = 86400<\/code><\/pre>\n<p>Kita menjelaskan beberapa parameter di sini: <code>maxretry<\/code> menunjukkan jumlah percobaan gagal sebelum IP diblokir, dan <code>bantime<\/code> menentukan berapa lama (dalam detik) IP tersebut akan diblokir. Dengan konfigurasi ini, setiap kali seorang penyerang melakukan lebih dari tiga percobaan login yang gagal, mereka akan diblokir selama satu hari.<\/p>\n<h2>Monitoring dan Troubleshooting: Metrik Kinerja<\/h2>\n<p>Setelah arsitektur kami terpasang, monitoring menjadi kunci untuk memastikan performa optimal. Kami menggunakan <strong>Prometheus<\/strong> dan <strong>Grafana<\/strong> untuk memantau metrik kinerja \u2014 memudahkan kami dalam mengidentifikasi bottleneck. Mari kita tambahkan <code>node_exporter<\/code> untuk mengumpulkan data dari server:<\/p>\n<pre><code>sudo apt install prometheus-node-exporter<\/code><\/pre>\n<p>Setelah terinstal, kami perlu mengonfigurasikan Prometheus untuk menarik metrik dari <code>node_exporter<\/code>. Kita akan menambahkan server ke dalam file <code>prometheus.yml<\/code>:<\/p>\n<pre><code>scrape_configs:\n  - job_name: 'node'\n    static_configs:\n      - targets: ['localhost:9100']<\/code><\/pre>\n<p>Metrik kinerja seperti CPU usage, memori, dan disk I\/O akan membantu kami dalam troubleshooting. Saat terjadi lonjakan traffic, kami dapat segera mengetahui server mana yang mengalami beban berlebih dan melakukan tindakan cepat dengan menambah kapasitas atau memindahkan traffic.<\/p>\n<h2>Backup dan Restore: Praktik Terbaik<\/h2>\n<p>Akhirnya, tidak ada yang lebih buruk daripada kehilangan data. Oleh karena itu, kami menetapkan kebijakan backup secara rutin. Kami menggunakan <strong>rsync<\/strong> untuk melakukan backup data secara incremental. <\/p>\n<pre><code>rsync -avz \/path\/to\/source \/path\/to\/destination<\/code><\/pre>\n<p>Dalam perintah ini, <code>-a<\/code> adalah flag untuk archive mode, <code>-v<\/code> memberikan output verbose, dan <code>-z<\/code> mengompresi data selama transfer. Untuk restore, cukup balikkan sumber dan tujuan. Pastikan kita melakukan backup secara terjadwal menggunakan <strong>cron job<\/strong>.<\/p>\n<h2>Kesimpulan<\/h2>\n<p>Dengan pendekatan ini, kami telah berhasil membangun arsitektur Linux yang handal untuk aplikasi kami di server Ubuntu. Dari penggunaan Docker untuk containerization, konfigurasi load balancer dengan Nginx, hingga penerapan praktik keamanan dengan fail2ban, semua aspek krusial untuk high-availability sudah diatur. Pastikan untuk terus memantau metrik performa dan rutin melakukan backup untuk menjaga integritas layanan kami di masa depan.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pelajari cara membangun arsitektur penjelasan Linux yang handal di Ubuntu Server untuk kebutuhan high-availability. Temukan tips keamanan, troubleshooting, dan optimasi.<\/p>\n","protected":false},"author":5,"featured_media":1333,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46],"tags":[],"class_list":["post-1334","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-server"],"_links":{"self":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/posts\/1334","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/comments?post=1334"}],"version-history":[{"count":2,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/posts\/1334\/revisions"}],"predecessor-version":[{"id":1346,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/posts\/1334\/revisions\/1346"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/media\/1333"}],"wp:attachment":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/media?parent=1334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/categories?post=1334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/tags?post=1334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}