Replikasi SQLite dengan Litestream

2 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Replikasi SQLite dengan Litestream
Photo by benjamin lehman on Unsplash

TeknoCerdas.com – Salam cerdas untuk kita semua. SQLite adalah database yang powerful dan cocok digunakan untuk sebagian besar aplikasi. Masalah utama SQLite adalah konsistensi data. Jika server crash ketika sedang melakukan operasi tulis maka kemungkinan file SQLite akan korup atau rusak. SQLite tidak memiliki fitur replikasi data secara bawaan. Namun kita dapat melakukan replikasi SQLite dengan Litestream yaitu sebuah tool replikasi independen untuk SQLite.

Tidak semua aplikasi butuh horizontal scaling dan berpuluh-puluh server. Kadang satu buah server dan melakukan vertical scaling sudah cukup untuk menangani jutaan request per detik ke database. Keuntungannya dengan hanya memiliki satu buah server adalah kemudahan dan mudah untuk perawatan.

Ketika sebuah aplikasi hanya butuh 1 server maka SQLite adalah pilihan yang masuk akal. Litestream hadir untuk memberikan fitur replikasi pada SQLite secara independen. Artinya tidak perlu ada perubahan disisi SQLite atau kode.

Replikasi dapat dilakukan menggunakan lokal file atau object storage seperti S3. Dengan demikian keamanan data dapat dijamin dengan lebih baik ketika terjadi crash pada server.

Instalasi Litestream

Litestream tersedia untuk instalasi macOS dan Debian/Ubuntu. Pada sistem operasi yang lain dapat melakukan compiling dari kode sumber. Litestream ditulis menggunakan bahasa Go. Kode sumber ada di https://github.com/benbjohnson/litestream.

Pada tulisan ini akan dicontohkan instalasi Litestream pada Ubuntu 20.04 LTS. Pertama downlaod file deb package dari website Litestream.

$ wget https://github.com/benbjohnson/litestream/releases/download/v0.3.2/litestream-v0.3.2-linux-amd64.deb

Install menggunakan perintah dpkg.

$ sudo dpkg -i litestream-v0.3.2-linux-amd64.deb

Pastikan instalasi telah selesai dan Litestream dapat digunakan dengan memanggil perintah litestream.

$ litestream version
v0.3.2

Membuat Database SQLite

Kita akan membuat sebuah database dan tabel dummy dan mengisinya dengan beberapa record sebagai contoh.

$ cat <
CREATE TABLE countries(
  id TEXT PRIMARY KEY,
  name TEXT
);

INSERT INTO countries (id, name) VALUES 
  ("ID", "Indonesia"),
  ("SG", "Singapore"),
  ("MY", "Malaysia");
EOF

Pastikan record telah masuk dengan melakukan query SELECT pada tabel countries.

$ echo "SELECT * FROM countries" | sqlite3 $HOME/countries.db
ID|Indonesia
SG|Singapore
MY|Malaysia

Terlihat bahwa record sudah masuk dengan sempurna.

Menjalankan Replikasi Database

Pada contoh ini kita akan melakukan replikasi database ke Amazon S3. Sebelum replikasi credentials berupa AWS Access Key dan Secret Key harus disiapkan.

$ export AWS_ACCESS_KEY_ID=Your_access_key_id \ 
AWS_SECRET_ACCESS_KEY=Your_secret_key \ 
AWS_DEFAULT_REGION=ap-southeast-1

Diasumsikan bahwa sudah ada bucket bernama teknocerdas-litestream-backup.

$ litestream replicate $HOME/countries.db s3://teknocerdas-litestream-backup/countries.db
litestream v0.3.2
initialized db: /root/countries.db
replicating to: name="s3" type="s3" bucket="teknocerdas-litestream-backup" path="countries.db" region=""
/root/countries.db(s3): snapshot: creating 4b5876925a4f487b/00000000 t=81.0876ms

Dapat terlihat Litestream melakukan monitoring dan snapshot terhadap SQLite database yang ditentukan. Untuk membuktikan maka lihat pada Amazon S3 object yang dibuat.

Pada terminal Window yang lain lakukan perintah berikut. Diasumsikan anda telah memiliki AWS CLI.

$ aws s3 ls s3://teknocerdas-litestream-backup/ --recursive
2021-02-12 10:09:14        383 countries.db/generations/4b5876925a4f487b/snapshots/00000000.snapshot.lz4
2021-02-12 10:09:14        534 countries.db/generations/4b5876925a4f487b/wal/00000000_00000000.wal.lz4
2021-02-12 10:09:37        119 countries.db/generations/4b5876925a4f487b/wal/00000001_00000000.wal.lz4

Sekarang mari tambahkan beberapa record kedalam tabel countries. Pada terminal window lain jalankan perintah berikut.

$ cat <
INSERT INTO countries (id, name) VALUES 
  ("US", "Amerika Serikat"),
  ("RU", "Rusia"),
  ("BR", "Brazil");
EOF

Restore Database

Berikutnya adalah melakukan restore dari S3. Matikan dulu litestream replicate yang telah dijalankan sebelumnya dengan menekan CTRL+C.

Kita akan merestore database ke file /tmp/countries-restore.db.

$ litestream restore -o countries-restore.db s3://teknocerdas-litestream-backup/countries.db

Harusnya file countries-restore.db telah ada. Buka file tersebut dengan SQLite untuk membuktikan bahwa isinya adalah sama.

$ echo "SELECT * FROM countries" | sqlite3 /tmp/countries-restore.db
ID|Indonesia
SG|Singapore
MY|Malaysia
US|Amerika Serikat
RU|Rusia
BR|Brazil

Seperti yang ditampilkan diatas terdapat 6 record dan itu sesuai dengan yang ada pada database asli.

Menjalankan Litestream sebagai Service

Cara yang kita lakukan sebelumnya adalah cara manual menjalankan Litestream. Agar Litestream otomatis dijalankan ketika boot dan dapat memonitor beberapa database sekaligus maka perlu dijalankan sebagai service pada systemd.

Secara default Litestream akan mencari konfigurasi file di /etc/litestream.yml.

# AWS credentials
access-key-id:     AKIAxxxxxxxxxxxxxxxx
secret-access-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxx

dbs:
 - path: /home/ubuntu/countries.db            # Database to replicate from     
   replicas:
      - path: s3://teknocerdas-litestream-backup/countries.db

Kemudian aktifkan layanannya di systemd.

$ sudo systemctl enable litestream
$ sudo systemctl start litestream