Tuesday, August 16, 2016

Redis : Clustering dan Failover

Redis adalah in-memory data structure store. Redis sangatlah cepat sebenarnya. Biasa digunakan sebagai caching sistem, database atau message queue. Format data redis adalah key-value.
Format data yang didukung antara lain strings, hashes, lists, sets, sorted sets. Perusahaan sekelas twitter pun menggunakan Redis untuk caching system. Yang dapat mengungurangi load ke database atau storage utama lainnya.
Tapi kita tidak akan tentang feature atau penggunaan redis. Kita akan membahas tentang redis clustering dan failover (satu host mati, yang lain akan membackup).
Bagaimana mencluster redis menjadi banyak instance dan mengatasi jika redis master mengalami kegagalan dengan waktu downtime sekecil mungkin (sebisa mungkin zero second downtime).
Istilahnya mungkin High Availability.

Requirement untuk tutorial ini :
- redis 3.0xx (include sentinel)
- HAProxy 1.5xx

Kebanyakan dari kita mungkin awalnya memakai redis dengan cara seperti ini.



Satu atau lebih application server konek ke single redis (satu redis master). sebenarnya tidak masalah karena akses redis sangatlah cepat.
Tapi setelah beberapa saat, setelah jumlah app server yang connect bertambah dan jumlah request dari client naik jug. Maka jumlah koneksi ke redis akan bertambah juga secara signifikan.
Jumlah key bertambah, memory consume naik. Kemungkinan pada suatu saat akan terjadi kegagalan di redis, misal out memory atau disk corrupt. App server juga ikut gagal karen tidak bisa membaca data dari redis.
Maka terjadilah downtime. Downtime disini bukan berarti app server mati, tetapi hanya client tidak bisa mengakses datanya karena kegagalan di redis.
Sehingga perlu dilakukan backup. Bisa menaikan memory di redis instance. Atau bisa jadi malah ganti VM untuk redis. Kemudian copy data yg lama. Proses ini tentu membutuhkan waktu beberapa menit bahkan beberapa jam sampai app server bisa mendapatkan datanya kembali.

Kemudian kita coba cara lain seperti dibawah ini.



Konfigurasi redis.conf 
Start redis : ./redis-server PATH/redis.conf
 #redis-01 
 port 6380  
 bind 192.168.33.10 
 #redis-02  
 bind 6381  
 bind 192.168.33.20  
 slaveof 192.168.33.10 6380  
App server tetep connect ke satu redis master. Tetapi di belakang redis master ada satu atau bisa banyak redis slave.
Ini bisa disebut satu redis custer.
Redis cluser bisa diartikan kumpulan redis yang tugasnya sama biasanya berisi : 1 Master + N x Slave)
Redis Slave tugasnya melakukan syncronization data ke redis master. Redis sifatnya read-only. Lalu apa keuntungannya?
Ketika Redis master mengalami kegagalan (dengan berbagai alasan). Maka kita cukup mempromote salah satu Redis slave
untuk menjadi redis master. App server diganti pointing ke redis master yg baru, dan redis slave uang lain disetting sebagai anggota (slave) dari Redis master yang baru.
Kita tinggal berkonsentrasi untuk perbaikan redis master yang bermasalah lagi. Ketika sudah up bisa di kembalikan ke cluster sebagi master atau slave.
Downtime yang terjadi bisa jauh lebih berkurang karena kita tinggal menganti konfigurasi host redis di app server dan setting master-slave satu-persatu di sisi redis cluster. Kemudian restart semua service.

