The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

14.06.2021 16:41

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

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

Изменение также позволило избавиться от отдельного компонента для синхронизации метаданных и исключить отдельную обработку состояния Raft и метаданных. Вторичные узлы теперь направляют запросы к узлу-лидеру только по необходимости, когда нужно узнать адрес лидирующего узла. В API предоставлена возможность получения информации о состоянии других узлов в кластере. В интерфейс командной строки добавлена команда ".sysdump".

  1. Главная ссылка к новости (https://www.philipotoole.com/r...)
  2. OpenNews: Доступен Dqlite 1.0, распределённый вариант SQLite от компании Canonical
  3. OpenNews: В рамках проекта LiteTree развивается вариант SQLite с поддержкой ветвления БД
  4. OpenNews: Уязвимость в SQLite, позволяющая удалённо атаковать Chrome через WebSQL
  5. OpenNews: Проект DuckDB развивает вариант SQLite для аналитических запросов
  6. OpenNews: Выпуск СУБД SQLite 3.35
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/55326-rqlite
Ключевые слова: rqlite, sqlite
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (50) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 17:02, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +11 +/
    Кто уже использует в проде сколько данных в итоге потерялось?
     
     
  • 2.4, menangen (?), 17:31, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • –2 +/
    В отличии, от раста, написано на Go и прекрасно работает!
     
     
  • 3.7, Аноним (7), 20:14, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Rust - есть игра и есть ЯП, rqlite - СУБД. Но это не важно. Главное на чем они все написаны, в ту корзину и отправляются, верно?
     
     
  • 4.41, Аноним (41), 10:39, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • –6 +/
    Даже если нигде не упоминается, Rust никак не дает покоя бездарям.
    На Rust все прекрасно пишется и работает, даже еще лучше.

    Но если бездари Go с большим-большим трудом как-то освоили (точнее еще как-то могут делать вид, что они его освоили), то Rust им вообще никак не по зубам, они там вообще ничегошеньки не понимают (даже чтобы сделать вид). Поэтому только о нем и думают, как они им так мешает просто лишь фактом своего существования, он везде им мерещится. Просто навязчивой мыслью становится, даже если никто не упоминает.

     
  • 3.8, ПлюсоманПерешедшийНаРаст (?), 20:21, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • –8 +/
    >написано на Go и прекрасно работает

    Не смешите мои клешни хддд

     
  • 3.27, Аноним (27), 07:24, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Ну как раз доверия больше Расту, чем Го
     
     
  • 4.52, Аноним (27), 10:17, 16/06/2021 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Интересно, кто эти обиженные жизнью минусующие?
    Или в мире и правда есть слепцы, которые считает какой-то там Го лучше РАСТА?))
     
  • 3.50, Mike Lee (?), 16:36, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    CAP-теорема на го как то иначе работает да?
     

  • 1.3, Аноним (3), 17:30, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    > возможность использования различных клиентских библиотек, созданных для SQLite

    Не вижу такого в документации. Есть только

    > It is also technically possible to read the SQLite file directly, but it's not officially supported.
    > While not officially supported, if you run a node in on-disk mode, you can read the SQLite file directly.

    А ведь если было бы можно читать и писать через немодифицированные библиотеки для SQLite, это был бы реальный прорыв - любой софт, поддерживающий SQLite, можно сделать отказоустойчивым в плане хранилища.

    Конечно, обычно такой софт поддерживает и постгрес (к которому можно нагородить patroni), но для какой-нибудь графаны это явный оверкилл.

     
  • 1.6, Аноним (6), 17:39, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Rqlite использует оригинальную библиотеку SQLite и штатный драйвер go-sqlite3

    Что значит "штатный"? Это обёртка сишной либы, написанная mattn.

     
     
  • 2.9, Урри (ok), 20:49, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    У автора (https://github.com/mattn/go-sqlite3) так и написано: "sqlite3 driver for go using database/sql".

    И по факту там не обертка, а чуть ли не весь код переписан (пример - https://github.com/mattn/go-sqlite3/blob/master/sqlite3.go).

    Я этого в упор не понимаю - зачем?? Ну вот мне надо было, я за вечер написал обертку над sqlite на лиспе. И хотя маршалер там не особо быстрый (типы все конвертировать сначала туда, а потом назад), на скорости это никак не отразилось, так как львиная доля работы запросов - это кишки бд, а не передача ей параметров. Зачем все на го переписывать? Неужели не было достаточно сишные функции пробросить?

     
     
  • 3.10, neAnonim (?), 20:55, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • –2 +/
    любители rust, go, c++, etc фанатики цель которых переписать все что написано на c.
     
     
  • 4.42, Аноним (41), 11:00, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Что бы где бы ни было, у этого всегда будут свои фанатики.

    Фанатики все переписывают и переделывают.

    А обычные специалисты просто пишут на Rust то, что на C не написано, и что на С было писать слишком трудоемко. И у них это получается, но фанатикам из других "лагерей" это очень сильно не нравится, и постоянно тревожит, что у кого-то где-то что-то получается, но не у них.

    А то что больше на С писать не надо, так это Джоэл Спольски еще благословил, если что. Хотя для фанатиков разумные аргументы бессмысленны.

     
     
  • 5.45, Аноним (45), 13:14, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +3 +/
    >Джоэл Спольски еще благословил

    Мнение вантузоида очень важно для нас.

    >Джо́эл Спо́льски — программист и писатель. Известен прежде всего как автор блога «Джоэл о программном обеспечении», в котором он обсуждает вопросы программирования, прежде всего — под Windows. В 1991—1994 годах он занимал должность менеджера по продуктам в команде Microsoft Excel.

    Я уж грешным образом подумал: "что это за неизвестный авторитет в мире Юникс-лайков".

     
     
  • 6.49, Аноним (41), 15:50, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ключевое слово здесь неизвестный для _вас_ Подумали И уже решили, вам сразу ... большой текст свёрнут, показать
     
  • 3.12, Антон (??), 21:59, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Выглядит именно как обертка
     
     
  • 4.36, Аноним (36), 09:53, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Посмотри код по ссылке.
     
  • 3.31, Аноним (6), 08:26, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >И по факту там не обертка, а чуть ли не весь код переписан

    Там именно обёртка.
    >Зачем все на го переписывать?

    cgo довольно проблемная штука и к тому же весьма медленная.

     

  • 1.11, Аноним (11), 21:52, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    >> Готовность для использования в рабочих проектах (Production-grade).
    >> В новом выпуске внесены значительные архитектурные изменения

    Ну ну.

     
  • 1.13, Аноним (11), 22:01, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Для тех кого тошнит от GO могут попробовать https://github.com/canonical/dqlite на С от известной конторы. Судя по описанию один в один.
     
     
  • 2.14, Аноним (11), 22:03, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • +5 +/
    А, не, отличия всё же есть
    How does dqlite compare to rqlite?
    The main differences from rqlite are:

    Embeddable in any language that can interoperate with C
    Full support for transactions
    No need for statements to be deterministic (e.g. you can use time() )
    Frame-based replication instead of statement-based replication

     
  • 2.15, Аноним (11), 22:05, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    В FAQ они даже написали что сначала тоже взяли ГО, но потом поплевались и написали на С
    https://dqlite.io/docs/faq
     
     
  • 3.17, anonymous (??), 23:03, 14/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Только плевались не столько на сам Go, а на то, что вызов Сишных функций из Go обладает требует блокировки goroutine (ибо Си не поддерживает концепции goroutine). Не очень понятно зачем они использовали Си из Go в высокопроизводительных участках кода с высокой параллельностью. В целом, на любом языке можно выстрелить себе в ногу, особенно если пытаться использовать из него Си :)
     
     
  • 4.20, Аноним (36), 00:22, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Я из лиспа использую - норм все и ничего не отстреливается.
     
     
  • 5.26, Аноним (26), 07:15, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну так это в основном у го проблема, любой другой язык лучше всего разгоняется нейтив кодом на си (или плюсах на крайняк). Я так навскидку и не назову иных случаев, когда притащить нейтив не выгодно.
     
     
  • 6.32, ыы (?), 08:57, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Маленький инлайн ассемблер всплакнул в уголке...

    То есть если у Майбаха нет дырки куда можно вставить заводную рукоятку от трактора- то это проблемы Майбаха...
    Ок... :)

     
     
  • 7.34, Аноним (26), 09:13, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Си тоже надо разгонять, он тоже очень тормозит. Но обычно людей устраивает ускорение до уровня си, тем более что на си проще написать любые объёмы логики и проблем не будет, а на ассебмлере придётся писать только отдельные операции и накладные расходы на разработку велики. Либо же готовый сишный код и так уже ускорен или дёргает оптимизированный ассемблер. А есть вообще языки, которые позволяет эффективно ускоряться нейтивом на асме, но не позволяют подключать си?
     
  • 5.28, lockywolf (ok), 08:14, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    За базар надо отвечать. Ну-ка покажи свой гитхаб/сурсфордж. Где ты там что пишешь на лиспе?
     
     
  • 6.35, n00by (ok), 09:22, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Это он просто перефразировал правило Гринспена.
     

  • 1.16, Онаним (?), 22:49, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    "Поддержка собственной формы транзакций на базе объединения команд в одном запросе (транзакции на базе BEGIN, COMMIT, ROLLBACK, SAVEPOINT и RELEASE не поддерживаются)."

    "Данные SQLite на каждом узле хранятся не в файле, а в памяти"

    Go'споди...
    Какой же ужас эта ваша хипстерская рыба.

     
     
  • 2.33, ыы (?), 09:02, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Для Вас можем предложить Oracle или MS Sql - там BEGIN, COMMIT, ROLLBACK и т.д. поддерживаются...
     
     
  • 3.38, Аноним (38), 10:03, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    А из постгреса и многих других уже выпили?
     
     
  • 4.39, ыы (?), 10:17, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    в постгрес нативную кластеризацию не завезли.. а многие другие- не OLTP...
     
  • 3.46, Онаним (?), 13:26, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Мне MySQL хватает и SQLite.
     

  • 1.18, Аноним (18), 23:28, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Go, HTTP, Rest API

    Всё понятно. Обезьянки поектуны

     
     
  • 2.21, Аноним (21), 00:45, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    можно подумать, ты, трепло, сделать хоть что-то близкое к десятой части от данного проекта по сложности, качеству и пользе
     

  • 1.19, Аноним (-), 23:42, 14/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Но зачем, когда есть https://github.com/canonical/dqlite
    ?
     
  • 1.22, Док (?), 01:10, 15/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Я пробовал и это и dqlite. Но поскольку запись только с одного узла то это бесполезно почти. Мне нужен такой вариант: бд на серваке и бд на моем ноуте. Я пишу в свою бд а потом это должно автоматом реплицироваться при соединении.  Оказалось это невозможно)))
     
     
  • 2.23, Your Mama (?), 01:15, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Но тогда у тебя RO-реплика на серваке. Возьми MySQL и не мучайся.
     
  • 2.24, Аноним (24), 01:45, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Это ты очень круто взял. Это полноценная распределённая база данных.

    Во всяком случае все эффекты и сложность распределенных БД здесь есть.

    Такое есть только у Mongodb, когда они Realm купили.

    Насколько я знаю ничего другого нет и я найти не смог.

    Эти ещё что-то https://objectbox.io обещают.

    Но как я понимаю это очень сложная задача, rocket science.

    Сложнее чем обычные распределённые БД

     
  • 2.25, Анончик (?), 05:15, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    >запись только с одного узла

    можете писать в pouchdb.
    вообще оно вам не надо, рассматривайте db на стороне сервера как промежуточное хранилище клиента а не полноценную наспределенную БД.

     
  • 2.29, lockywolf (ok), 08:15, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Вроде Access так умеет.
     
  • 2.30, Онаним (?), 08:18, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Возьми MySQL/MariaDB и настрой репликацию, да.
     
  • 2.53, pansa3 (?), 03:22, 25/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Так умеет Lotus/Domino . Но это очень сильное и дорогое колдунство.
     

  • 1.37, ыы (?), 09:53, 15/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что то из описания непонятно какой уровень изоляции транзакций.
     
     
  • 2.40, ыы (?), 10:29, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    >This is why rqlite offers selectable read consistency levels of none, weak, and strong. Each is explained below.

    Да, как же без собственноумственно придуманных названий обойтись...
    А может просто не в курсе как это должно называться?

     
  • 2.47, Онаним (?), 13:26, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    60-й
     
     
  • 3.48, ыы (?), 13:42, 15/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    такого нет.
     

  • 1.44, Аноним (44), 12:48, 15/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Очередная Говёшка
     
  • 1.51, Аноним (51), 07:04, 16/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    > Код проекта написан на языке Go и распространяется под лицензией MIT.

    зокапывойте, очередной одноразовый пук

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру