LSM-деревоВ інформатиці журнально-структуроване дерево зі злиттям (також відоме як LSM-дерево або LSMT[1] ) — це структура даних, яка надає швидкий доступ по індексу в умовах частих запитів на запис (наприклад при роботі з журналами транзакцій). LSM-дерева, як і інші дерева пошуку, підтримують пари «ключ-значення». LSM-дерева зберігають дані у двох або більше окремих структурах, кожна з яких оптимізована для роботи з носієм даних на якому вона буде зберігатись; Синхронізація даних між цими двома структурами проходить ефективно, в пакетах. Проста версія LSM-дерева – дворівневе дерево – складається з двох деревоподібних структур C0 та C1. C0 менше за розміром і зберігається повністю в оперативній пам'яті, а C1 знаходиться в незалежній пам'яті. Нові записи вставляються у C0. Якщо після вставки розмір C0 перевищує певне задане граничне значення, безперервний сегмент видаляється з C0 і зливається з C1 на пристрої постійного зберігання. Хороша продуктивність досягається за рахунок того, що дерева оптимізовані під своє сховище, а злиття здійснюється ефективно і групами по кілька записів, використовуючи алгоритм, що нагадує сортування злиттям.
Проста версія LSM-дерева – дворівневе дерево – складається з двох деревоподібних структур C0 та C1. C0 менше за розміром і зберігається повністю в оперативній пам'яті, а C1 знаходиться в незалежній пам'яті. Нові записи вставляються у C0. Якщо після вставки розмір C0 перевищує певне задане граничне значення, безперервний сегмент видаляється з C0 і зливається з C1 на пристрої постійного зберігання. Хороша продуктивність досягається за рахунок того, що дерева оптимізовані під своє сховище, а злиття здійснюється ефективно і групами по кілька записів, використовуючи алгоритм, що нагадує сортування злиттям. Більшість LSM-дерев, що використовуються на практиці, складаються з багатьох компонентів. Рівень C0 (назвемо його MemTable) зберігається в оперативній пам'яті і є мутабельним. Зазвичай він представлений у вигляді дерева і виступає як буфер записів. А рівень C1 представлений у вигляді не одної, а декількох таблиць, що збережені у незалежній пам'яті. Коли MemTable досягає певного розміру, вона повністю записується на диск і формує нову таблицю. А вміст поточної MemTable обнуляється. Оскільки з часом кількість таблиць на диску буде рости, щоб уникнути періодично таблиці на диску об'єднуються (або ущільнюються). Організація даних на дискуОскільки дані на диску не перезаписуються, то вони можуть бути організовані в структуру, яка буде максимально оптимізована для запитів на читання. Зазвичай дані організовують у Таблицю Сортованих Рядків (Sorted String Table чи SSTable). Цей формат передбачає, що всі ключі будуть сортовані, та існуватиме тільки одна пара «ключ-значення» в межах одної таблиці/файлу. Таким чином можна досягти наступних переваг:
Пошук данихПошук значення по ключу проводиться в першу чергу в MemTable, оскільки там знаходяться найактуальніші дані. Якщо ж в MemTable ключ не знайдений, то пошук має бути проведений в усіх таблицях на диску. Певний ключ може з’являтися серед декількох таблиць, і яке значення з наявних варто повернути як результат, залежить від програми. Деяким програмам просто потрібна найновіша пара «ключ-значення» з заданим ключем. Деякі програми повинні певним чином об'єднувати значення, щоб отримати сукупне значення. Наприклад, в Apache Cassandra кожне значення представляє рядок у базі даних, а різні версії рядка можуть мати різні набори стовпців. [1] Щоб знизити час виконання запитів, система повинна уникати ситуацій, коли виконується занадто багато підзапитів до кожної таблиці SSTable. Оскільки пошук в LSM-дереві може бути повільним, у випадку якщо ключ відсутній в базі даних (тому що пошук має бути проведений в MemTable, а також усіх SSTable), зазвичай попередньо робиться перевірка на наявність ключа за допомогою Фільтра Блума. Це дозволяє суттєво зменшити навантаження на базу даних. Оновлення і видалення данихВ LSM-деревах вставка, оновлення і видалення даних це операції, які не потребують пошуку наявного в сховищі значення. Натомість вставка і оновлення просто додають нове значення по ключу, а під час виконання запиту на читання як результат повертається тільки найновіша пара «ключ-значення». Оскільки таблиці на диску не можуть бути змінені (окрім операції ущільнення), операція видалення є особливим випадком операції вставки. Для того щоб значення по ключу вважалося видаленим, проводиться операція вставки спеціального «запису видалення» (також відомий як tombstone). В такому випадку, під час виконання запиту на читання, система відкидає всі значення які "старші" за «запис видалення». Джерела
|