Apa yang harus kita lakukan untuk mengurangi downtime lagi?
Sekarang kita coba memasang Redis Sentinel. Apa itu Sentinel? (dari redis.io)
"Redis Sentinel provides high availability for Redis. In practical terms this means that using Sentinel you can create a Redis deployment that resists without human intervention to certain kind of failures.
Redis Sentinel also provides other collateral tasks such as monitoring, notifications and acts as a configuration provider for clients.
This is the full list of Sentinel capabilities at a macroscopical level (i.e. the big picture):
Sentinel constantly checks if your master and slave instances are working as expected.
Sentinel can notify the system administrator, another computer programs, via an API, that something is wrong with one of the monitored Redis instances.
Automatic failover. If a master is not working as expected, Sentinel can start a failover process where a slave is promoted to master, the other additional slaves are reconfigured to use the new master, and the applications using the Redis server informed about the new address to use when connecting.
Sentinel acts as a source of authority for clients service discovery: clients connect to Sentinels in order to ask for the address of the current Redis master responsible for a given service. If a failover occurs, Sentinels will report the new address."
Intinya sentinel itu bisa melakukan monitoring ke sebuah redis cluster. Bisa mendekteksi pada saat master mengalami kegagalan. Maka sentinel otomatis akan mempromote salah satu savle menjadi master, dan mereset semua konfigurasi slave untuk pointing ke master yang baru.
dan jika master yang lama sudah hidup kembali. Sentinel akan otomatis mensetting menjdai slave. Begitu seterusnya posesnya jika ada master yang gagal.
Downtime akan jauh lebih berkurang karena konfigurasi master-slave yang baru dihandle oleh Sentinel. Kita cukup mengganti konfigurasi di app server mau connect ke host redis yang mana.

Konfigurasi : sama dengan master-slave sebelumnya kita tambahkan satu mesin lagi yang berfungsi sebagai sentinel (sentinel.conf)

 #sentinel conf  
 port 16380  
 bind 192.168.33.10  
 sentinel monitor redis-cluster 192.168.33.10 6380 1  
 sentinel down-after-milliseconds redis-cluster 5000  
 sentinel failover-timeout redis-cluster 10000  
 sentinel config-epoch redis-cluster 26  
Start sentinel : ./redis-server PATH/sentinel.conf --sentinel
Sentinel akan otomatis mendeteksi redis mana aja yang menjadi anggota dari cluster redis-01 (192.168.33.10)
 #sentinel log  
 1793:X 12 Aug 05:16:55.269 # Sentinel runid is b2e912eedf1416b61ecb8688180c64f00f0e12b6  
 1793:X 12 Aug 05:16:55.269 # +monitor master redis-cluster 192.168.33.10 6380 quorum 1  
 1793:X 12 Aug 05:16:56.269 * +slave slave 192.168.33.20:6381 192.168.33.20 6381 @ redis-cluster 192.168.33.10 6380  

Kemudian kita stop redis master pertama (3310:6380), seolah-olah sedang down.
 # sentinel failover  
 1793:X 12 Aug 05:17:37.074 # +sdown master redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.075 # +odown master redis-cluster 192.168.33.10 6380 #quorum 1/1  
 1793:X 12 Aug 05:17:37.076 # +new-epoch 27  
 1793:X 12 Aug 05:17:37.076 # +try-failover master redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.077 # +vote-for-leader b2e912eedf1416b61ecb8688180c64f00f0e12b6 27  
 1793:X 12 Aug 05:17:37.078 # +elected-leader master redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.078 # +failover-state-select-slave master redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.152 # +selected-slave slave 192.168.33.20:6381 192.168.33.20 6381 @ redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.152 * +failover-state-send-slaveof-noone slave 192.168.33.20:6381 192.168.33.20 6381 @ redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.244 * +failover-state-wait-promotion slave 192.168.33.20:6381 192.168.33.20 6381 @ redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.538 # +promoted-slave slave 192.168.33.20:6381 192.168.33.20 6381 @ redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.538 # +failover-state-reconf-slaves master redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.595 # +failover-end master redis-cluster 192.168.33.10 6380  
 1793:X 12 Aug 05:17:37.595 # +switch-master redis-cluster 192.168.33.10 6380 192.168.33.20 6381  
 1793:X 12 Aug 05:17:37.596 * +slave slave 192.168.33.10:6380 192.168.33.10 6380 @ redis-cluster 192.168.33.20 6381  
 1793:X 12 Aug 05:17:42.656 # +sdown slave 192.168.33.10:6380 192.168.33.10 6380 @ redis-cluster 192.168.33.20 6381  

