Wydano rozproszoną bazę danych rqlite 7.0, która wykorzystuje SQLite jako silnik przechowywania i pozwala na zorganizowanie pracy klastra z synchronizowanymi magazynami. Do cech rqlite należy łatwość instalacji, wdrażania i utrzymania rozproszonego, odpornego na awarie magazynu, który jest w pewnym sensie podobny do etcd i Consul, ale wykorzystuje relacyjną model danych zamiast formatu klucz/wartość. Kod projektu napisany jest w języku Go i jest rozpowszechniany na licencji MIT.
Aby utrzymać wszystkie węzły w synchronizowanym stanie, stosowany jest algorytm osiągania konsensusu Raft. Rqlite korzysta z oryginalnej biblioteki SQLite i sterownika go-sqlite3, na których działa warstwa obsługująca zapytania klientów, wykonująca replikację do innych węzłów i monitorująca osiągnięcie konsensusu w wyborze węzła lidera.
Zmiany w bazie danych mogą być wprowadzane tylko przez węzeł wybrany jako lider, ale połączenia do operacji zapisu mogą być kierowane również do innych węzłów klastra, które zwrócą adres lidera do powtórzenia zapytania (w następnej wersji obiecują dodać automatyczne przekierowanie do lidera). Główny nacisk kładziony jest na odporność na awarie, dlatego baza danych skalowalna jest tylko pod względem operacji odczytu, natomiast operacje zapisu są wąskim gardłem. Można uruchomić klaster rqlite z jednego węzła, a takie rozwiązanie może być używane do organizacji dostępu do SQLite przez HTTP bez zapewnienia odporności na awarie.
Dane SQLite na każdym węźle są przechowywane nie w pliku, ale w pamięci. Na poziomie warstwy z realizacją protokołu Raft prowadzony jest dziennik wszystkich poleceń SQLite, które prowadzą do zmiany bazy danych. Dziennik ten jest wykorzystywany podczas replikacji (replikacja na poziomie odtwarzania zapytań na innych węzłach), przy uruchamianiu nowego węzła lub do odzyskiwania po utracie łączności. Aby zmniejszyć rozmiar dziennika, stosowana jest automatyczna kompresja, która uruchamiana jest po osiągnięciu określonej liczby zmian i prowadzi do utworzenia migawki, w odniesieniu do której prowadzony jest nowy dziennik (stan bazy w pamięci jest identyczny z migawką + nagromadzonym dziennikiem zmian).
Cechy rqlite:
- Łatwość wdrażania klastra bez potrzeby osobnej instalacji SQLite.
- Możliwość szybkiego uzyskania replikowanej bazy danych SQL.
- Gotowość do użycia w projektach produkcyjnych.
- Dostępność HTTP(S) API, umożliwiającego aktualizację danych w trybie wsadowym oraz określenie węzła lidera klastra. Oferowany jest również interfejs wiersza poleceń oraz biblioteki klienta dla różnych języków programowania.
- Dostępność usługi do wykrywania innych węzłów, umożliwiającej dynamiczne tworzenie klastrów.
- Wspieranie szyfrowania wymiany danych między węzłami.
- Możliwość konfigurowania poziomu sprawdzania aktualności i spójności danych podczas odczytu.
- Opcjonalna możliwość podłączania węzłów w trybie tylko do odczytu, które nie biorą udziału w ustalaniu konsensusu i są używane do zwiększenia skalowalności klastra w operacjach odczytu.
- Wsparcie dla własnej formy transakcji na podstawie łączenia poleceń w jednym zapytaniu (transakcje oparte na BEGIN, COMMIT, ROLLBACK, SAVEPOINT i RELEASE nie są wspierane).
- Wsparcie dla tworzenia gorących kopii zapasowych.
W nowym wydaniu:
- Dodano wsparcie dla automatycznego klastrowania rqlite z użyciem nowej usługi wykrywania węzłów, która może działać na bazie rozproszonych magazynów Consul i etcd. Usługa umożliwia węzłom rqlite automatyczne odnajdywanie się nawzajem — administrator wystarczy, że uruchomi kilka węzłów na różnych serwerach, podając wspólny adres klastra Consul lub etcd (na przykład „example.com:8500”), a węzły zostaną automatycznie połączone w klaster. Węzeł lidera okresowo aktualizuje w magazynie Consul lub etcd informacje o swoim adresie, co pozwala na późniejszą zmianę lidera bez konieczności prze konfiguracji pozostałych węzłów, a także dodawanie nowych węzłów nawet po zmianie lidera. Wsparcie dla starej usługi wykrywania węzłów (tryb odkrywania), działającej na bazie AWS Lambda, zostało zaprzestane.
- W interfejsie CLI można podać jednocześnie kilka hostów — jeśli pierwszy węzeł będzie niedostępny, nastąpi próba połączenia z kolejnymi hostami.
- Przeprojektowano kod do analizy argumentów wiersza poleceń rqlited.
- Zaprzestano używania przestarzałego pakietu protobuf.
- Magazyn BoltDB, stosowany w implementacji protokołu Raft, został zastąpiony przez bbolt, fork projektu etcd.
Źródło: opennet.ru
