Showing posts with label load balancer. Show all posts
Showing posts with label load balancer. Show all posts

Friday, December 14, 2018

Create Client Load Balancing with Spring Boot

Halo sobat nostra,
Kali ini saya akan menjelaskan bagaimana cara create client load balancing dengan spring boot

Nah, apa itu load balancing?
Apa sih gunanya load balancing?
Load balancing merupakan teknik yang digunakan untuk mendistribusikan beban trafik pada dua atau lebih jalur koneksi secara seimbang, dimana gunanya agar trafik dapat berjalan secara optimal,  memaksimalkan throughput serta menghindari overload pada salah satu jalur koneksi.

Untuk memulai, pertama kita create 2 project Spring Boot
  • Spring Boot untuk simple restfull service, untuk project ini akan kita jalankan pada port 8090, 8091, dan 8092 (localhost:8090, localhost:8091, localhost:8092)
  • Spring Boot untuk load Balancing yaitu Ribbon Client, dan untuk project ini di jalankan pada port 8080 (localhost:8080)
  1. Create Spring Boot Project for Simple Restfull Service
    Tambah code berikut pada pom.xml
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    Kemudian buat controller untuk request mapping
    package drools.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class WebController {
        @Value("${server.port}")
        String port;
    
        @RequestMapping(value = "/")
        public String home() {
             return "Hello!";    }
    
        @RequestMapping("/greeting")
        public String hello() {
             return "Hello from a service running at port: " + port + "!";
        }
    }
  2. Create Spring Boot Project for Ribbon Client
    Tambah code berikut pada pom.xml
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    Konfigurasi ribbon client pada file application.yaml
    spring:
        application:
            name: Ribbon-Client
    
    helloworld:
        ribbon:
            eureka:
                enabled: false
            listOfServers: localhost:8090,localhost:8091,localhost:8092
            ServerListRefreshInterval: 1000
    
    server:
        port: 8080
    listOfServer merupakan list server untuk load balancing,
    ServerListRefreshInterval merupakan waktu interval. interval yang digunakan untuk refresh ribbon service

    Kemudian create satu class Configuration. config.java
    package drools.config;
    
    import com.netflix.loadbalancer.AvailabilityFilteringRule;
    import com.netflix.loadbalancer.IPing;
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.PingUrl;
    import org.springframework.beans.factory.annotation.Autowired;
    import com.netflix.client.config.IClientConfig;
    import org.springframework.context.annotation.Bean;
    
    public class config {
        @Autowired
        IClientConfig ribbonClientConfig;
    
        @Bean
        public IPing ribbonPing(IClientConfig config) {
            return new PingUrl();
        }
    
        @Bean
        public IRule ribbonRule(IClientConfig config) {
            return new AvailabilityFilteringRule();
        }
    }
    IClientConfig digunakan untuk menyimpan semua konfigurasi client yang kita define dalam code
    IPing merupakan komponen yang menentukan mekanisme yang kita gunakan untuk menentukan ketersediaan server secara real-time, memeriksa server apakah masih hidup
    IRule merupakan komponen logic yang menentukan aturan load balancing yang kita gunakan dalam spring boot. Dalam project ini kita menggunakan AvailabilityFilteringRule, dimana dalam aturan ini akan memilih server yang available atau yang tersedia.

    Create sebuah load balancing controller WebController.java
    package drools.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class WebController {
        @LoadBalanced
        @Bean
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        @Autowired
        RestTemplate restTemplate;
    
        @RequestMapping("/helloworld")
        public String home() {
             return this.restTemplate.getForObject("http://helloworld/greeting", 
                 String.class);
        }
    }
    Dalam controller diatas, digunakan anotasi @LoadBalanced untuk konfigurasi restTemplate sebagai LoadBalancerClient.
  3. Run and check results
  • Run Restfull Service pada port 8090, 8091, 8092
    mvn spring-boot:run -Dserver.port=8090
         mvn spring-boot:run -Dserver.port=8091
        mvn spring-boot:run -Dserver.port=8092

  • Kemudian run Ribbon Client
    mvn spring-boot:run
        dan jalankan http://localhost:8080/helloworld pada browser atau postman, dan kita akan   menerima output dari service 8090, 8091, 8092


dan log akan seperti gambar diatas jika kita menjalankan service ribbon client

Jika kita mematikan salah satu service pada restfull service maka kita akan menemukan connection refused pada log ribbon client.
Namun demikian, ribbon client akan tetap berjalan dari service yang masih hidup.
Dan Jika kita mematikan semua service, kita akan menemukan pada log no up servers available

Oke, sekian penjelasan saya, semoga bermanfaat
Terima kasih




Sunday, June 9, 2013

Load Balancing dengan Zen Load Balancer


Zen Load Balancer (ZenLB) merupakan sebuah load balancer yang bersifat open source. Ada cukup banyak pilihan open source load balancer lainnya seperti HAProxyBalanceNGCrossroads, Apache HTTP Server, dsb. Namun perbedaan utama yang saya perhatikan adalah ZenLB merupakan sebuah appliance berbasis Debian. Seperti yang bisa diharapkan dari sebuah software appliance, konfigurasi yang perlu dilakukan minimal untuk dapat segera up-and-running. Selain itu tampilan Web management-nya juga menarik dan sangat informatif. Dua alasan itulah yang membuat saya ingin mencoba ZenLB ketika saya membutuhkan komponen load balancer pada simulasi high availability yang sedang saya lakukan beberapa minggu ini. Saya akan melakukan instalasi ZenLB menggunakan Oracle VM VirtualBox, hypervisor type-2 favorit saya. :)

