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

Відбувся реліз розподіленої СУБД rqlite 7.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, що дозволяє оновлювати дані в пакетному режимі та визначати провідний вузол кластера. Також надається інтерфейс командного рядка та клієнтські бібліотеки для різних мов програмування.
  • Наявність сервісу визначення інших вузлів, що дозволяє створювати кластери динамічно.
  • Підтримка шифрування обміну між вузлами.
  • Можливість налаштування рівня перевірки актуальності та узгодженості даних під час читання.
  • Опціональна можливість підключення вузлів у режимі тільки для читання, які не беруть участь у визначенні консенсусу та використовуються для збільшення масштабування кластера за операціями читання.
  • Підтримка власної форми транзакцій з урахуванням об'єднання команд у одному запиті (транзакції з урахуванням BEGIN, COMMIT, ROLLBACK, SAVEPOINT і RELEASE не підтримуються).
  • Підтримка створення гарячих резервних копій.

У новому випуску:

  • Додано підтримку автоматичного кластерингу rqlite з використанням нового сервісу визначення вузлів, який може працювати на базі розподілених сховищ Consul та etcd. Сервіс дозволяє вузлам rqlite автоматично знаходити один одного - адміністратору достатньо запустити кілька вузлів на різних серверах, вказавши загальну адресу кластера Consul або etcd (наприклад, example.com: 8500), і вузли автоматично будуть об'єднані в кластер. Вузол, що лідирує, періодично оновлює в сховищі Consul або etcd інформацію про свою адресу, що дозволяє в подальшому змінити лідера без необхідності переналаштування інших вузлів, а також додавати нові вузли навіть після зміни лідера. Підтримка старого сервісу визначення вузлів (Discovery mode), що працює на базі AWS Lambda, припинено.
  • У CLI інтерфейсі дозволено вказівку відразу кількох хостів - якщо перший вузол виявиться недоступним, буде здійснено звернення до наступних хостів.
  • Перероблено код для аналізу аргументів командного рядка rqlited.
  • Припинено використання застарілого пакету protobuf.
  • Сховище BoltDB, застосовуване у реалізації протоколу Raft, замінено на bbolt, форк від проекту etcd.

Джерело: opennet.ru

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