Otomatis redis kedua (33.20:6381) akan menjadi master.
 andris-MacBook-Pro:~ andri$ redis-cli -h 192.168.33.20 -p 6381  
 192.168.33.20:6381> role  
 1) "master"  
 2) (integer) 0  

Ketika redis pertama (33.10:6381) tadi up kembali, maka ia akan otomatis menjadi slave
 #redis-01 is up and will be slave of redis-01  
 1793:X 12 Aug 05:20:10.131 # -sdown slave 192.168.33.10:6380 192.168.33.10 6380 @ redis-cluster 192.168.33.20 6381  
 1793:X 12 Aug 05:20:20.101 * +convert-to-slave slave 192.168.33.10:6380 192.168.33.10 6380 @ redis-cluster 192.168.33.20 6381  
Cek redis role yang baru, yang sudah jadi slave.
 andris-MacBook-Pro:~ andri$ redis-cli -h 192.168.33.10 -p 6380  
 192.168.33.10:6380> role  
 1) "slave"  
 2) "192.168.33.20"  
 3) (integer) 6381  
 4) "connected"  

Masalah dari konfigurasi diatas adalah app server tidak langsung tahu mana redis master yang baru, setelah redis master yang lama masih mati.
Kita bisa memakai HAProxy untuk mengatasi ini. HAproxy biasanya digunakan untuk load balance http request. Install haproxy bisa lewat apt-get jika memakai linux ubuntu. Pada versi 1.5x keatas sudah support untuk koneksi TCP (redis memakai TCP). HAProxy akan selalu melakukan healty-check ke semua redis yang sudah didaftarkan mencari mana yang master. Ketika Sentinel sudah merubah master-slave yang baru, HAProxy akan langsung tahu mana yang master. App server atau client connect TCP ke HAProxy host bukan ke redis langsung (tanpa tahu proses master-slave dibelakang). Proses downtime di app server akan jauh lebih turun lagi.
 #HAProxy conf  
 defaults REDIS  
      log   global  
      mode tcp  
      timeout connect 4s  
      timeout server 30s  
      timeout client 30s  
 frontend ft_redis  
      bind *:6378 name redis  
      default_backend backend_redis  
 backend backend_redis  
      option tcp-check  
      tcp-check connect  
      tcp-check send PING\r\n  
      tcp-check expect string +PONG  
      tcp-check send info\ replication\r\n  
      tcp-check expect string role:master  
      tcp-check send QUIT\r\n  
      tcp-check expect string +OK  
      server redis_01 192.168.33.10:6380 check inter 1s  
      server redis_02 192.168.33.20:6381 check inter 1s  

Konfigurasi redis sentinel sama dengan sebelumnya.

Percobaan yang dilakukan ke HAProxy (33.80:6379)
 andris-MacBook-Pro:~ andri$ redis-cli -h 192.168.33.80 -p 6378  
 192.168.33.80:6378> ping  
 PONG  
 192.168.33.80:6378> role  
 1) "master"  
 2) (integer) 169  
 3) 1) 1) "192.168.33.20"  
    2) "6381"  
    3) "169"  
 192.168.33.80:6378> set foo "bar"  
 OK  
 192.168.33.80:6378> get foo  
 "bar"  
 192.168.33.80:6378> get foo  
 "bar"  

Kita matikan redis-master pertama (33.10:6380).
 #sentinel log  
 2721:X 12 Aug 09:19:58.218 # +failover-state-reconf-slaves master redis-cluster 192.168.33.10 6380  
 2721:X 12 Aug 09:19:58.316 # +failover-end master redis-cluster 192.168.33.10 6380  
 2721:X 12 Aug 09:19:58.317 # +switch-master redis-cluster 192.168.33.10 6380 192.168.33.20 6381  
 2721:X 12 Aug 09:19:58.318 * +slave slave 192.168.33.10:6380 192.168.33.10 6380 @ redis-cluster 192.168.33.20 6381  
 2721:X 12 Aug 09:20:03.375 # +sdown slave 192.168.33.10:6380 192.168.33.10 6380 @ redis-cluster 192.168.33.20 6381  