Download ZenLB CD ISO image dari sini, kemudian buatlah sebuah virtual machine bertipe Linux Debian 32-bit. Letakkan CD ISO ZenLB yang sudah selesai di-download sebagai boot CD dari virtual machine tersebut dan jangan lupa untuk mengkonfigurasi network adapter-nya. Berhubung saya sedang terhubung dengan jaringan Wi-Fi, maka saya pilih "Bridged Adapter". Oh iya, sedikit tips untuk meningkatkan kinerja virtual machine di Oracle VM VirtualBox adalah agar memilih "User host I/O cache" pada SATA storage controller dan memilih "Paravirtualized Network (virtio-net)" pada tipe adapter jaringan jika menjalankan virtual machine bertipe Linux. Langkah-langkah yang saya lakukan ketika instalasi ZenLB dapat dilihat detilnya di sini. Restart virtual machine untuk menyelesaikan instalasi.

Ketika ZenLB sudah up kembali, akses ZenLB Web management ke https://<ZenLB_IP>:444 dengan menggunakan username "admin" dan password "admin" yang merupakan konfigurasi default-nya. Segera ubah password default ke menu Settings -> Change Password. Pada menu tersebut juga terdapat pilihan untuk sinkronisasi password dengan password root Debian yang kita masukkan ketika melakukan instalasi. Jika telah berhasil mengubah password, lakukan login kembali dengan password yang baru.
Zen Load Balancer dashboard

Pada dashboard utama Zen Load Balancer kita dapat memonitor secara penggunaan memory ZenLB, load cycle prosesor, dan network traffic dari network interface yang terdaftar di ZenLB. Pada bagian atas dashboard terdapat informasi global farms. Pada ZenLB, sebuah global farm adalah sebuah profil  load balancer atau rules configuration. Sebagai contoh saya akan mengkonfigurasi load balancer virtual name oid.nostratech.com (IP: 11.22.33.251) di port 389 sebagai front-end dari cluster Oracle Internet Directory (OID) yang terdiri dari oid1.nostratech.com dan oid2.nostratech.com.

Pertama-tama kita perlu membuat Virtual IP (VIP) terlebih dahulu untuk VIP 11.22.33.251, yaitu dengan cara memilih menu Settings -> Interfaces. Kemudian pilih "Add virtual network interface" pada eth0. Masukkan IP 11.22.33.251 pada interface eth0:1, kemudian pilih simpan untuk membuat virtual network interface tersebut.
Membuat virtual network interface eth0:1
Pilih menu Manage -> Farms untuk membuat global farm yang bernama oid.nostratech.com dengan IP 11.22.33.251 di port 389. Simpan konfigurasi tersebut kemudian pilih Edit Farm untuk melakukan konfigurasi lebih jauh terhadap farm tersebut.
Membuat farm oid.nostratech.com dengan VIP baru
Pada halaman edit farm kita dapat mengubah algoritma load balancing yang berlaku untuk sebuah farm. Ada 4 jenis algoritma yang di-support ZenLB, yaitu:

  1. Round Robin: untuk setiap koneksi yang diterima oleh ZenLB akan diteruskan secara rata ke backend server yang terdaftar di dalam global farm.
  2. Hash: untuk setiap koneksi yang diterima oleh ZenLB akan diteruskan kepada backend server yang sama sesuai dengan hasil kalkukasi hash terhadap IP address dari client.
  3. Weight: setiap backend server yang terdaftar diberikan bobot kerja, sehingga koneksi yang diterima oleh ZenLB akan diteruskan ke backend server sesuai dengan bobot kerjanya.
  4. Priority: masing-masing backend server diberikan skala prioritas, setiap koneksi yang diterima oleh ZenLB akan diteruskan ke backend server dengan skala prioritas tertinggi. Jika backend server tersebut down, maka koneksi yang diterima akan diteruskan ke backend server dengan skala prioritas tertinggi selanjutnya.

Pada bagian bawah halaman edit farm, terdapat konfigurasi Farm Guardian. Farm Guardian merupakan mekanisme ZenLB untuk melakukan verifikasi terhadap service backend server. Apabila hasil pengujian gagal, maka backend server tersebut diasumsikan dalam status down, sehingga ZenLB dapat meneruskan koneksi ke backend server yang tersisa. Sebagai contoh, kita dapat mengkonfigurasi Farm Guardian untuk memeriksa HTTP service dari backend server dengan menggunakan perintah "check_http". ZenLB telah menyediakan 5 buah script untuk Farm Guardian, yaitu "check_http", "check_ldap", "check_smtp", "check_tcp", dan "check_uplink". Pada dasarnya sebuah backend service akan diasumsikan down oleh Farm Guardian jika return value dari script yang dijalankan adalah selain 0. Sehingga kita juga dapat menggunakan custom script untuk verifikasi Farm Guardian.
Daftar backend service dari farm oid.nostratech.com:389 

Di bawah konfigurasi Farm Guardian, terdapat tabel daftar backend server dari sebuah farm. Isilah tabel tersebut dengan 2 hostname pada contoh sebelumnya, yaitu oid1.nostratech.com dengan port 389 dan oid2.nostratech.com pada port yang sama.
Backend status untuk farm oid.nostratech.com:389
Konfigurasi telah selesai, kita dapat melihat status dari backend service dengan memilih "View oid.nostratech.com backends status" pada kolom "Actions" dari tabel Farms table. Pada tabel status tersebut di atas, terlihat kedua status dari backend service oid1.nostratech.com:389 dan oid2.nostratech.com:389 berada pada status hijau yang berarti sedang up. Pada kesempatan berikutnya saya akan menggunakan ZenLB ini untuk mensimulasikan konfigurasi high availability pada Oracle Identity Management 11gR1.