Перейти до вмісту

Riak

Матеріал з Вікіпедії — вільної енциклопедії.
Riak
ТипNoSQL, система керування базами даних типу «ключ—значення»
РозробникBasho Technologies (до 2017); спільнота розробників, зокрема OpenRiak
Перший випуск2009
Стабільний випуск3.4.1 (гілка OpenRiak) (29 червня 2026; 4 місяці тому (2026-06-29))
Версії3.0.16 (22 червня 2023)[1]
Операційна системаLinux
Мова програмуванняErlang
Стан розробкирозвивається спільнотою
ЛіцензіяApache License 2.0
Репозиторійgithub.com/basho/riak_core
Вебсайтopenriak.github.io/riak/

Riak (також Riak KV) — вільна розподілена NoSQL-система керування базами даних типу «ключ—значення», призначена насамперед для забезпечення доступності даних, відмовостійкості та горизонтального масштабування. На відміну від систем, у яких усі запити на запис проходять через головний вузол, Riak використовує децентралізовану архітектуру: будь-який вузол кластера може прийняти запит клієнта й координувати його виконання. Значеннями можуть бути не лише документи, а й довільні двійкові дані; тому визначати Riak виключно як документоорієнтовану СКБД неточно.[2][3]

Riak започаткувала компанія Basho Technologies. Програму переважно написано мовою Erlang із використанням бібліотек платформи Erlang/OTP. Її архітектура спирається на ідеї розподіленого сховища Dynamo[en], описаного інженерами Amazon у науковій праці 2007 року. Після припинення діяльності Basho у 2017 році проєкт продовжила підтримувати спільнота; з 2024 року окремим осередком розвитку став OpenRiak, пов'язаний із Erlang Ecosystem Foundation.[4][5][2]

Станом на жовтень 2026 року останній позначений як стабільний випуск у репозиторії OpenRiak — Riak KV 3.4.1 від 29 червня 2026 року.[6]

Історія

[ред. | ред. код]

Розробка Riak розпочалася наприкінці 2000-х років у Basho Technologies; перші публічні випуски з'явилися 2009 року. Першу стабільну версію Riak 1.0 компанія оголосила 30 вересня 2011 року. До її нововведень належали вторинні індекси та вдосконалення інструментів опрацювання даних.[7]

У версії 1.3, випущеній 2013 року, було додано механізм активного узгодження реплік (active anti-entropy). Він дає змогу виявляти розбіжності між копіями даних у фоновому режимі, а не лише під час читання об'єкта.[8]

У 2014 році вийшла Riak 2.0. Ця версія принесла розподілені типи даних на основі CRDT, можливість налаштовувати експериментальний режим сильної узгодженості для окремих груп даних, інтеграцію пошукової підсистеми Riak Search з Apache Solr та розширені засоби безпеки.[9][10]

У липні 2017 року Basho Technologies перейшла під управління призначеного судом керуючого через фінансові труднощі. У серпні стало відомо про придбання її активів компанією bet365, яка вже використовувала Riak. Новий власник оголосив намір відкрити код комерційних компонентів, зокрема засобів реплікації між центрами обробки даних. Після цього Riak розвивався як спільнотний проєкт, а частина раніше комерційних можливостей увійшла до відкритих випусків.[5][11]

У 2024 році сформувалася спільнота OpenRiak для відкритішої організації подальшої розробки. Її робочу групу підтримує Erlang Ecosystem Foundation. У січні 2026 року OpenRiak випустила Riak KV 3.4.0, до якої увійшли розширений інтерфейс запитів до вторинних індексів (Query API) та зміни в механізмі умовного запису; у червні того самого року — версію 3.4.1.[2][12][6]

Архітектура

[ред. | ред. код]

Розподіл даних

[ред. | ред. код]

Кластер Riak складається з кількох рівноправних серверних вузлів. Простір ключів відображається на кільце хеш-значень, поділене на логічні розділи. Кожним розділом керує віртуальний вузол (vnode) — процес Erlang, що обслуговує операції з відповідною частиною даних. Віртуальні вузли розподіляються між фізичними серверами; при зміні складу кластера призначення розділів і дані можуть переноситися між ними. Така організація ґрунтується на узгодженому хешуванні й дозволяє масштабувати сховище додаванням вузлів.[3][13]

Кількість розділів кільця задається в конфігурації та не дорівнює кількості фізичних серверів: один сервер зазвичай обслуговує багато віртуальних вузлів. Наприклад, у документації для старіших випусків типовий розмір кільця становив 64 розділи. Це параметр конфігурації, а не постійна характеристика всіх версій Riak.[14]

Реплікація та відновлення

[ред. | ред. код]

Riak підтримує реплікацію об'єктів між різними вузлами. Параметр n_val визначає кількість копій об'єкта (типово — три); параметри читання й запису дозволяють задавати, скільки відповідей від реплік слід дочекатися для завершення операції. Такий підхід дає змогу обирати компроміс між затримкою, доступністю та вимогами до підтвердження операцій. Водночас успішна відповідь на запис не означає автоматичної сильної узгодженості всіх копій.[15][16]