Data masih tetap ada, tanpa kita ganti konfigurasi redis di app server.
 192.168.33.80:6378> get foo  
 "bar"  

Sekian tutorial ini, semoga bisa bermanfaat. :)

Wednesday, June 15, 2016

Video Carousel AngularJS

Carousel atau slider biasanya di gunakan untuk menampilkan beberapa foto, tapi bagaimana dengan video? apakah bisa juga di buat slidernya mengunakan angularjs? Apakah caranya sama atau beda?Blog saya kali ini akan membahas cara menampilkan video dalam bentuk carousel.
Yang perlu kita lakukan pertama kali adalah menyiapkan video yang akan di tampilkan, kali ini saya mengambil url video dari youtube.

 <iframe width="100%"  
  ng-src="https://www.youtube.com/embed/RvIZGBUnLs8" frameborder="0" allowfullscreen>  
  </iframe>  

Cara yang di pakai untuk membuat video carousel sebenarnya sama saja dengan membuat image carousel, hanya saja perbedaan nya ada pada penggunaan iframe (untuk video) dan img (untuk gambar). Berikut cara penggunakan Carousel nya





Pada code di atas, tertera carousel-indicator yang di dalam nya terdapat data target. Data target ini menunjukkan urutan index dari video yang pertama kali muncul yang di tandai dengan class "active".
Carousel juga dapat di atur secara manual (tidak otomatis menjalankan slide) yaitu dengan pengaturan yang ada di "left corusel-control" dan "right carousel-control", sehingga kita dapat mengganti slide secara manual.

Dan hasilnya pun seperti ini,



Demikianlah cara penggunakan carousel untuk video menggunakan angularjs. Ternyata mudah, hanya mengganti cara menampilkan gambar nya saja. Semoga bermanfaat.

Tutorial Golang Part 3

Masih membahas bahasa pemrograman Go, yang menlanjutkan meteri kami sebelumnya. Di blog ini kami akan membahas tentang :
  • Variable
  • Array
  • Struct

Variable

Variable adalah tempat kita menyimpan data. Dimana data tersebut akan kita gunakan lagi dan bisa berubah sesuai dengan kebutuhan kita. Berikut contoh penggunaan variable di Go :



Pada prinsipnya kita menggunakan var untuk menunjukan itu variable lalu di lanjutkan dengan nama variable, tipe data dan value awalnya (jika ada).

Untuk lebih ringkasnya deklarasi variable bisa menggukan cara berikut :
f := "short"
yang artinya kita tidak perlu menulis kata var dan tipe datanya.

Saya pribadi lebih suka menggukan cara ini karena lebih singkat.

Array

Array adalah variable yang didalamnya bisa terdiri dari 1 atau lebih element. Berikut contoh penggunaan array di Go :




Deklarasi array sama dengan variable, bedanya ada tambah [] untuk menentukan jumlah element yang ada.






Cara shortcut-nya juga hampir sama dengan variable dengan menggunakan :=

Sedangkan contoh disebelah adalah penggunaan array dengan 2 dimensi.





Struct

Struct adalah variable yang isi datanya lebih komplek. Kalau bisa kita analogikan struct hampir sama dengan Object di bahasa pemrograman OOP. Berikut contoh penggunaan struct di Go :


Cara deklarasinya dengan menggunakan keyword type lalu nama variablenya dan diakhir dengan keyword struct.












Disini ada simbol & yang artinya kita menggunakan pointer.





Sementara itu penjelasan singkat tentang Variable, Array dan Struct. Nanti kan blog-blog kami selanjutnya. I hope you enjoy it.









