Convert Database OpenStack Cinder dari Sqlite3 ke MySQL - Debian Jessie
Cinder adalah service block storage di OpenStack. Di instalasi OpenStack Debian 8 juga ada masalah di databasenya.
Problem ini baru Saya ketahui kemudian, padahal Cinder instalasi sebelumnya sudah berjalan. Ketika mau ditambahkan node baru untuk block storage, baru ketahuan ternyata ada problem konfigurasi Cinder.
By default, Cinder menggunakan database sqlite3 sedangkan pada instalasi ini saya menggunakan MySQL. Kesalahan Saya pada waktu itu tidak melakukan verifikasi database, saya hanya lihat service Cinder berjalan dan saya anggap tidak ada masalah, setelah timbul masalah baru diketahui Cinder menggunakan database Sqlite, padahal di konfigurasi cinder jelas-jelas saya menggunakan MySQL.
Konfigurasi Cinder ada di /etc/cinder/cinder.conf.
Kesalahan pertama, di file konfigurasi tertulis sql_connection = mysql://.... yang seharusnya connection = mysql://... Ini harus diganti, bisa dengan sed.
# sed -i 's/sql_connection/connection/' /etc/cinder/cinder.conf
Kesalahan kedua, line koneksi database diatas dibawah section [ssl] yang harusnya di section [database]. Ini juga harus dibetulkan.
Berikutnya, data yang sudah terlanjur ada di Sqlite harus dimigrasikan ke MySQL. Bagi Saya, ini yang susah karena saya tidak paham Sqlite, MySQL pun hanya seadanya saja.
Ini langkah-langkah yang dilakukan:
Matikan semetara foreign key checking:
$ echo "SET foreign_key_checks = 0;" > cinder-schema.sql
Dump skema database, defaultnya database sqlite ada di /var/lib/cinder/cinder.sqlite :
$ sqlite3 /var/lib/cinder/cinder.sqlite .schema | tee -a cinder-schema.sql
Dump data:
$ sqlite3 /var/lib/cinder/cinder.sqlite .dump | \
> grep "^INSERT INTO" | tee cinder-data.sql
Sampai sini, sudah ada dua file. cinder-schema.sql yang berisi skema database dan cinder-data.sql yang berisi data. Berikutnya file-file ini harus diedit supaya conform dengan MySQL.
Hapus statement yang tidak perlu:
$ sed -i '/PRAGMA/d; /BEGIN TRANSACTION;/d; /COMMIT;/d' cinder-schema.sql
Di skema tersebut ada kolom binary tidak diquote dan key dengan double quote. keduanya harus di quote dengan backtick (`). Kemudian di file cinder-data.sql, semua table dengan double quote juga harus diganti dengan backtick
$ sed -i 's/\"key\"/`key`/' cinder-schema.sql
$ sed -i 's/binary/`binary`/' cinder-schema.sql
$ sed -i 's/INSERT INTO \"/INSERT INTO `/' cinder-data.sql
$ sed -i 's/\" VALUES/` VALUES/' cinder-data.sql
Setelah itu, gabungkan kedua file diatas:
$ cat cinder-data.sql >> cinder-schema.sql
Hidupkan kembali foreign check:
$ echo "SET foreign_key_checks = 1;" >> cinder-schema.sql
File cinder-schema.sql sudah berisi command yang conform dengan MySQL dan tinggal diimport. Kalau database belum ada, harus dibuat dulu dan kalau database sudah ada, table-table nya harus di drop dulu semua.
Import database, dengan asumsi user database-nya cinder dan nama databasenya cinderdb:
$ mysql -u cinder -p cinderdb < cinder-schema.sql
Restart Cinder:
# systemctl restart cinder-api.service
> cinder-volume.service
> cinder-scheduler.service
Sampai disini seharusnya Cinder sudah bisa berjalan dengan Mysql dan komunikasi antar block storage node sudah bisa.