Коли вузол із потрібною реплікою недоступний, запит може бути переадресовано запасному розділу. Після відновлення основного вузла система передає накопичені дані на належне місце (hinted handoff). Механізм read repair перевіряє стан реплік під час читання, а active anti-entropy періодично зіставляє їх за допомогою дерев Меркла й виправляє виявлені розбіжності, у тому числі для даних, які давно не читали.[17][8]

Riak також має засоби реплікації та звіряння даних між окремими кластерами й центрами обробки даних. Міжкластерна реплікація є окремим механізмом і не тотожна зберіганню кількох копій усередині одного кластера.[2]

Модель узгодженості

[ред. | ред. код]

Базова модель Riak — eventual consistency (узгодженість зрештою): під час паралельних оновлень або мережевих збоїв репліки тимчасово можуть містити різні значення. Відповідно до теореми CAP, типовий режим Riak орієнтується на доступність і стійкість до розділення мережі. Якщо два клієнти незалежно змінюють той самий об'єкт, система залежно від налаштувань може зберегти кілька його версій (siblings) для подальшого узгодження прикладною програмою.[16][18]

Починаючи з Riak 2.0, у документації описано окремий експериментальний режим сильної узгодженості, в якому підтверджені операції з одним ключем є лінеаризовними й потребують кворуму реплік. Історична документація Riak прямо зазначала, що ця функція не призначена для промислового використання та несумісна з низкою інших підсистем. Її не слід ототожнювати зі звичайним налаштуванням кворумів читання й запису.[18]

Зберігання даних і програмні інтерфейси

[ред. | ред. код]

Дані Riak KV адресуються трійкою: тип бакета (bucket type), бакет (bucket) і ключ (key). Бакети виконують роль просторів імен; їхні типи задають параметри зберігання, зокрема кількість реплік та політику обробки кількох версій об'єкта. Значення для ключа розглядається передусім як непрозора послідовність байтів, тож застосунок може зберігати JSON, текст, документи або інші двійкові формати без обов'язкової єдиної схеми таблиць.[19][2]

Для роботи з об'єктами Riak надає програмні інтерфейси через HTTP та Protocol Buffers; базові операції включають створення, читання, оновлення та видалення об'єктів. Для різних мов програмування створювалися клієнтські бібліотеки. Додаткові інтерфейси залежать від версії та призначення конкретної підсистеми.[20][21]

Для фізичного зберігання Riak використовує змінні бекенди. Історично застосовувалися Bitcask та LevelDB; у сучасній гілці OpenRiak документація описує передусім Bitcask і Leveled. Вибір бекенду впливає на поведінку зберігання, використання пам'яті, індексування та експлуатаційні характеристики сховища.[22][16]

Індексація та типи даних

[ред. | ред. код]

Окрім звертання до значень за основним ключем, Riak підтримує вторинні індекси (secondary indexes, або 2i). У версії 3.4.0 спільнота OpenRiak запровадила новий Query API, що підтримує запити за діапазонами індексів, фільтрацію проєктованих атрибутів, поєднання кількох умов і агрегування результатів. Це не робить Riak реляційною СКБД: формування індексів і вибір стратегії запиту залишаються значною мірою відповідальністю застосунку.[12]

У Riak 2.0 з'явилися типи даних на основі CRDT (conflict-free replicated data types): лічильники, множини й мапи, що дають змогу автоматично узгоджувати визначені операції над репліками. Такі типи спрощують певні сценарії паралельних змін, але не усувають усіх обмежень розподілених транзакцій; зокрема документація OpenRiak 3.4 застерігає щодо повторних неідемпотентних оновлень та несумісності вбудованого Data Type API з новим Query API.[23][9]

У сімействі Riak 2.x існувала пошукова підсистема Riak Search 2.0 (розробницька назва Yokozuna), інтегрована з Apache Solr для повнотекстового індексування. Це історична можливість окремих версій, яку не слід плутати із сучасним Query API OpenRiak 3.4, заснованим на вторинних індексах.[24][12]

Пов'язані продукти

[ред. | ред. код]

Назва Riak історично використовувалася не лише для сховища Riak KV, а й для кількох споріднених програмних продуктів:

  • Riak Core (riak_core) — набір компонентів Erlang/OTP для побудови розподілених застосунків: керування кластером, кільцем, віртуальними вузлами та передаванням даних між ними. Ці компоненти лежать в основі Riak KV.[25]
  • Riak CS (Cloud Storage) — система зберігання великих об'єктів на основі Riak, що надавала інтерфейс, сумісний з Amazon S3, і підтримувала поділ об'єктів на блоки. Це окремий продукт, а не синонім Riak KV.[26]
  • Riak TS (Time Series) — різновид сховища, оптимізований для часових рядів, що підтримував визначення таблиць та обмежену підмножину SQL. Його розвиток і нумерація версій відрізнялися від Riak KV.[27]

Використання

[ред. | ред. код]

Riak застосовували для зберігання стану вебзастосунків, даних сеансів, повідомлень і списків контактів — сценаріїв, у яких важливі робота за відмов окремих серверів і розподіл даних між центрами обробки.[2]

