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.

Toleransi Kesalahan dengan menggunakan Active Replication
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 

Untuk menjalankan source code diatas ikuti langkah berikut :
  1. Jalankan server Zookeeper
  2. Jalankan client Zookeeper kemudian buat sebuah Znode dengan nama election
  3. Compile source code diatas kedalam bentuk .jar
  4. Kemudian eksekusi file tersebut dengan perintah Java -jar [nama file] pada command prompt

Posting Komentar untuk "Toleransi Kesalahan pada sistem terdistribusi"