dalamnya, dimana subkolom-subkolom dinamakan sebagai kelompok kolom-kolom yang saling
memiliki hubungan satu dengan yang lainnya.
Jika kita perhatikan dengan jeli pembahasan di atas, kita melihat bahwa -tidak seperti sistem basis
data relasional yang dirancang dan dikembangkan menggunakan ERD Entity Relationship Diagram-
perancangan dan pengembangan sistem Cassandra seharusnya dimulai justru dari query-queryyang
diharapkan akan dilakukan pada server data Cassandra
– dalam hal ini kita sebagai pengembang bisa bertanya pada perancang aplikasi tentang
query-query seperti apa yang diharapkan oleh aplikasi. Ini merupakan paradigma yang cukup
berbeda, sehingga mungkin akan membingungkan perancang
dan pengembang
aplikasi yang
sebelumnya telah terbiasa dengan model-model relasional.
Pada sistem
yang terdistribusi,
perancang dan pengembang Cassandra juga harus menggunakan timestamp untuk memastikan data
mana yang terakhir mengalami perubahan.
Tabel 2 Operasi-operasi Baku Pada Cassandra[9]
Create Read
Update Delete
insert batch_inse
rt getKey
getColum n
getSlice mutate
batch_muta te
remove
3. Operasi CRUD pada Sistem Non
Relasional Cassandra
Operasi-operasi yang bersifat baku pada sistem basis data sering dinamakan sebagai operasi CRUD
Create-Read-Update-Delete [12].
Tabel 2
memperlihatkan sintak-sintak dasar operasi CRUD pada Cassandra. Dalam hal ini Cassandra tidak
seperti sistem relasional yang menggunakan SQL, menggunakan API Application Programming
Interface
yang dinamakan
sebagai Thrift
sedemikian rupa
sehingga klien-klien
bisa mengakses data yang tersimpan di dalamnya [9, 17,
20]. API Thrift dapat dimanfaatkan oleh sejumlah besar bahasa pemrograman misalnya C, C++,
Java, PHP, Phyton, dan sebagainya. Meski demikian, dalam pembahasan selanjutnya, kita
mengasumsikan bahwa bahasa pemrograman yang digunakan adalah Java. Sebagai catatan, dalam
pembahasan selanjutnya, kita mengasumsikan bahwa klien dan server data Cassandra berada di
komputer yang sama [localhost]. Dengan kata lain, meskipun Cassandra dipromosikan sebagai sistem
basis data terdistribusi yang tangguh, dalam tulisan ini kita tidak akan membahasnya.
Pada umumnya, agar klien-klien bisa mengakses data yang disimpan dalam server data Cassandra,
seringkali kita harus melakukan konfigurasi sedemikian rupa
sehingga Cassandra dapat
mengenali kumpulan kolom ColumnFamily yang akan digunakan. Hal ini bisa dilakukan
dengan cara menyunting berkas storage-conf.xml yang ada di folder CASSANDRA_HOMEconf
[9]. Dalam berkas storage-conf.xml kita akan menjumpai 2 elemen kunci Keyspaces yang ada
secara default, yaitu elemen kunci yang digunakan secara internal oleh Cassandra dan Keyspaces1
yang tidak digunakan oleh server data Cassandra dan hanya digunakan untuk tujuan demonstrasi. Di
dalam elemen Keyspaces yang ada, kita bisa mendefinisikan elemen-elemen Keyspace yang
dapat kita gunakan untuk mendefinisikan kumpulan kolom ColumnFamily yang diperlukan oleh
aplikasi klien. Di bawah ini, kita akan mengambil contoh konfigurasi untuk struktur data yang ada
pada server data Cassandra seperti yang diperlihatkan dalam Tabel 1.
Keyspaces Keyspace Name=Mahasiswa
ColumnFamily CompareWith=UTF8Type Name=Nama Matakuliah
ColumnFamily CompareWith=UTF8Type Name=Nilai
-- Necessary for Cassandra : diisi oleh Cassandra --
ReplicaPlacementStrategy org.apache.cassandra.locator.RackUnawareStr
ategy ReplicaPlacementStrategy
ReplicationFactor1ReplicationFactor EndPointSnitch
org.apache.cassandra.locator.EndPointSnitch EndPointSnitch
Keyspace Keyspaces
Dengan konfigurasi XML eXtensible Markup Language
di atas,
sesungguhnya kita
mendefinisikan dua kolom yaitu satu untuk menyimpan Nama Matakuliah yang diambil oleh
Mahasiswa
tertentu, satu lagi untuk menyimpan
Nilai -nya. Selanjutnya, kita juga bisa melihat baris-
baris konfigurasi tambahan yang diperlukan oleh Cassandra agar pekerjaannya bisa berjalan dengan
baik. Kumpulan kolom ColumnFamily akan mengorganisasi data berdasarkan kolom-kolom
Column-nya dalam susunan hierarkis. Aturan pengurutan
yang akan
diterapkan pada
ColumnFamily adalah UTF8Type sehingga data
nantinya akan diurutkan berdasarkan urutan alfabetis. Demikianlah, kita sudah mendefinisikan
konfigurasi data yang akan dimasukkan ke dalam server data Cassandra. Selanjutnya, setelah kita
mengaktifkan server data Cassandra, maka kita bisa melakukan pemrograman dari sisi klien [15, 16].
Sebelum kita bisa bekerja dari arah klien, pastikan proyek Java yang kita buat sudah memasukkan
pustaka-pustaka APIThrift ke dalamnya ada di folder CASSANDRA_HOMElib. Jika hal ini
sudah dilakukan dengan baik, klien bisa melakukan koneksi dengan server data Cassandra dengan
membuka port 9160 yang merupakan port default server data Cassandra. Adapun contoh kode bahasa
Java untuk membuka koneksi port 9160 itu tersaji di bawah ini.
TTransport transport = new TSocketlocalhost, 9160;
TProtocol protocol = new TBinaryProtocoltransport;
Cassandra.Client client = new Cassandra.Clientprotocol;
transport.open;
Setelah port komunikasi terbuka, selanjutnya kita bisa
mengisi datanya.
Contohnya adalah
menggunakan kode-kode Java berikut ini.
MapString, ListColumnOrSuperColumn data = new HashMapString,
ListColumnOrSuperColumn; ListColumnOrSuperColumn columns
=
new
ArrayListColumnOrSuperColumn;
Pertama kali, sebelum memasukkan data, kita harus terlebih dulu mendefinisikan objek-objek yang
akan bertindak sebagai pemuat container di memori klien, sebelum kita mengisinya dengan
data sesungguhnya, kemudian menyisipkannya ke sistem basis data Cassandra. Pada contoh kode di
atas, kita menggunakan struktur data Map yang diimplementasikan sebagai List yang berisi
dengan kolomsuperkolom
ColumnOr SuperColumn
dan penempatannya
dalam
memori dilakukan menggunakan algoritma Hash
[11], sementara kolomsuperkolom ColumnOrS uperColumn
sendiri diimplementasikan
menggunakan struktur data ArrayList. Setelah pendefinisian objek dilakukan dengan baik,
selanjutnya kita
bisa memasukkan
data sesungguhnya
ke server
data Cassandra
menggunakan kode Java berikut perhatikan komentar-komentar
yang berfungsi
untuk menjelaskan maksud penulisan kode.
Timestamp diambil dari sistem pewaktuan komputer.
long timestamp = System.currentTimeMillis;
Membuat kolom Matakuliah dan mengisi datanya.
ColumnOrSuperColumn c1 = new ColumnOrSuperColumn;
c1.setColumnnew Column Nama Matakuliah.getBytesutf-8,
Pemrograman Java.getBytesutf- 8,timestamp;
columns.addc1; Menambah kolom Nilai
dan mengisi datanya. ColumnOrSuperColumn c2 = new
ColumnOrSuperColumn; c2.setColumnnew
ColumnNilai.getBytesutf-8, A.getBytesutf-8,timestamp;
columns.addc2; Menambahkan data ke
server data Cassandra. data.putMahasiswa,columns;
client.batch_insertMahasiswa,Adi Nugroho,data,ConsistencyLevel.ANY;
Seperti telah kita bahas sebelumnya, pada dasarnya ada tiga nilai yang diperlukan untuk melakukan
penambahan kolom, yaitu : nama kolom, nilainya, serta timestamp-nya. Kita saat ini hanya akan
menambahkan satu data, yaitu perhatikan Tabel 1 Adi Nugroho yang mengambil Pemrograman
Java
, mendapatkan
nilai A
, serta
waktu timestamp saat dimasukkannya data ke server
data Cassandra. Tentunya key yang lain serta kolom-kolom yang lain dapat dilakukan dengan
cara yang serupa. Perhatikan bahwa argumen
String pada struktur data Map pada dasarnya berisi nama ColumnFamily yang kita definisikan
sebelumnya saat kita menyunting berkas storage- conf.xml
. Setelah kita berhasil menyisipkan data ke server
data Cassandra, selanjutnya pasti kita ingin agar bisa melihatnya kembali. Hal ini bisa dilakukan
menggunakan potongan kode Java berikut ini.
SlicePredicate slicePredicate = new SlicePredicate;
SliceRange sliceRange = new SliceRange; sliceRange.setStartnew byte[] {};
sliceRange.setFinishnew byte[] {}; slicePredicate.setSlice_rangesliceRange;
List result = client.get_sliceMahasiswa,Adi Nugroho,
new ColumnParentMahasiswa,slicePredicate,
ConsistencyLevel.ONE;
Pada kode Java di atas, pertama kali kita membuat objek dari kelas
SlicePredicate yang digunakan untuk mengatakan pada server data
Cassandra tentang data apa yang akan diambil. Pada contoh kode bahasa Java di atas kita akan
mengambil nilai yang ada di dalam sejumlah kolom yang didefinisikan oleh setStart hingga
setFinish Ingat kembali pengurutan kolom secara alfabetis yang didefinisikan melalui berkas
konfigurasi storage-conf.xml. Dalam hal ini, kita tidak menyebutkan kolom awal dan kolom akhir,
sehingga server data Cassandra kelak akan mengambil semua kolom yang ada Catatan :
Argumen yang digunakan oleh metoda-metoda
setStartdan setFinishseharusnya
adalah nama kolom. Lalu, setelah kita bisa melakukan penyisipan data
dan mengambilnya kembali, bagaimana jika kita melakukan pembaharuan data updating? Kita bisa
menggunakan metoda
batch_mutate.
Misalkan kita ingin mengubah nilai Pemrograman Java
untuk mahasiswa dengan nama Adi Nugroho
sehingga bernilai
B ,
kita bisa
memberikan perintah Java berikut ini.
long timestamp
= System.currentTimeMillis;
Column column = new
ColumnNilai.getBytesutf- 8,B.getBytesutf-8,timestamp;
ColumnOrSuperColumn columnOrSuperColumn = new ColumnOrSuperColumn;
columnOrSuperColumn.setColumncolumn; Mutation mutation = new Mutation;
mutation.setColumn_or_supercolumn columnOrSuperColumn;
ListMutation mutations = new ArrayListMutation;
mutations.addmutation; MapString,ListMutation nilai =
new HashMapString,ListMutation; job.putMahasiswa,mutations;
MapString,
MapString,ListMutation batch =
new HashMapString,MapString,
ListMutation; batch.putAdi Nugroho,nilai;
client.batch_mutateMahasiswa,batch, ConsistencyLevel.ALL;
Pertama kali kita harus membuat kolom Column yang memuat perubahan nyata yang akan kita
lakukan, kemudian kita mengisinya dengan key yang benar dan dengan nilai yang baru. Kemudian,
kita perlu menambahkan kolom Column tersebut ke kumpulan ColumnOrSuperColumn dan
kemudian menambahkan keseluruhannya ke objek
Mutation. Objek Mutation ini juga dapat digunakan untuk membuat kolom yang baru atau
untuk menghapus kolom yang sudah ada sebelumnya. Jika kita mengisinya dengan key yang
belum ada di basis data, berarti kita akan menambahkannya; jika key yang dimasukkan sudah
ada di basis data Cassandra, maka ia pada dasarnya akan menindas nilai yang sudah ada tersebut serta
juga akan menindas nilai timestamp yang lama. Terakhir, jika kita mau, kita juga bisa meletakkan
objek Deletion ke objek Mutation dan dengan demikian mengatakan pada server basis
data Cassandra
bahwa ia
harus menghilangkanmenghapus Column tertentu.
Kita, seperti telah dibahas di atas, bisa melakukan penghapusan menggunakan metoda pembaharuan.
Alternatif lain, kita juga bisa secara langsung menggunakan metoda remove berikut ini.
long timestamp = System.currentTimeMillis;
client.removeMahasiswa,Adi Nugroho, new
ColumnPath Mahasiswa,timestamp,
ConsistencyLevel.ALL;
Kita lihat di atas, alih-alih menggunakan SQL seperti pada sistem basis data relasional, operasi-
operasi CRUD dari arah aplikasi-aplikasi klien ke server data Cassandra dapat dilakukan dengan
memanfaatkan API Thrift yang dapat dipanggil dari arah klien dalam kasus kita di atas, kita
menggunakan bahasa pemrograman Java.
4. Perbandingan Antara Sistem Basis