Випуск rqlite 6.0, розподіленої стійкої до відмови СУБД на основі SQLite

Представлений реліз розподіленої СУБД rqlite 6.0, яка використовує SQLite як двигун зберігання і дозволяє організувати роботу кластера із синхронізованих між собою сховищ. З особливостей rqlite відзначається простота установки, розгортання та супроводу розподіленого відмовостійкого сховища, чимось схожого на etcd і Consul, але використовує реляційну модель роботи з даними замість формату ключ/значення. Код проекту написаний мовою Go та поширюється під ліцензією MIT.

Для підтримки всіх вузлів у синхронізованому стані використовується алгоритм досягнення консенсусу Raft. Rqlite використовує оригінальну бібліотеку SQLite та штатний драйвер go-sqlite3, поверх яких запускається прошарок обробляє запити клієнтів, що виконує реплікацію на інші вузли і відстежує досягнення консенсусу на вибір лідируючого вузла.

Зміни в БД можуть вноситися тільки вузлом, який обраний як лідируюча, але з'єднання з операціями запису можуть направлятися і до інших вузлів кластера, які повернуть адресу лідера для повторення запиту (у наступній версії обіцяють додати автоматичне прокидання звернення до лідера). Головний упор робиться на стійкість до відмови, тому СУБД масштабується тільки за операціями читання, а операції запису є вузьким місцем. Можна запустити кластер rqlite з одного вузла і таке рішення може використовуватися для організації доступу до SQLite поверх HTTP без надання стійкості до відмови.

Дані SQLite на кожному вузлі зберігаються над файлі, а пам'яті. На рівні шару з реалізацією протоколу Raft ведеться балка всіх команд SQLite, що призводять до зміни БД. Даний лог використовується при реплікації (реплікація на рівні відтворення запитів на інших вузлах), запуск нового вузла або відновлення після втрати зв'язності. Для скорочення розміру лога застосовується автоматична упаковка, яка запускається після заданого числа змін і призводить до фіксації на диску снапшота, щодо якого починає вестися новий лог (стан БД у пам'яті ідентично снапшоту + логу змін, що накопичився).

Особливості rqlite:

  • Простота розгортання кластера без необхідності окремої установки SQLite.
  • Можливість швидко отримати репліковане SQL-сховище.
  • Готовність до використання у робочих проектах (Production-grade).
  • Наявність HTTP(S) API, що дозволяє оновлювати дані в пакетному режимі та визначати провідний вузол кластера. Також надається інтерфейс командного рядка та можливість використання різноманітних клієнтських бібліотек, створених для SQLite.
  • Наявність сервісу визначення інших вузлів, що дозволяє створювати кластери динамічно.
  • Підтримка шифрування обміну між вузлами.
  • Можливість налаштування рівня перевірки актуальності та узгодженості даних під час читання.
  • Опціональна можливість підключення вузлів у режимі тільки для читання, які не беруть участь у визначенні консенсусу та використовуються для збільшення масштабування кластера за операціями читання.
  • Підтримка власної форми транзакцій з урахуванням об'єднання команд у одному запиті (транзакції з урахуванням BEGIN, COMMIT, ROLLBACK, SAVEPOINT і RELEASE не підтримуються).
  • Підтримка створення гарячих резервних копій.

У новому випуску внесено значні архітектурні зміни, спрямовані на підвищення надійності кластера за рахунок покращення процесу направлення запитів на читання та запис до коректних вузлів кластера. Вузли rqlite можуть мультиплексувати між собою кілька логічних з'єднань, використовуючи TCP-з'єднання, встановлені між вузлами протоколом Raft. Якщо запит вимагає повноважень лідируючого вузла, але надісланий вторинному вузлу, вторинний вузол може визначити адресу лідера і передати його клієнту без виконання розрахунку консенсусу за протоколом Raft.

Зміна також дозволила позбутися окремого компонента для синхронізації метаданих та виключити окрему обробку стану Raft та метаданих. Вторинні вузли тепер надсилають запити до вузла-лідера лише за необхідності, коли потрібно дізнатися адресу лідируючого вузла. В API надано можливість отримання інформації про стан інших вузлів у кластері. До інтерфейсу командного рядка додано команду «.sysdump».

Джерело: opennet.ru

Додати коментар або відгук