{"id":3169,"date":"2018-08-01T17:19:54","date_gmt":"2018-08-01T10:19:54","guid":{"rendered":"http:\/\/binus.ac.id\/knowledge\/?p=3169"},"modified":"2018-08-01T17:19:54","modified_gmt":"2018-08-01T10:19:54","slug":"merancang-infrastruktur-aplikasi-yang-memiliki-high-availability","status":"publish","type":"post","link":"https:\/\/binus.ac.id\/knowledge\/2018\/08\/merancang-infrastruktur-aplikasi-yang-memiliki-high-availability\/","title":{"rendered":"Merancang Infrastruktur Aplikasi yang memiliki High Availability"},"content":{"rendered":"<p>Sebuah aplikasi yang hanya di-<em>deploy<\/em> pada sebuah <em>server<\/em> umumnya akan menimbulkan masalah <em>single point of failure<\/em> apabila <em>server<\/em> tersebut sudah mencapai batas kapasitasnya pada saat penggunaan tinggi. Akibatnya, pengguna tidak akan dapat menggunakan layanan <em>software<\/em> dan akan mengakibatkan kerugian bisnis.<\/p>\n<p>Aplikasi yang baik adalah aplikasi yang memiliki ketersediaan hampir setiap saat (<em>high availability<\/em>), sekalipun tingkat penggunaan yang sangat tinggi atau sibuk. Untuk mencapai ini maka harus dilakukan perancangan yang baik pada sisi <em>software<\/em> dan juga <em>hardware<\/em>. Pada kali ini saya akan menuliskan bagaimana merancang arsitektur <em>server<\/em> yang <em>scalable<\/em> dan memiliki <em>high availability<\/em>.<\/p>\n<p>Pada tulisan ini saya akan membahas penggunaan Nginx (baca: <em>Engine X<\/em>) dan GlusterFS untuk menghasilkan infrastruktur yang memiliki<em> high availability<\/em>. Nginx akan berperan sebagai pintu masuk dan <em>load balancer<\/em> untuk mengatur <em>traffic<\/em> dari setiap pengguna ke beberapa <em>server<\/em> aplikasi. GlusterFS akan berperan dalam melakukan replikasi dan sinkronisasi informasi (misal dokumen pada <em>file system<\/em>) dari beberapa <em>server<\/em> aplikasi tersebut. Proses replikasi <em>file system<\/em> ini akan sangat instan ke seluruh <em>server<\/em> selama <em>network traffic<\/em> juga baik, maka <em>latency<\/em> akan cenderung rendah.<\/p>\n<p>Mengapa perlu melakukan replikasi <em>file system<\/em> ke beberapa <em>application server<\/em>? Mari kita jawab masalah ini melalui contoh kasus. Misalnya terdapat 3 <em>server<\/em> aplikasi yang di-<em>load-balanced<\/em>, ketika seorang pengguna mengunjungi aplikasi dan dilayani oleh <em>server<\/em> aplikasi ke-1, dan terdapat pengunjung lain pada saat yang sama dilayani oleh <em>server<\/em> aplikasi ke-2. Kemudian pengunjung pertama melakukan <em>upload<\/em> dokumen ke <em>server<\/em> aplikasi ke-1 maka pengunjung lain seharusnya juga segera dapat melihat dokumen tersebut pada <em>server<\/em> aplikasi ke-2. Kesimpulannya, pengunjung akan merasa dilayani oleh aplikasi yang sama sekalipun terdapat beberapa <em>server<\/em> di belakangnya.<\/p>\n<p>Infrastruktur<\/p>\n<ul>\n<li><em>Load balancer<\/em>: Nginx<br \/>\n<em>OS<\/em>: Debian 8<\/li>\n<li><em>Application Server<\/em>: GlusterFS, NodeJS<br \/>\n<em>OS<\/em>: Debian 8<br \/>\n<em>Hostname<\/em>: <strong>App1<\/strong><\/li>\n<li><em>Application Server<\/em>: GlusterFS, NodeJS<br \/>\n<em>OS<\/em>: Debian 8<br \/>\n<em>Hostname<\/em>: <strong>App2<\/strong><\/li>\n<li><em>Application Server<\/em>: GlusterFS, NodeJS<br \/>\n<em>OS<\/em>: Debian 8<br \/>\n<em>Hostname<\/em>: <strong>App3<\/strong><\/li>\n<\/ul>\n<p><strong><em>Setup<\/em> Nginx<\/strong><\/p>\n<p>Kali ini saya akan membuat panduan minimal, lengkapnya silakan baca pada <a href=\"http:\/\/nginx.org\/en\/docs\/\" target=\"_blank\" rel=\"noopener\">dokumentasi lengkap<\/a>.<\/p>\n<ol>\n<li>SSH ke <em>server load balancer<\/em><\/li>\n<li>Install Nginx<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo apt-get install nginx<\/pre>\n<ol start=\"3\">\n<li>Buka file konfigurasi Nginx pada <em>directory<\/em> \/etc\/nginx\/nginx.conf<\/li>\n<li>Konfigurasikan sebagai berikut: (sebagai catatan, anda juga dapat menggani <em>hostname<\/em> menjadi <em>IP address<\/em> dan <em>port<\/em> dari <em>application servers<\/em> anda)<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">upstream balancedAppKu {\r\n\r\n   server App1;\r\n\r\n   server App2;\r\n\r\n   server App3;\r\n\r\n}\r\n\r\nserver {\r\n\r\n   location \/balanced-app\/ {\r\n\r\n      proxy_pass http:\/\/balancedAppku\/;\r\n\r\n   }\r\n\r\n}<\/pre>\n<ol start=\"5\">\n<li>Simpan perubahan dan <em>restart<\/em> <em>server<\/em> Nginx<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo nginx -s reload<\/pre>\n<p><strong>Instalasi dan Konfigurasi GlusterFS<\/strong><\/p>\n<p>Lakukan instalasi GlusterFS pada <strong>seluruh<\/strong> <em>application server<\/em>.<\/p>\n<ol>\n<li>SSH pada setiap <em>application server<\/em><\/li>\n<li><em>Install<\/em> GlusterFS (pada contoh ini saya menggunakan Debian)<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo apt-get install glusterfs-server<\/pre>\n<ol start=\"3\">\n<li>Buatlah <em>directory<\/em> untuk menyimpan GlusterFS Brick<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo mkdir -p \/srv\/data\/appku<\/pre>\n<ol start=\"4\">\n<li>Nyalakan layanan GlusterFS<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo \/etc\/init.d\/glusterfs-server start<\/pre>\n<p>Setelah GlusterFS terinstall pada seluruh <em>application server<\/em>, langkah selanjutnya adalah melakukan konfigurasi <em>peer<\/em> antar <em>server<\/em>.<\/p>\n<ol>\n<li>SSH pada salah satu <em>application server<\/em> (contoh: App1)<\/li>\n<li>Konfigurasi <em>peer<\/em> terhadap dua <em>server<\/em> lain<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo gluster peer probe App2\r\nsudo gluster peer probe App3<\/pre>\n<ol start=\"3\">\n<li>Lakukan verifikasi status <em>peer<\/em>, dan lihatlah pesan yang menyatakan bahwa <em>servers<\/em> sudah salihg terhubung (<em>connected<\/em>)<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo gluster peer status<\/pre>\n<ol start=\"4\">\n<li>Membuat GlusterFS <em>volume<\/em> yang dinamakan Appku-vol dengan menggunakan seluruh <em>application server<\/em> sebagai <em>peer<\/em>.<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo gluster volume create Appku-vol replica 3 transport tcp App1:\/srv\/data\/appku App2:\/srv\/data\/appku App3:\/srv\/data\/appku force<\/pre>\n<ol start=\"5\">\n<li>Mulai menjalankan <em>volume<\/em> Appku-vol<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo gluster volume start Appku-vol<\/pre>\n<ol start=\"6\">\n<li>Verifikasi konfigurasi <em>volume<\/em> yang berjalan<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo gluster volume info<\/pre>\n<ol start=\"7\">\n<li>Konfigurasi agar hanya<em> application server<\/em> yang anda perbolehkan untuk dapat melakukan <em>mounting<\/em> pada <em>volume<\/em> GlusterFS<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo gluster volume set Appku-vol auth.allow App1,App2,App3<\/pre>\n<p>Langkah berikutnya adalah melakukan <em>mounting storage<\/em> yang akan direplikasi pada seluruh <em>application server.<\/em> Pada contoh aplikasi NodeJS, saya akan menyimpan file pada <em>directory<\/em> \/home\/app\/uploads (pastikan anda sudah membuat directory tersebut pada ketiga server anda!). Maka saya akan melakukan <em>mounting<\/em> GlusterFS sebagai <em>directory<\/em> tersebut.<\/p>\n<ol>\n<li>Buka fstab<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">sudo nano \/etc\/fstab<\/pre>\n<ol start=\"2\">\n<li>Tambahkan perintah berikut pada fstab pada\u00a0<strong>seluruh<\/strong> <em>server<\/em>. Hal ini akan menyebabkan proses <em>mounting<\/em> akan otomatis terjadi pada saat terjadi <em>restart server<\/em>.<\/li>\n<\/ol>\n<p style=\"padding-left: 60px;\">Pada <em>application server<\/em> <strong>App1<\/strong>:<\/p>\n<pre style=\"padding-left: 60px;\">App1:\/Appku-vol \/home\/app\/uploads glusterfs defaults,_netdev,log-level=WARNING,log-file=\/var\/log\/gluster.log 0 0<\/pre>\n<p style=\"padding-left: 60px;\">Pada<em> application server<\/em> <strong>App2<\/strong>:<\/p>\n<pre style=\"padding-left: 60px;\">App2:\/Appku-vol \/home\/app\/uploads glusterfs defaults,_netdev,log-level=WARNING,log-file=\/var\/log\/gluster.log 0 0<\/pre>\n<p style=\"padding-left: 60px;\">Pada <em>application server<\/em> <strong>App3<\/strong>:<\/p>\n<pre style=\"padding-left: 60px;\">App3:\/Appku-vol \/home\/app\/uploads glusterfs defaults,_netdev,log-level=WARNING,log-file=\/var\/log\/gluster.log 0 0<\/pre>\n<ol start=\"3\">\n<li>Simpan perubahan dan lakukan <em>mounting<\/em> dengan perintah berikut<\/li>\n<\/ol>\n<pre style=\"padding-left: 60px;\">mount -a<\/pre>\n<p>Selamat! saat ini anda sudah bisa mencoba replikasi dokumen pada ketiga <em>server<\/em>. Cobalah membuat satu dokumen pada salah satu <em>server<\/em> pada <em>directory<\/em> \/home\/app\/uploads dan lihatlah hasil replikasinya pada dua <em>server<\/em> yang lain. \u00a0Tentunya anda dapat mengganti <em>volume<\/em> yang direplikasi sesuai dengan kebutuhan anda, misalnya pada \/var\/www\/html.<\/p>\n<p>Demikian <em>sharing<\/em> panduan singkat untuk menghasilkan infrastruktur yang memiliki <em>high availability<\/em> dengan Nginx dan GlusterFS. Panduan ini tentunya masih harus dilengkapi lagi untuk mencapai <em>high availability<\/em>, contohnya baru terdapat 1 load <em>balancer server<\/em> yang akan menjadi <em>single point of failure<\/em>. Silakan mengeksplorasi lebih lanjut untuk mencapai hal ini.<\/p>\n<p>Bacaan lanjutan: <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/what-is-high-availability\">https:\/\/www.digitalocean.com\/community\/tutorials\/what-is-high-availability<\/a><\/p>\n<pre><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Sebuah aplikasi yang hanya di-deploy pada sebuah server umumnya akan menimbulkan masalah single point of failure apabila server tersebut sudah mencapai batas kapasitasnya pada saat penggunaan tinggi. Akibatnya, pengguna tidak akan dapat menggunakan layanan software dan akan mengakibatkan kerugian bisnis. Aplikasi yang baik adalah aplikasi yang memiliki ketersediaan hampir setiap saat (high availability), sekalipun tingkat [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3170,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[83],"tags":[170,179,176,173],"class_list":["post-3169","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-high-availability","tag-load-balance","tag-nginx","tag-server-architecture"],"_links":{"self":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/3169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/comments?post=3169"}],"version-history":[{"count":2,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/3169\/revisions"}],"predecessor-version":[{"id":3175,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/3169\/revisions\/3175"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/media\/3170"}],"wp:attachment":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/media?parent=3169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/categories?post=3169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/tags?post=3169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}