Data Binding Angular 1 vs Angular 2

Data Binding pada angular merupakan salah satu fitur yang paling saya sukai. Two ways data binding yang sangat mudah digunakan membuat hidup ini berasa lebih mudah, terutama bagi saya yang tidak menyukai javascript maupun jquery.

Two Way Data Binding merupakan konsep yang diusung oleh angular sejak angular 1.
Model dan View akan terus menerus melakukan sync sehingga data yang diupdate baik dari controller maupun view akan saling mengupdate dan selalu sama. Angular1 menggunakan sebuah variable bernama $scope untuk menjadi penjembatan antara model dan view. Semua data yang berada dalam $scope akan selalu diawasi. Hal itu membuat model dan view selalu sync satu sama lainnya, tetapi jangan berpikir bahwa itu semua semanis kelihatannya. Yap, angular melakukan watch pada semua variable $scope yang aktif dan tentunya menghabiskan resource yang cukup besar. Sebuah kesalahan kecil seperti melakukan reuse variable $scope pada html yang sedang di hide saja bisa menyebabkan rendering behind the view yang luar biasa hingga menyebabkan freeze padahal hanya untuk mendisplay ( yap, saya pernah mengalaminya )

Lalu bagaimana dengan Angular2?
Berikut sample code agar lebih mudah di cerna : 
<div>{{article.name}}</div>
<article-detail [article]="selectArticle"></article-detail>
<div (click)="selectArticle(article)"></div>
Pada angular 2 terdapat 3 macam data binding : 
Data Binding Angular 2
  • Interpolation : {{article.name}}interpolation berfungsi untuk menampilkan value dari component pada div biasa
  • Property Binding : [article]
    property binding berfungsi untuk menampilkan value dari component pada property, atau dari parent ke child
  • Event Binding : (click)
    Event Binding berfungsi untuk mengirim data dari view menuju component
Lalu dari ketiga macam tipe binding yang disediakan Angular 2. Terdapat juga two way data binding yang merupakan kombinasi dari property binding dan event binding yang merupakan bentuk dari Two Data Binding Angular 2. 
<input [(ngModel)]="article.name">
Pada Two Way Data Binding, Angular menggabungkan property dan event binding. Perubahan yang dilakukan oleh user akan dikirim ke component melalui event binding, sedangkan Perubahan pada component akan dikirim menggunakan property binding. Hal tersebut membuat angular tidak perlu melakukan watch pada suatu variable melainkan melakukan aktivitas ketika ada triger baik dari component maupun dari view. Hal yang sama juga dapat dilakukan antar parent dan child component.

Two Way Data Binding Angular 2
Angular 2 telah memberikan solusi yang lebih baik untuk masalah performance data binding yang terjadi pada Angular sebelumya. Dan tentunya kita dapat tetap berbahagia tanpa perlu repot memproses two data binding sendiri. Sekian saja untuk kesempatan kali ini.
Sampai berjumpa pada kesempatan berikutnya. Happy Coding :D 

Format Penulisan Pada Angular2

Pada kesempatan kali ini Saya akan membahas mengenai Angular2. AngularJs akhirnya merilis Angular 2 pada pertengahan tahun 2016( status saat ini masih beta 17). Sayangnya Angular 2 bukan merupakan upgrade dari Angular 1 melainkan merewrite Angular 1 menjadi framework yang baru. Angular2 melakukan beberapa perubahan seperti yang sangat signifikan adalah mengganti 2 component utama Angular 1 yaitu controller dan $scope dengan component dan directives, modularity, dependency injection, service, serta template.

Selain itu pada Angular2, angular menyediakan 3 macam format penulisan. Typescript, Javascript, dan Dart. Pada kesempatan kali ini Saya akan membahas apa saja 3 macam format penulisan pada angular2.

