Toleransi Kesalahan pada sistem terdistribusi
Mengacu kepada kemampuan System untuk terus berfungsi setelah adanya kegagalan software atau hardware. Fault tolerance dapat dicapai melalui dua pendekatan: hardware, redundancy, software recovery.
Toleransi Kesalahan
Untuk memahami peran dari toleransi kesalahan di dalam sistem tersebar, kita kebutuhan pertama untuk melihat lebih dekat pada apa yang itu benar-benar berarti karena suatu sistem tersebar untuk toleransi terhadap kesalahan-kesalahan. Toleran kesalahan adalah betul-betul dihubungkan dengan apakah menyebut sistem yang ketergantungan.
Komponen Toleransi Kesalahan
Sistem dikatakan gagal (fail) apabila tidak mampu memenuhi spesifikasi tekniknya. Sistem Komputer dapat gagal karena kesalahan beberapa komponen seperti: processor, memory, I/O device, cable atau software.
Kesalahan dapat diklasifikasikan sebagai: transient, intermittent, permanent. Kesalahan transient terjadi sekali dan kemudian menghilang. Jika operasi diulangi, kesalahan tidak muncul. Kesalahan intermittent terjadi kemudian menghilang, lalu muncul lagi, lalu menghilang lagi, dan seterusnya. Contohnya seperti hubungan konektor yang loggar. Keslahan permanent terjadi seterusnya sampai komponen yang fault diperbaiki. Contoh chips terbakar, software bugs, disk head crash.
Tujuan perancangan dan pembuatan toleransi kesalahan adalah menjamin bahwa System secara keseluruhan mampu terus berfungsi secara benar meskipun fault terjadi. Jadi disini tidak mensyaratkan individual komponen yang sangat reliable.
Systems Failures
Keandalan sistem (System reliability) sangat penting di dalam sebuah sistem terdistribusi karena di dalam System tersebut terkandung sejumlah besar komponen dan kemungkinan terjadinya kegagalan sangat besar.
Fault atau kesalahan suatu sistem dapat dibedakan menjadi: Fail-silent faults dan Bizantine Faults. Fail-silent faults atau fail stop faults : sistem berhenti dan tidak memberikan respon terhadap masukan yang ada. Bizantine Faults : sistem terus bekerja meskipun fault dan memberikan hasil yang salah.
Sistem yang mempunyai sifat dalam kondisi normal bekerja akan memberikan respon terhadapat input dalam waktu terbatas yang telah diketahui disebut sistem Synchronous.
Sistem yang tak punya sifat seperti itu disebut sistem Synchronous. Sistem aSynchronous sangat sulit dikelola dibandingkan dengan Synchronous.
Penggunaan Redudancy
Pendekatan umum fault tolerance (toleransi terhadap kegagalan) adalah menggunakan redundancy. 3 jenis redundancy: Information redundancy, Time redundancy, physical redundancy.
Information redundancy
Metoda ini menambahkan extra bit untuk membuat sedemikian hingga dapat merecovery informasi yang telah rusak. Contoh Hamming code ditambahkan pada transmitted data.
Time redundancy
Sebuah operasi dilakukan dan kemudian jika diperlukan diulangi lagi. Contoh, penggunaan atomic transaction. Jika transaction dibatalkan, proses tersebut dapat diulangi lagi tanpa menimbulkan masalah. Metoda ini sangat bermanfaat jika fault-nya adalah transient atau intermittent.
Physical redundancy
Pendekatan ini menggunakan penambahan perangkat ekstra. Sebagai contoh ekstra processor dapat ditambahkan ke System sehingga jika beberapa processor rusak maka System secara keseluruhan masih dapat berfungsi dengan benar. Ada dua cara untuk mengelola ekstra processor tersebut: activereplication dan primary backup.
Toleransi Kesalahan dengan menggunakan Active Replication
Pada teknik ini semua processor/device digunakan sepanjang waktu dan setiap device memiliki replikasinya masing-masing sehingga dapat menyembunyikan fault dengan penuh.
![]() |
Contoh ActiveReplication
|
Gambar diatas menunjukkan sinyal melalui device A,B,C secara berurutan. Setiap device memiliki 3 replikasi. Dan setiap replikasi diikuti sebuah voter. Setiap voter memiliki 3 input dan satu output. Jika dua atau tiga input sama, maka output sama dengan input. Jika 3 input berbeda hasil output tak terdefinisi.
Misalkan element A2 gagal. Setiap voter V1, V2 dan V3 mendapatkan 2 masukan identik yang benar dan sebauh salah, tetapi Voter tetap menghasilkan output yang benar untuk masukan tahap berikutnya. Sehingga pada dasarnya efek A2 tidak berpengaruh secara keseluruhan System.
Toleransi Kesalahan dengan menggunakan Primary Backup
Pada metoda ini setiap saat hanya ada satu server sebagai primary yang bekerja. Jika primary server gagal maka backup server akan mengambil alih.
Leader Election Implementation in Zookeeper
Pemilihan Pemimpin atau leader election pada Zookeeper berguna untuk mengatasi fault tolerance disaat server utama mengalami kegagalan, berikut adalah source code agar pemilihan pemimpin dapat dilakukan secara otomatis.
Modifikasi file LeaderElection.Java yang ada pada materi sebelumnya pada link Membuat Aplikasi Sistem Terdistribusi menjadi seperti berikut :
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
/**
* Leader Election Implementation in Java
*
*/
public class LeaderElection implements Watcher {
private static final String ZOOKEEPER_ADDRESS = "localhost:2181";
private static final int SESSION_TIMEOUT = 3000;
private static final String ELECTION_NAMESPACE = "/election";
private ZooKeeper zooKeeper;
private String currentZnodeName;
// NOTE - Don't forget to create the /election ZNode
public static void main(String[] arg) throws IOException, InterruptedException, KeeperException {
LeaderElection leaderElection = new LeaderElection();
leaderElection.connectToZookeeper();
leaderElection.volunteerForLeadership();
leaderElection.electLeader();
leaderElection.run();
leaderElection.close();
System.out.println("Disconnected from Zookeeper, exiting application");
}
public void volunteerForLeadership() throws KeeperException, InterruptedException {
String znodePrefix = ELECTION_NAMESPACE + "/c_";
String znodeFullPath = zooKeeper.create(znodePrefix, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("znode name " + znodeFullPath);
this.currentZnodeName = znodeFullPath.replace("/election/", "");
}
public void electLeader() throws KeeperException, InterruptedException {
List<String> children = zooKeeper.getChildren(ELECTION_NAMESPACE, false);
Collections.sort(children);
String smallestChild = children.get(0);
if (smallestChild.equals(currentZnodeName)) {
System.out.println("I am the leader");
return;
}
System.out.println("I am not the leader, " + smallestChild + " is the leader");
}
public void connectToZookeeper() throws IOException {
this.zooKeeper = new ZooKeeper(ZOOKEEPER_ADDRESS, SESSION_TIMEOUT, this);
}
private void run() throws InterruptedException {
synchronized (zooKeeper) {
zooKeeper.wait();
}
}
private void close() throws InterruptedException {
this.zooKeeper.close();
}
@Override
public void process(WatchedEvent event) {
switch (event.getType()) {
case None:
if (event.getState() == Event.KeeperState.SyncConnected) {
System.out.println("Successfully connected to Zookeeper");
} else {
synchronized (zooKeeper) {
System.out.println("Disconnected from Zookeeper event");
zooKeeper.notifyAll();
}
}
}
}
}
- Update pom.xml menjadi seperti berikut :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>distributed.systems</groupId>
<artifactId>leader.election</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>LeaderElection</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
</dependencies>
</project>
Cara Menjalankan
- Jalankan server Zookeeper
- Jalankan client Zookeeper kemudian buat sebuah Znode dengan nama election
- Compile source code diatas kedalam bentuk .jar
- Kemudian eksekusi file tersebut dengan perintah Java -jar [nama file] pada command prompt
Gabung dalam percakapan