У 2014 році британська Національна служба охорони здоров'я (NHS) запровадила Riak у модернізованій інфраструктурі Spine 2 замість раніше використовуваної реляційної бази даних Oracle Database.[28]

Компанія Riot Games у технічній публікації від січня 2016 року описала використання Riak для зберігання контактів та інших даних чату гри League of Legends. Розробники повідомили про перехід з MySQL на Riak, використання LevelDB, кількох реплік об'єктів та узгодження конкурентних записів на рівні застосунку. Наведені приклади підтверджують історичне використання Riak, але самі по собі не доводять, що названі організації застосовують її і в 2026 році.[29]

Особливості й обмеження

[ред. | ред. код]

Riak проєктувалася насамперед для доступності та передбачуваної роботи за часткових відмов, а не для реалізації повного набору реляційних операцій. За замовчуванням вона не гарантує миттєвої узгодженості всіх реплік. Програма, яка змінює той самий об'єкт паралельно з кількох місць, має враховувати можливі конфлікти, обирати відповідну модель їхнього розв'язання та правильно обробляти повторні запити.[16][18]

Пошук за вторинними індексами потребує додаткових ресурсів порівняно зі зверненням за ключем, а ефективність складних запитів залежить від структури індексів. Через це Riak доцільніше розглядати як спеціалізоване розподілене сховище, а не як універсальну заміну реляційним СКБД.[12]

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. ↑ Release 3.0.16 — 2023.
  2. 1 2 3 4 5 6 OpenRiak QuickDocs Introduction. OpenRiak QuickDocs (англ.). Процитовано 13 жовтня 2026.
  3. 1 2 Clusters. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  4. ↑ DeCandia, Giuseppe; Deniz Hastorun; Madan Jampani; Gunavardhan Kakulapati; Avinash Lakshman (2007). Dynamo: Amazon's Highly Available Key-value Store. Proceedings of the Twenty-First ACM SIGOPS Symposium on Operating Systems Principles (англ.): 205—220. doi:10.1145/1294261.1294281.
  5. 1 2 Claburn, Thomas (25 серпня 2017). If you wagered Bet365 would buy up Basho's remains, you'd be a big winner right now. The Register (англ.). Процитовано 13 жовтня 2026.
  6. 1 2 Riak KV 3.4.1 — OpenRiak Release. GitHub (англ.). 29 червня 2026. Процитовано 13 жовтня 2026.
  7. ↑ Riak 1.0 Is Officially Released!. Riak Blog (англ.). 30 вересня 2011. Процитовано 13 жовтня 2026.
  8. 1 2 Active Anti-Entropy. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  9. 1 2 Introduction to Riak KV 2.0. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  10. ↑ Riak Accelerates EMEA Growth, Powered by Riak 2.0. Riak Blog (англ.). 20 листопада 2014. Процитовано 13 жовтня 2026.
  11. ↑ Riak KV release notes (community releases). GitHub (англ.). Процитовано 13 жовтня 2026.
  12. 1 2 3 4 Riak KV — Query API. OpenRiak QuickDocs (англ.). Процитовано 13 жовтня 2026.
  13. ↑ Vnodes. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  14. ↑ Cluster Capacity Planning. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  15. ↑ Replication. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  16. 1 2 3 4 Riak KV — Initial Design Decisions. OpenRiak QuickDocs (англ.). Процитовано 13 жовтня 2026.
  17. ↑ Understanding riak_core: Handoff. Riak Blog (англ.). Процитовано 13 жовтня 2026.
  18. 1 2 3 Strong Consistency. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  19. ↑ Buckets. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  20. ↑ Riak KV — Object API. OpenRiak QuickDocs (англ.). Процитовано 13 жовтня 2026.
  21. ↑ Riak KV. Riak Documentation (англ.). Процитовано 13 жовтня 2026.
  22. ↑ Riak KV — Theory Guide. GitHub / OpenRiak (англ.). Процитовано 13 жовтня 2026.
  23. ↑ Riak KV — Other APIs: The Data Type API. OpenRiak QuickDocs (англ.). Процитовано 13 жовтня 2026.
  24. ↑ Using Search. Riak KV Documentation (англ.). Процитовано 13 жовтня 2026.
  25. ↑ basho/riak_core. GitHub (англ.). Процитовано 13 жовтня 2026.
  26. ↑ Riak CS vs. Riak. Riak Blog (англ.). 2 жовтня 2013. Процитовано 13 жовтня 2026.
  27. ↑ Riak TS. Riak Documentation (англ.). Процитовано 13 жовтня 2026.
  28. ↑ Clark, Jack (9 вересня 2014). NHS grows a NoSQL backbone and rips out its Oracle Spine. The Register (англ.). Процитовано 13 жовтня 2026.
  29. ↑ Ptaszek, Michal (13 січня 2016). Chat Service Architecture: Persistence. Riot Games Technology (англ.). Процитовано 13 жовтня 2026.

Посилання

[ред. | ред. код]