3 macam format penulisan pada AngularJS 2: 

  • Typescript
    Typescript merupakan penulisan yang di sarankan oleh angular2. Typescript sendiri merupakan bahasa yang dgunakan untuk membangun Angular2. Typescript atau dikenal dengan Microsoft's Typescipt adalah Javascript yang memiliki fitur tambahan seperti object oriented programming, lambda, dan beberapa hal lainnya. Typescript sendiri biasa digunakan untuk menghandle project besar yang sulit dimaintenance apabila menggunakan Javascript.
    Dengan menggunakan Typescript maka file component dan master file akan memiliki extensi .ts.
    Berikut adalah struktur dasar apabila menggunakan format typescript : 
         Terlihat disana ada beberapa file :
    • app.component.ts : File ini merupaka root component. Dalam sebuah aplikasi angular, setidaknya harus ada 1 root component. Standarnya root component disebut sebagai AppComponent.
    • main.ts : File ini berfungsi memberitahu angular untuk mengeload component yang dibutuhkan.
    • package.json : Seperti namanya, file ini berisi package- package yang dibutuhkan oleh apps untuk menjalankan fungsinya.
    • systemjs.config.js : File ini merupakan file config untuk SystemJS. SystemJS digunakan untuk membantu load library yang dibutuhkan. SystemJS hanyalah salah satu alat bantu dan dapat diganti dengan library management lainnya.
    • tsconfig.json : File ini merupakan file config untuk Typescript compiler 
    • typings.json : File ini merupakan file definition yang berisi identity dari Typescript yang digunakan
    • index.html : Master html tempat semua script di daftarkan dan aplikasi ditulis
  • Javascript
    Javascript merupakan bahasa pemprograman yang cukup terkenal di dunia pemprograman web. Angular menggunakan Javascript menjadi salah satu format yang dapat digunakan pada Angular2. Pada format penulisan javascript file yang akan digunakan akan memiliki extensi .js seperti yang terlihat pada gambar. Apabila anda pecinta javascript dan bersedih karena sebelumnya angular membuat coding web tanpa perlu menyentuh javascript. Maka Javascript format pada Angular2 merupakan jalan kebahagiaan.











            Terlihat disana ada beberapa file :
    • app.component.js : Sama halnya seperti pada Typescript format. Merupakan root component pada angular apps.
    • main.js : Sama halnya seperti pada Typescript format. File ini berfungsi memberitahu angular untuk mengeload component yang dibutuhkan.
    • package.json : Seperti halnya seperti pada Typescript format, file ini berisi package- package yang dibutuhkan oleh apps untuk menjalankan fungsinya.
    • index.html : Master html tempat semua script di daftarkan dan aplikasi ditulis
  • Dart
    Dart merupakan class based oriendted programming yang dikembangkan untuk membangun website, server dan mobile apps. Pada format penulisan Dart, Angular telah mengemas javascript menggunakan Dart dan menyediakan fiturnya dengan cukup lengkap sehingga lebih mudah digunakan untuk memulai memahami konsep angular2. Tetapi dikarenakan pada dasarnya Angular menggunakan Dart untuk membungkus Javascript, Dart format memiliki keterbatasan seperti membuat user harus mneghafalkan format- format yang ada sehingga tidak direkomendasikan untuk project dengan skala besar dan kompleks.
             Terlihat disana ada beberapa file :

    • app.component.dart : Sama halnya seperti pada Typescript format. Merupakan root component pada angular apps
    • main.dart : Sama halnya seperti pada Typescript format. File ini berfungsi memberitahu angular untuk mengeload component yang dibutuhkan.
    • pubspec.yaml : Merupakan file yang mendeklarasikan angular dan browser package yang digunakan sebagai dependency. Angular masih melakukan perubahan untuk format file ini pada masa beta status saat ini. 
    • index.html : Master html tempat semua script di daftarkan dan aplikasi ditulis
Setelah mengetahui 3 macam penulisan pada AngularJs. Kita bisa menentukan format yang mana yang ingin dan cocok kita gunakan pada project yang akan dibuat serta kemampuan anggota team yang ada.
Semoga Tulisan ini dapat membantu. Happy Coding :D