Порівняння архітектури Redis і Dragonfly

Всім привіт! Мене звати Борис і я Principal Engineer у компанії DragonflyDB. У цій статті я хочу дуже поверхово оглянути архітектуру Redis та Dragonfly.

Redis, сховище даних у пам’яті, яке є синонімом швидкості, заслужило свою репутацію завдяки блискавичній продуктивності. Але як і будь-який хороший спринтер, він чудово себе показує на коротких дистанціях. Коли перегони стають довшими, і гори даних накопичуються, Redis починає відчувати труднощі.

Горизонтальне масштабування через кластер додає рівень абстракції і вимагає деякого обмеження на розподіл ключів, що потребує складного управління. Також не завжди ефективне управління пам’яттю може спричинити раптові всплески її використання, які можуть призвести до ситуацій з нестачею пам’яті.

Ці обмеження призводять до збільшення витрат на інфраструктуру та проблем з обслуговуванням, перетворюючи початкове прискорення у довготривалу боротьбу.

Чи вас засмучують ці проблеми? Нас теж. Саме тому ми створили Dragonfly, наступне покоління сховища даних у пам’яті, створене для подолання обмежень Redis. Dragonfly зберігає швидкість, яка вам довподоби, але додає вертикальне масштабування, що потрібна для легкого оброблення великого масиву даних.

Крім того, його архітектура, ефективна з точки зору пам’яті, мінімізує всплески використання пам’яті і тримає ваші витрати на інфраструктуру під контролем.

Занурьмося трохи глибше у проблеми Redis та подивимось які інноваційні рішення, пропонує Dragonfly. Ми порівняємо та протиставимо відмінності між архітектурою Redis та Dragonfly. Швидкість важлива, але масштабованість та ефективність є ключами до перемоги у довготривалих перегонах.

Dragonfly shared-nothing архітектура проти однопотокового підходу Redis

Redis за замовчуванням є однопотоковою, event-driven системою. З таким підходом архітектура досить проста, але ця простота має свою ціну. Зі зростанням навантаження один потік стає вузьким місцем, обмежуючи продуктивність і масштабування.

Dragonfly обирає інший шлях, використовуючи багатопотокову архітектуру та підхід shared-nothing, щоб забезпечити вражаючу продуктивність і масштабованість.

Як Dragonfly досягає цього

Шардування та паралельна обробка: Dragonfly ділить усю базу даних на менші, незалежні секції, звані шардами. Кожен шард призначається окремому потоку, що дозволяє паралельну обробку запитів. Це усуває вузьке місце однопотоковості, яке обмежує Redis, дозволяючи Dragonfly обробляти значно більші навантаження.

Мінімальне блокування та синхронізація: архітектура shared-nothing мінімізує потребу в складних механізмах блокування та синхронізації, додатково підвищуючи продуктивність та знижуючи потенційні вузькі місця.

Асинхронні операції та затримка: Dragonfly не зупиняється на досягнутому. Він використовує асинхронні операції (з використанням io_uring під капотом) для завдань, як-от дисковий ввід/вивід. Це перемежовуюче виконання гарантує, що довготривалі завдання, як-от створення знімків бази, не впливають на відгук інших операцій, тримаючи систему швидкою навіть під великим навантаженням.

Абстрактний ввід/вивід та ефективні файбери: Dragonfly використовує власний фреймворк, який абстрагує операції вводу/виводу, використовуючи файбери з власним стеком для ефективного управління завданнями в кожному потоці. Це поєднання оптимізує використання ресурсів і гарантує обробку одночасних запитів без зайвих затримок.

По суті, багатопотокова архітектура Dragonfly з підходом shared-nothing та акцентом на асинхронні операції відкриває значні переваги в продуктивності та масштабованості порівняно з Redis, роблячи його привабливим вибором для вимогливих робочих навантажень.

Обробка запитів

Коли клієнт надсилає запит до Redis, система аналізує запит і формує об’єкт (використовуючи патерн команда), який містить усю відповідну інформацію. Тривалість життя цього об’єкта залежить від характеру команди: неблокуючої або блокуючої. Команди, що не блокують, обробляються негайно, тоді як команди, що блокують, виконуються Redis раз за разом, доки не будуть виконані їхні конкретні вимоги.

Dragonfly використовує транзакційну модель, яка відповідає його багатопотоковій архітектурі shared-nothing, полегшуючи асинхронну обробку запитів. Хоча цей транзакційний підхід може трохи збільшити середню затримку, поєднання асинхронних операцій та багатопотоковості значно підвищує загальну пропускну спроможність і знижує максимальну затримку.

На відміну від Redis, який послідовно обробляє команди, Dragonfly здатний виконувати кілька команд одночасно. Dragonfly оптимізує продуктивність, призупиняючи виконання файберу під час завдань доступу або модифікації даних, коли потрібно чекати на необхідні дані, тим самим знижуючи непотрібне споживання CPU на невдалі спроби.

Команди, що використовують кілька ключів, які потребують роботи через різні шарди, Dragonfly розділяє на окремі підкоманди. Кожна підкоманда містить ключі для одного відповідного шарду та виконується у відповідному потоці, а результати агрегуються та надсилаються назад клієнту.

Щоб забезпечити атомарність у багатоключових операціях, Dragonfly використовує останні наукові дослідження, конкретно алгоритм Very Lightweight Locking (VLL). Блокується кожен ключ, що бере участь у транзакції, щоб запобігти одночасному доступу. Транзакції, які намагаються отримати доступ до заблокованих ключів, ставляться в чергу, доки всі необхідні ключі не стануть доступними, забезпечуючи організоване виконання без конфліктів.

Збереження та реплікація

Безпечне створення знімків або реплікацій даних у пам’яті під час обробки одночасних записів може бути складним. Це особливо актуально для Redis, який може зіткнутися зі всплесками використання пам’яті та проблемами продуктивності під час створення знімків бази даних.

Redis використовує традиційний метод створення знімків, заснований на управлінні пам’яттю «copy-on-write», використовуючи виклик fork. Такий підхід може призвести до подвоєння використання пам’яті під час процесу, оскільки будь-яка зміна даних спричиняє копіювання сторінки пам’яті, що містить ці дані.

Відповідно під час великої кількості запитів на запис існує ймовірність, що вся використана пам’ять може бути продубльована. Такий сценарій може призвести до нестабільності системи та обмеження продуктивності, особливо в середовищах з інтенсивною активністю запису. Щоб уникнути цієї ситуації, Dragonfly використовує інший підхід з кількома ключовими особливостями:

  1. Версіонування: кожна клітина даних має номер версії, який збільшується з модифікаціями. При створенні знімку включаються лише клітини з номерами версій, старшими за версію знімка, забезпечуючи послідовність і уникаючи дублікатів.
  2. Асинхронна серіалізація: дані серіалізуються та записуються на диск асинхронно, запобігаючи блокуванню та дозволяючи одночасні записи.
  3. Передоновлення: оновлення спричиняє відправлення клітини даних до серіалізаційного потоку, якщо знімок активний, і клітина ще не була серіалізована, забезпечуючи збереження всіх клітин один раз.
  4. Без створення додаткових процесів чи потоків: Dragonfly уникає операції fork і дублювання пам’яті, результатом чого є стабільне використання пам’яті під час створення знімків.

Кластер

Redis та Dragonfly працюють однаково в режимі кластера. У режимі кластера обидві бази даних використовують підхід шардування, розподіляючи ключі між 16384 хеш-слотами. Хеш-слот ключа визначається шляхом взяття його CRC16 значення та застосування модуля 16384.

Кожен вузел кластера керує певною частиною цих хеш-слотів. Вузли Redis спілкуються один з одним за допомогою протоколу gossip, підтримуючи інформацію про стан кластера та власність на слоти. Наразі Dragonfly підтримує лише емульований режим кластера або статичні вузли кластера. Повний механізм управління кластером та міграції для Dragonfly перебуває у розробці.

Остаточна версія повинна мати наступну форму: розробляється контрольна панель, яка буде керувати всім кластером, вузли знають про конфігурацію кластера, але спілкуються лише з контрольною панеллю (деяке спілкування між вузлами можливе лише під час процесу міграції слотів).

Також потрібно додати, що режим кластера для Dragonfly є більш рідкісним випадком порівняно з Redis через можливість вертикального масштабування першого.

Висновки

Я надав базове порівняння між підходами архітектури Dragonfly та Redis, уникаючи надмірно складних деталей. Зокрема, я не заглиблювався в реалізацію хеш-таблиці Dragonfly та його більш ефективне управління пам’яттю, оскільки обговорення цих структур даних виходить за межі цієї статті. Однак, варто зазначити, що Dragonfly іноді може зменшити використання пам’яті більш ніж на 40%.

Основне, що потрібно взяти до уваги, це те, що Redis та Dragonfly мають принципово різні підходи. Основні цілі Dragonfly — не лише покращити продуктивність, але й спростити складність, підвищити ефективність використання пам’яті та знизити витрати для користувачів.

👍ПодобаєтьсяСподобалось9
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дякую за огляд! Я помітив підтримку Jedis. Чи була змога потестувати Lettuce зокрема Reactive API?

Нажаль я не відповім вам на це питання. Але можливо хтось із команди зможе допомгти у discord discord.com/invite/HsPjXGVH85

Чому існує JSON.NUMINCRBY, але немає JSON.NUMDECRBY?

Бо JSON.NUMINCRBY −1

В Linux є cat, але відсутній dog
Є man, але відсутній woman
Й так далі

Це геніально, дякую. Зараз вдвічі кількість GET зменшу

Якщо є more і less... наступна буде pofig?

Реквестирую сравнение по производительности с Aerospike.
Ато как бы во всех обзорах есть, кроме ваших вы себя с Аероспайк не сравниваете, подоход тот же, они старше на 10 лет.

Нажаль Aerospike не підтримує протокол і гарантії Redis, тому таке порівняння буде не дуже коректне.

Почему это оно будет некоректное если фичи те же?
Или вы хотите сказать что вы 100% редис эмулировали?
Какие такие гарантии не поддерживает аероспайк?

Я не дуже знаюся на Aerospike, але якщо система команд інша, то зазвичай і гарантії трохи інші. Наша мета підтримати 100% сумісність з редіс окрім кластеру і ми дуже близькі до цього.

Ну вы обьявили ту же цель, что и проект от 2011 который все ресурсы показывают при поиске redis vs dragonfly.
Естественно вы должны ожидать что вас будет сравнивать с ним. Или как это по вашему работает?

Наша мета надати альтернативу Редіс, без його недоліків.

Ну так аероспайк и есть такая альтернатива.

Якщо він не підтримує систему команд Редіс, то він не дуже альтернатива, бо треба перероблювати як мінімум код, як максимум архітектуру

Я не совсем понял, почему в проекте нет инструкции по инсталяции? )

Я имею в виду стандартный файл INSTALL который по умолчанию присутсвует почти во всех линукс проектах.
Я нашел с четвертого захода в гугл github.com/...​docs/build-from-source.md
И все равно, имея 25+ лет опыта инсталяции не смог пока ничего сделать под Сentos.
Оно просто тихо и мирно говорит все ок. Но не делает того, что в инструкции написано. В частности вот на такущем этапе нет каталога build-opt и в нем естественно нефига.

Якщо ви встановили всі потрібні пакети, то

./helio/blaze.sh -release
cd build-opt && ninja dragonfly

або якщо ви хочете дебаг версію

./helio/blaze.sh
cd build-dbg && ninja dragonfly

мають все зробити

Якщо все одно є якісь проблеми, приходьте до нас у Діскорд

Так а откуда мне знать все или нет. если каталог не создает и ошибок не пишет.
Мают, не роблять.
В общем извините, мое свободное время закончилося на сегодня и потестить я не успел. Уже зовут.
Создайте все же инстал хотя бы с ссылкой на getting started. Гугл не находит ту страничку по install dragonfly(большой пройоб СЕО имхо).

О, тільки місяць назад переїхали з Redis на Dragonfly і поки дуже подобається. Швидкість норм! Приємно бачити що до цього проекту долучені українці.

Наша команда дуже мультинаціональна, більше всього людей з Ізраелю, Українці на другому місці). Дуже класно чути гарний фідбек про наш продукт, якщо можете дайте посилання на ваш проект. Цікаво подивитись)

Наш продукт testomat.io
Останнім часом зіткнулись з тим, що конекти в Redis почали провисати і якісь мінімальні операції стали виконуватись довше ніж запити в базу. Звісно, причина була не в самому редісі, а десь помилка в коді — але ця ситуація спонукала нас поглянути на альтернативи і про Dragonfly я дізнався із вікі Sidekiq. Зарахунок багатопоточності Dragonfly швидко розрулив довгі конекти до редісу. І хоча потім виявилось, що ми самі спамили себе реквестами — Dragonfly вирішили лишити бо все ж він дуже прудкий. Поки політ нормальний. Дякую за класну БД!

Хлопцы еще такой вопрос, если надо две структы данных заджойнить, это вообще реально?

Не впевнений, що повністю зрозумів ваше питання. Але подивіться на скріпти, може це вам допоможе.

Redis не имеет встроенной поддержки SQL-запросов, поэтому джойн двух структур данных напрямую невозможен. правда можно через кастыли...

Я вас зрозумів і думаю за допомогою транзакційної моделі драгонфлай це реально реалізувати у майбтньому. Ви можете залишити таку пропозицію на гітхабі проекту і якщо ми побачимо велику зацікавленність у цьому зі сторони комьюніті або від наших клієнтів ми розглянемо можливіть імплементації цієї фічі.

можно еще так,вынести джойн в приложение, которое использует Redis. Приложение может загружать данные из Redis, выполнять джойн и сохранять результат обратно в Redis.Это решение является простым, но оно может увеличить нагрузку на приложение. Только помоему это гавнокод!

Использование Рэдис для данных которые требуют джойнов — уже говнокод.
Вообще для 99% операций для которых используется Рэдис обычный innodb index lookup выполняется за такое же время.

Несогласен с вашим утверждением! Потому что хлопцы:
Во-первых, Redis может быть эффективным решением для некоторых случаев использования, связанных с джойнами:
Небольшие наборы данных: Если ваши наборы данных достаточно малы, Redis может выполнять джойны достаточно быстро, без значительного снижения производительности.
Простые джойны: Redis может эффективно выполнять простые джойны, например, по одному или двум полям.
Кэширование: Redis может использоваться для кэширования результатов джойнов, что может значительно повысить производительность, если джойны выполняются часто.
Во-вторых, утверждение, что InnoDB index lookup всегда выполняется за такое же время, как и Redis, не совсем верно:
Сложность запроса: InnoDB index lookup может быть медленнее, чем Redis, для сложных запросов, особенно тех, которые требуют сканирования больших объемов данных.
Размер набора данных: Производительность InnoDB index lookup может снижаться с увеличением размера набора данных.
Тип индекса: Тип индекса, используемого в InnoDB, может влиять на производительность lookup.
В целом, выбор между Redis и InnoDB, которую вы упомянули, для юзания данных, требующих джойнов, может также быть зависим от нескольких факторов:
Размер набора данных: Для небольших наборов данных Redis может быть более эффективным.
Сложность запроса: Для сложных запросов Redis может быть более эффективным.
Частота выполнения запроса: Если джойны выполняются часто, кэширование результатов в Redis может повысить производительность.
Требования к производительности: Если требуется максимально высокая производительность, InnoDB может быть более подходящим выбором.
Поэтому джойны в этих случаях самое оно...

Может, но обычно уже есть на проекте RDS и она тоже эффективно это решает.
На практике когда говорят что может быть медленее, обычно просто не знают как готовить.
Я не спорю, что приготовленная джунами редис работает быстрее приготовленной джунами RDS.
Если вам понадобился джойн — в 99% случаев вам не особо то надо было редис.

Нет и еще раз нет.
Во-первых, Redis может быть более эффективным, чем RDS, даже для опытных разработчиков:
Производительность: Redis может выполнять запросы быстрее, чем RDS, особенно для сложных запросов или запросов, кэшируемых в Redis.
Масштабируемость: Redis может более эффективно масштабироваться, чем RDS, особенно при горизонтальном масштабировании.
Простота использования: Redis может быть проще в использовании, чем RDS, особенно для разработчиков, которые уже юзают NoSQL базы данных.
Во-вторых, использование RDS не всегда является «правильным» решением:
Стоимость: RDS может быть дороже Redis, особенно для больших наборов данных.
Сложность: RDS может быть более сложным в настройке и управлении, чем Redis.
Производительность: RDS может быть менее производительным, чем Redis, для некоторых случаев использования.
В целом, выбор между Redis и RDS зависит от нескольких факторов:
Если требуется максимально высокая производительность, Redis может быть более подходящим выбором.
Масштабируемость: Если требуется высокая масштабируемость, Redis может быть более подходящим выбором.
Стоимость: Если бюджет ограничен, RDS может быть более подходящим выбором.
Сложность: Если требуется простота использования, Redis может быть более подходящим выбором.
Далее, Redis может использоваться для кэширования результатов запросов RDS, что может значительно повысить производительность.
Redis может использоваться для хранения и анализа данных в реальном времени, например, для бигдата или машинлернинга.
И самое главное, хлопцы, Redis не является заменой RDS. Redis лучше всего юзается для случаев использования, где требуется высокая производительность, масштабируемость и простота использования. RDS лучше подходит для случаев использования, где требуется высокая надежность, безопасность и соответствие требованиям шё у Вас на проекте.

как пример такое решение...
redis.xadd("stream1“, “*”, {key1 = “value1”, key2 = “value2”})
redis.xadd("stream2“, “*”, {key1 = “value1”, key3 = “value3”})

local results = redis.xreadgroup("group“, “consumer”, {streams = {“stream1”, “stream2”}, count = 10})

for _, message in pairs(results) do
print(message.id, message.fields.key1, message.fields.key2, message.fields.key3)
end

Выше описан Redis Streams — новый тип данных, который был добавлен только в Redis 5.0.
Streams могут использоваться для реализации джойна двух структур данных. Поэтому он и хуже, т.к. нормально это не разюзаешь, даже если очень нужно...

Redis: кращий вибір, якщо вам потрібна висока продуктивність при читанні даних і широкий спектр функцій.Може використовуватися як база даних для невеликих проектів.Має однопоточну архітектуру. Використовує модель Master-Slave для реплікації даних. Має віртуальну пам’ять для зберігання даних.
Dragonfly: кращий вибір, якщо вам потрібна висока масштабованість, багатопоточність та підтримка структури даних. Добре підходить для кешування, систем реального часу, аналітики даних.Може використовуватися як база даних для великих проектів,ML. Зазвичай має кращу продуктивність при записі даних. Легко масштабується завдяки своїй багатопотоковій архітектурі.Використовує модель ключ-значення, але також підтримує структури даних, такі як списки, множини та хеш-таблиці. Має багатопотокову архітектуру. Використовує модель Sharded-Cluster для реплікації даних. Зберігає дані на диску.

Лучше будет как для меня...

Не зовсім згоден з вами. Перед тим як почати працювати над Драгонфлай я був фанатом редіс і він чудово може використовуватись для великих проектів. Ці два продукти можна замінити один на одного і все буде працювати. Але при використанні редіс вам знадобиться витратити більше часу на проектування системи і на підтримку інфраструктури, бо Редіс має свої проблеми із всплесками використання па’мяті, про які я згадував у статті.
Також якщо вже бути максимально відвертим редіс при правильному використанні швидший за драгонфлай. Але як я і писав у висновку

Основні цілі Dragonfly — не лише покращити продуктивність, але й спростити складність, підвищити ефективність використання пам’яті та знизити витрати для користувачів.

І наші клієнти обирають наз якраз за цими принципами.

извините, что сумбурно, но пишу пока интернет есть. Вот почему были сделаны эти выводы:
1. Однопоточная архитектура:
Redis имеет однопоточную архитектуру, что может стать bottleneckом при высоких нагрузках.Это может привести к снижению производительности и задержкам при обработке запросов.
2. Ограниченная масштабируемость:
Redis не так хорошо масштабируется, как другие NoSQL базы данных, такие как Cassandra или MongoDB. При увеличении объема данных и количества пользователей производительность Redis может начать падать.
3. Отсутствие встроенной поддержки sharding:
Redis не имеет встроенной поддержки sharding, что может затруднить горизонтальное масштабирование базы данных. Sharding — это метод разделения данных на несколько узлов, что позволяет улучшить масштабируемость.
4. Ограниченная функциональность:
Redis — это простая база данных ключ-значение, которая не обладает такой же функциональностью, как другие NoSQL базы данных. Redis не поддерживает такие функции, как ACID-транзакции, SQL-запросы и сложные структуры данных.
5. Не подходит для OLTP:
Redis не подходит для OLTP (онлайн-обработка транзакций) приложений из-за отсутствия ACID-транзакций. OLTP приложения требуют гарантии согласованности данных, которую Redis не может обеспечить.
6. Ограниченная безопасность:
Redis имеет ограниченные возможности безопасности по сравнению с другими NoSQL базами данных.Redis не имеет встроенной поддержки аутентификации, авторизации и шифрования данных.
7. Не подходит для хранения больших объемов данных:
Redis не подходит для хранения больших объемов данных из-за своей архитектуры.
Redis лучше подходит для кеширования и других задач, где требуется высокая производительность при небольших объемах данных.
8. Снижение производительности при большом количестве ключей:
При большом количесвте ключей производительность Redis может начать падать.
Это связано с тем, что Redis использует хеш-таблицу для хранения данных, и при большом количестве ключей хеш-коллизии могут стать проблемой.
9. Не подходит для геопространственных данных:
Redis не имеет встроенной поддержки геопространственных данных.
Если вам нужно хранить и обрабатывать геопространственные данные, вам нужно будет использовать стороннее решение.
10. Не подходит для аналитики данных:
Redis не подходит для аналитики, я об этом уже писал выше данных из-за отсутствия SQL-запросов и сложных структур данных.
Если вам нужно использовать Redis для аналитики данных, вам нужно будет использовать стороннее решение.
я тоже использовал раньше редис с нодой. В любом случае будет интересно ознакомиться с мнением знающих людей.

Я вас зрозумів, але хочу підкреслити що драгонфлай використовує той самий набір команд, що і редіс, тому більшість обмежень для редіс (але не всі) накладаються і на драгонфлай в тому чи іншому роді.

Тут є порівняння, і воно показує що декілька пунктів (1, 2, 3) невірні www.reddit.com/...​s_hits_back_at_dragonfly

Вы имеете в виду, что Redis использует модель обработки запросов с одним потоком только для обработки команд.Он может масштабироваться вертикально путем увеличения мощности сервера (CPU, RAM), кроме того Sharding может быть сложным в настройке и управлении.

Нет, Редис деплоится на машину как кластер из нескольких процессов (по процессу на ядро процессора) — и при этом работает существенно быстрее, чем многопоточный Дрегонфлай, который занимает все ядра процессора. И шардинг там обещают автоматический, вроде redis.io/docs/management/scaling

Развертывание и управление кластером Redis может быть сложнее, чем управление одноэкземплярным Redis или Dragonfly.
Вам нужно будет настроить балансировку нагрузки, мониторинг, репликацию данных и другие компоненты кластера. Это может быть особенно сложно для небольших команд или тех, кто не имеет опыта работы с кластерами баз данных.
+
Дополнительные расходы:
Развертывание кластера Redis потребует больше ресурсов, чем одноэкземплярный Redis или Dragonfly.Вам потребуется больше серверов, что увеличит расходы на оборудование и электроэнергию. Вам также потребуется больше времени и ресурсов на управление и поддержку кластера.
+
Потенциальные проблемы с производительностью:
Хотя кластер Redis может быть более производительным, чем одноэкземплярный Redis, при определенных условиях он может быть менее производительным, чем Dragonfly.
Например, если ваша рабочая нагрузка имеет много операций записи, кластер Redis может испытывать узкие места. Вам нужно будет тщательно настроить и оптимизировать кластер Redis, чтобы добиться максимальной производительности.
К тому же хлопцы, edis не имеет встроенной поддержки sharding, что может ограничить его масштабируемость.Вам нужно будет использовать сторонние библиотеки или решения для реализации sharding в Redis.Это может быть сложно и может привести к проблемам с совместимостью и производительностью.

К тому же хлопцы, edis не имеет встроенной поддержки sharding, что может ограничить его масштабируемость.

Цитирую доку редиса: Redis Cluster provides a way to run a Redis installation where data is automatically sharded across multiple Redis nodes. redis.io/docs/management/scaling

тама написано, что Redis Cluster, который является де-факто стандартом для масштабирования Redis, обеспечивает автоматический sharding данных на нескольких узлах Redis. Хотя Redis не имеет встроенной поддержки sharding на уровне ключа, Redis Cluster обеспечивает автоматический sharding данных на нескольких узлах Redis.

1) Чим ваша типу shared-nothing багатопоточність ліпша за реально shared-nothing шардінг в конкурента? В обох варіантах ефективно будуть використовуватись усі ядра процесора.

2) Ви писали за серіалізацію, що там відбуваються паралельні асинхронні записи. Залізо (HDD/SSD) хіба дозволяє проводити кілька записів одночасно?

3) Ви кажете, що уникаєте дублювання пам’яті під час збереження даних. Давайте розглянемо наступний сценарій:
— Є блок даних А0 в пам’яті, вже збережений на диск
— Його змінили в пам’яті в стан А1
— Запустили зберігання на диск, відпрацьовує DMA A1 -> SSD
— Прийшов запит від користувача, котрий хоче змінити стан А1 у А2
— Що ви робите?
* Ви можете або скопіювати дані з А1 в новий блок, і на нього накласти зміни, дочекатись завершення DMA на диск і тоді деаллокувати старий блок. Але це — дуплікація пам’яті.
* Або ви можете заблокувати запит користувача і дочекатись завершення роботи з диском, але це — збільшення латенсі, ще й воно може бути неконтрольованим в умовах паралельної асинхронної роботи з диском кількох потоків.
Перший варіант суперечить вашим заявам, другий — суттєво погіршує SLA.

1) Наш підхід дає легке вертикальне масштабування, у редіс це вже кластер і додатковий рівень абстракції і проблем, бо не можна написати один запит для даних у різних слотах
2) паралельні записи можна робити без проблем бо є буферизація на декількох рівнях (ОС, файлова система, хардварний рівень), але не забувайте що серіалізація використовується також при реплікації та міграції де швидкості можуть бути вищими за SSD, і навіть SSD вже дають таку швидкість яку важко утилізувати у один потік.
3) мені здається ви трохи мене не зрозуміло, бо про дублювання пам’яті я кажу у контексті COW паттерну при використанні fork. те що ви описуєте працює однаково що у нас що і в redis незалежно від виклику fork.

1) Вони мають для цього зовнішню тулзу github.com/...​iSearch/tree/master/coord
3) Copy-on-write fork автоматизує те, що я описав. Бо в форканутий процес не йдуть записи — тому йому ніколи не потрібно дуплікувати блоки пам’яті вручну — це робиться автоматично. Ви не форкаєтесь, тому ті ж блоки пам’яті дуплікуєте вручну коли відбувається запит на запис. Де принципова різниця?

1) робити кластер для однією машини це воркараунд до недоліків їх архітектури і все одно нікуди не дінеться проблема запитів до різних слотів і все одно це додатковий рівень абстракії
2) COW і є проблема і не важливо чи вона автоматизована чи ні, бо будь який запис на сторінку пам’яті (4КБ а може і навіть 2МБ якщо використовуються huge pages) дублює не один запис, а всю сторінку. Ми не дуплікуємо блоки пам’яті як ви кажете ні вручну, ні автоматично. Якщо дані були оновлені до збереження, так як у нас є версіонування даних нам не потрібен виклик fork ми одразу зберігаємо найактуальніші дані, якщо дані було оновлені після серіалізації, ми робимо так як і редіс і використовуємо журнал ніякий додатковий перезаписа не робиться і пам’ять не дублюється.

1) Це не недолік архітектури, а вдала абстракція — власне, ідеальна імплементація shared-nothing. Такий кластер прозоро скейлиться з одної машини на датацентр. Приклади такої архітектури — Ерланг з Еліксиром, Акка, навіть та ж ScyllaDb, здається. Себто, це у вас буде зайвий рівень абстракції та дуплікація функціональності якщо ви колись заімплементите кластер — бо матимете 2 незалежних рівні shared-nothing.
2) Ви пропустили випадок оновлення даних *під час* серіалізації — власне, якщо форк робиться для серіалізації, то це і є основним випадком, і форк гарантує консистентність даних — бо усі сторінки пам’яті належать до одного снепшота.

1) Ще раз повторюсь, ця абстракція додає обмежень у вигляді неможливості використання різних слотів у одному запиті. Вона може бути наскільки завгодно вдалою, але вона накладає обмеження. У нас кластер є, але поки він статичний, тобто немає міграції слотів і це зараз знаходиться у розробці.
2) Я нічого не пропустив оновлення під час серіалізації в нашій архітектурі неможливо, бо до даних має доступ тільки один потік у будь який проміжок часу (це і є shared-nothing). Серіалізація і оновлення робляться асинхронно (асинхронно не дорівнює паралельно) за допомогою файберів тому сериалізація і оновлення даних одночасно не можливо фізично.

1) Наскільки я розумію, ось це github.com/...​iSearch/tree/master/coord надає інтерфейс схожий на інтерфейс пошукового запиту. Точніше не скажу, бо з Редісом не працював. Можливо, ви можете навести приклад запиту, котрий не працює з RSCoordinator.
2) Себто, ви блокуєте (усі?) запити користувача на запис даних («оновлення»?) на весь час збереження бази на диск («серіалізація»?)?

1) я не працював з RSCoordinator, але якщо обмеження накладається на стороні Redis ви не можете його обійти за допомогою фреймворків не втративши швидкості.
2) ми нічого не блокуємо ми використовуємо версіонування для розуміння що має бути серіалізовано. Файбери це механізм який дозволяє запобігти блокування потоку і коли один із файберів блокується за якоїсь причини (або відмовляється від процесорного часу) планувальник заміняю один файбер на інший не блокуючи потік. Тому файбер у якому відбувається серіалізація і файбер який оновлює дані ніколи не працюють одночасно, але чередуються час від часу.

1) Наскільки я зрозумів, вони експозять той самий інтерфейс пошуку, що й Редіс. А втрати швидкості на об’єднанні даних будуть у будь-якій shared-nothing системі, включно з вашою. Лише ви про них вголос не кажете.
2) У вас дані зберігаються блоками чи деревом?
— якщо блоками, то ви маєте скопіювати блок, щоб вносити в нього зміни під час його збереження на диск.
— якщо деревом, то у вас неефективна робота з кешом процесора.
Приклад що я маю на увазі:
* Є блоки даних А0, Б0, В0.
* Запускається копіювання на диск.
* Запустився ДМА для асинхронного збереження А0 на диск.
* Юзер пише в А, воно має змінитись на А1.
* Завершилося збереження А0 на диск.
* Запустилося збереження Б0 на диск.
* Юзер пише в В, воно має змінитись на В1.
* Завершилося збереження Б0 на диск.
* Юзер пише в Б, воно змінюється на Б1.
* Запустилось збереження В1 на диск.
* Завершилося збереження В1 на диск.
Питання: що маємо на диску? Якщо там А0, Б0, В0 — то ви десь маєте витрачати оперативку на версіонування блоків, або працювати не з блоками, а з деревом чи з патчами. Якщо ж на диску А0, Б0, В1 — то снепшот втратив причинно-наслідковий зв’язок записів (запис А1 випав з снепшоту, а він передує до В1).

1) Я в статті написав що ми використовуємо транзакційну модель, і так вона зменшує трохи швидкості, тому я нічого не замовчував
2) Якщо ви хочете так глибоко розібратись то зверніться до нашої документації github.com/...​blob/main/docs/rdbsave.md

1) То чим тоді підхід Редісу, котрий надає оркестратор окремим модулем, гірший за ваш із вбудованим оркестратором між шардами?
2) Вона не пояснює юз кейс, котрий я запропонував. Або пояснення десь всередині проектно-специфічної термінології, котрою вона оперує.

1) це частина системи і все працює із коробки, завдяки багатопочтоності ми можемо зменшити максимальну затримку, запити можуть оброблятись паралельно (бо парсінг і початкова обробка запиту може бути проведена будь яким потоком і тільки працювання із хеш таблицює потребує конкретного потоку за я ким закріплений шард)
2) Мені шкода, що ви не захотіло ретельно перечитати документацію, бо я бачу що вам це дуже цікаво. Також ви міксуєте різні рівні абстракції у своєму питанні, що не дуже коректно. Ми не використовуємо DMA напряму, все робиться за допомогою IO_URING і файберів. У документації що я надав є відповідь. Також у статті я писав що ми використовуєми версіонування і так на це йде трохи оперативки, але метадані є і в редіс і як показують наші тести ми використовуємо менше оперативки ніж редіс навіть без серіалізації. Всі тести ви можете повторити самостійно. Також на ДОУ колись вже була стаття де порівнювалось використання пам’яті і швидкість редіс і dragonfly. Наші бенчмарки можете подивитись тут github.com/...​readme-ov-file#benchmarks

1) Тоді вам потрібен окремий потік на парсінг запитів. Наприклад, на 8-ядерному комп’ютері Редіс запустить 8 шардів, а ви — всього 6, щоб мати ще 2 службових потоки. Інакше, якщо ви запустите також 8 — то не матимете вільних ядер для парсингу. Де помилка в моєму тлумаченні?
2) Суть в тому, що ви не можете змінювати дані в той час, коли вони записуються на диск. І клієнт або має чекати, доки ви допишете, або ви маєте дуплікувати масив даних.
3) Ви наводите бенчмарк проти одного інстанса Редіса коли реальний бенчмарк має проводитись проти локального кластеру де кількість інстансів дорівнює кількості ядер процесора.

Денис я втомився вам відповідати, ви робите постійно хибні допущення і тлумачете як завгодно те що написано або те що я вам намагаюсь пояснити. Будь ласка почитайте, що таке файбери і як вони працюють.
1) нам не потрібен окремий потік для парсінгу, бо в нас є файбери.
2) нам не треба їх змінювати, клієнту не треба чекати і нам не треба дуплікувати, всі відповіді вже є в статті і в документації будь ласка перечитайте ще раз.
3) Я надав вам бенчамарк щоб ви подивились на витрати пам’яті, ви дійсно вважаєте що використання кластеру зменшить використання пам’яті для редіс?

1) Тоді як ваші файбери в одному потоці дають перевагу в перформансі над однопоточним Редісом?
2) Нема відповідей, і ви не можете показати як працює система для конкретного прикладу.
3) Я думав, що бенчмарк був для порівняння швидкості, як ви написали

порівнювалось використання пам’яті і швидкість редіс і dragonfly

. Редіс наводить результати справжнього бенчмарка, де вони на 40 ядрах набагато швидші, ніж Дрегонфлай на 64:
The Dragonfly benchmark compares a standalone single process Redis instance (that can only utilize a single core) with a multithreaded Dragonfly instance (that can utilize all available cores on a VM/server). Unfortunately, this comparison does not represent how Redis is run in the real world. As technology builders, we strive to understand exactly how our technologies compare to others, so we did what we believe is a fair comparison and compared a 40-shard Redis 7.0 Cluster (that can utilize most of the instance cores) with Dragonfly, using a set of performance tests on the largest instance type used by the Dragonfly team in their benchmarks, AWS c6gn.16xlarge. In our trials, we saw Redis achieve 18% — 40% greater throughput than Dragonfly, even when utilizing only 40 out of the 64 vCores.
redis.com/...​hitecture-13-years-later

1) ніяк, файбери створені не для ціього
2) Ви змушуєте мене розжовувати і переписувати документацію вам у коментах . У снапшоті будуть збережені ті дані які будуть у таблиці на момент її обходу згідно версіонування. Всі зміни які трапились протягом сериалізації проходять через журнал, так само як і в редіс при репликації.
3) Я ніде не наводив порівняння швидкості і не робив стверджень стосовно, чи швидше драгонфлай ніж редіс кластер, в перше чергу я писав статтю про порівняння архітектури. Я не розумію навіщо ви надаєте мені статтю про порівняння швидкості редіс і драгонфлай, яка не має відношення до теми моєї статті.

1) Тоді яким чином

завдяки багатопочтоності ми можемо зменшити максимальну затримку, запити можуть оброблятись паралельно (бо парсінг і початкова обробка запиту може бути проведена будь яким потоком і тільки працювання із хеш таблицює потребує конкретного потоку за я ким закріплений шард)

ваша багатопоточність швидша за shard-per-core в Редісу?
2)

У снапшоті будуть збережені ті дані які будуть у таблиці на момент.

На момент початку реплікації бази чи на момент початку реплікації блоку пам’яті? Якщо під час реплікації клієнти можуть робити записи, то ви вже маєте дуплікувати певні блоки пам’яті, щоб було куди записувати, і це — саме те, що редіс робить завдяки copy-on-write. Інакше вам нема куди записати зміни.
3) Ви писали в статті

Dragonfly зберігає швидкість, яка вам довподоби

але по факту Редіс надає близько +40% швидкості на −40% кількості ядер.
Ви писали

Зі зростанням навантаження один потік стає вузьким місцем, обмежуючи продуктивність і масштабування.

але по факту продуктивність Редісу вища і, на відміну від вашої бази, він довільно масштабується.
Ви писали

Це усуває вузьке місце однопотоковості, яке обмежує Redis, дозволяючи Dragonfly обробляти значно більші навантаження

але по факту Редіс підтримує вище навантаження ніж Дрегонфлай.
Ви писали

По суті, багатопотокова архітектура Dragonfly з підходом shared-nothing та акцентом на асинхронні операції відкриває значні переваги в продуктивності та масштабованості порівняно з Redis, роблячи його привабливим вибором для вимогливих робочих навантажень.

але це неправда www.reddit.com/...​s_hits_back_at_dragonfly

1) ви порівнюєте кластер з не кластером, це різні речі і кластер має обмеження
2) ви знову видумуєте якісь теорії заговору. Просто проведіть тест і подивіться що там по пам’яті. Відкрийте наш код і подивіться чи є там дуплікація. Я вже вам написав ми використовуємо журнал, а ви все одно намагаєтесь щось додати.
3) Для бізнесу не має великої різниці ± 40% або навіть у 2 рази, бо інакше не використовувались ні джава ні PHP ні С#, а все було б написано на С++. Важливі тільки кости, масштабованість і легкість підтримки. Те що ви наводите мені лінки на якісь пости не доводить те що ви пишете, що редіс підтримує вище навантаження і що я написав якусь брехню. Я вам ще раз повторю один інстанс і кластер це не одне те саме. Ми вийшли із бети пів року тому і у нас вже є клієнти і цікавість до нашого продукту продовжує підвищуватись, що каже про те що ми на правильному шляху.

1) Багатопроцесний кластер та багатопоточна shared nothing — це одне й те ж, доки ви дотримуєтесь shared nothing парадигми. Хіба що вони можуть скейлитись на декілька комп’ютерів з комунікацією через мережу, а ви — ні. Бо shared nothing значить, що ви не можете шарити пам’ять між потоками. Так само, як ноди кластеру не можуть шарити пам’ять.
2) Ви використовуєте журнал, щоб знайти поточні значення для запиту клієнта? Тоді це повільніше, ніж робота з масивом, та ще й для створення снепшота вам потрібно виділити масив та пройти журналом — себто, у вас буде повільніше збереження даних, і для збереження доведеться виділяти пам’ять. Ви ж не журнал зберігаєте в снепшот?
Код бази читати — то дуже кепський варіант. Я колись намагався — так майже за два роки нічого й не зрозумів.
3) З вашої документації, ваш кластер потребує ручного налаштування: Dragonfly only provides a data plane (which is the Dragonfly server), but we do not provide a control plane to manage cluster deployments.
www.dragonflydb.io/...​ng-dragonfly/cluster-mode
на відміну від редіса: Moving hash slots from a node to another does not require stopping any operations; therefore, adding and removing nodes, or changing the percentage of hash slots held by a node, requires no downtime.
redis.io/docs/management/scaling
Себто масштабованість в них є, а у вас — під питанням. І при цьому в них кращий перформанс.

1) Я не розумію ви просто тролите, чи не читаєте те що написано. Один інстанс і кластер не одне й те саме бо кластер має обмеження. У нас теж є підтримка кластера з комунікацією через мережу (нема міграції). shared nothing означає що нам не потрібна синхронізація для доступу до даних, а не те що пам’ять не шариться між потоками (не шариться тільки хеш таблиця)
2) журнал використовується щоб зберегти патч для снапшоту і він додається до снапшоту, це може призводити для трохи більшого використання жорсткого диску, але дуже не значного. збереження даних у нас не повільніше.
3) ви можете вважати все що завгодно, міграція слотів буде скоро вже завершена і у нас. Але у нас вертикальна масштабованість із коробки, а в редіс із бубном і я не розумію, що ви мені хочете довести. Що якщо попотіти із редіса можна вижати більше перформансу то я це знаю, але ми як раз і хочемо зробити продукт з яким не треба буде потіти і він буде дешевший у використанні.

1)

shared nothing означає що нам не потрібна синхронізація для доступу до даних, а не те що пам’ять не шариться між потоками (не шариться тільки хеш таблиця)

Цитую з Вікіпедії: Nodes do not share (independently access) the same memory or storage.
en.wikipedia.org/...​ared-nothing_architecture
Ось ще старе визначення: shared nothing (SN), i.e. neither memory nor peripheral storage is shared among processors www.scylladb.com/...​red-nothing-architecture
Якщо ви шарите пам’ять між потоками з можливістю запису до неї, то це не є shared nothing за означенням, і яким чином ви тоді позбулись синхронізації?
2) Ви знову не відповідаєте на питання. Сценарій в тому, що клієнт під час запису на диск надіслав команду, котра змінює дані. Ви кажете про журнал — у вас всі дані зберігаються в журналі, і для кожного запиту потрібно пройти максимум весь журнал? Складність читання O(N)? Себто, ви не тримаєте в пам’яті таблицю поточних значень змінних?

1) Мені здається ви мене не зрозуміли, за визначеням всі потоки мають одну пам’ять на всіх. Сама база даних розбита на шарди, з кожним шардом працює лише один потік. Але є якісь задачі та алгоритми які можуть використовувати якісь дані поміж різними файберами і потоками, але ці дані стосуються роботи системи, а не бази даних. Також потоки можуть допомогати один одному і передавати роботу один одному за допомогою файберів і таким чином один поток може отримати дані іншого.
2) в пам’яті існують тільки самі актуальні дані. Журнал тримає зміни до снапшоту. Для журналу, як і до снапшоту використовується лише одна операція читання всіх даних, якщо ми тільки запустили інстанс або робимо реплікацію ніяких O(N), тільки O(1) для снапшоту і O(1) для журналу. Після вичитування снапшоту, всі патчі послідовно аплаяться. Тобто ще раз один раз прочитали снапшот, один раз прочитали журнал і все.

O(1) для журналу

Це яким чином? Прочитати весь журнал — це O(N) по довжині журналу. І вам потрібно це робити на кожен запит на читання.
Якщо ваше збереження на диск робить наступні операції:
* Мерж журналу в старий снепшот в пам’яті
* Переключення на новий журнал
* Скидання оновленого снепшоту на диск
тоді я не бачу, чому Редіс мав би десь виїдати багато пам’яті з COW бо там під час скидання на диск буде лише наростати новий журнал — одна сторінка пам’яті.

нащо мені читати журнал на кожен запит для читання, у мене всі актуальні дані у хеш таблиці. читати журнал це одна операція і вона не ділиться, ми не вичитуємо окремі якісь ключі з журналу.
Редіс виїдає багато, бо COW. Якщо у вас сервер у продакшені, будуть запити на запис, якщо модифікується один байт, вся сторінка копіюється, тому якщо у вас є навантаження із записами, імовірність, що продублюється вся БД буде дуже високою, це і є проблемою.

Себто, у вас в оперативці є наступні сутності:
* снепшот
* журнал
* хеш таблиця
і кожен запис оновлює і хеш таблицю і журнал?
А для збереження на диск ви мержите журнал в снепшот?
Тоді в Редіса кількість зайвих витрат пам’яті з COW буде нульовою, бо він також спочатку вмержить журнал в снепшот, а потім форканеться з вже готовим снепшотом. І журнал буде рости лише в батька, а дитина деаллокує хеш таблицю, журнал та скине готовий снепшот без змін на диск.

Звісно ні, в оперативці тільки хеш таблиця. Снепшот і журнал робляться тільки коли треба зробити бекап або в процесі реплікації і вони ніколи не зняходяться в оперативці. У випадку бекапу вони одразу пишуться на диск, у випадку реплікацію одразу надсилаються мережею, не займаючи навіть і мегабайту в оперативці.

Себто, під час реплікації ви копіюєте хеш таблицю в снепшот, під котрий окремо виділяєте пам’ять? А коли Редіс форкається, то проблема що в нього (на два процеси) один снепшот та дві таблиці, а у вас — один снепшот, одна таблиця і один журнал в оперативці?

ні, ніякого виділення пам’яті. Нащо? сериалізація проходить через кожен елемент і він одразу йде у стрім.

А стрім — це що? Абстракція у вакумі? Звичайно, якщо вам не ліньки блокувати хеш на купу часу, поки буфера стріму дампляться на диск — тоді стрім може жити у маленькому буфері. А якщо хочете відпустити хеш швидко — то ваш стрім має вмістити дані з усієї хеш таблиці, відповідно — його розмір рівний розміру снепшота, і вам треба цю пам’ять виділити. Навіть якщо ви про це не здогадуєтесь, і працюєте з абстрактним об’єктом у вакумі.

Ще раз повторю: ми використовуємо IO_URING і файбери, тому операції сериалізації і доступу до БД спокійно чередуються у одному потоці, нічого не блокується. Стрім не має вміщати усю хеш таблицю, бо є версіонування, пам’ять виділяти не треба. Наш стрім не абстрактний, він написан нами.

Стрім пише прямо з хеш таблиці на диск в побітовому форматі хеш таблиці? Як інакше він може її переформатувати без виділення буферу?

Як хеш таблиця суміщується з версіонуванням? Це в вал’ю замість одного ключа лежить список версій ключа?

стрім пише за допомогою IO_URING у сериалізованому форматі, ніякого побітового формату. IO_URING вже цільцевий буфер більше нам і не треба. кожен ключ має свою версію, яка може тільки зростати, тобто кожен наступний запис у БД візьме глобальну версію додасть 1 і встановить для ключа.

1) Серіалізація відбуваєьтся прямо в кернельний буфер? Я думав, що він приймає вказівники на дані, котрі потрібно записати.
2) Повертаємочь до мого прикладу. Ви вже серіалізували ключ А. Юзер перезаписав ключ А і потім ключ Б. Тепер ви серіалізуєте ключ Б. В снепшоті буде новий Б та старий А. Чи ви потім ще раз пройдетесь хеш таблицею, і окремо до снепшоту допишете ще лог з новим ключем А?

Звісно ні, у стрімі є свій невеличкий буфер який перевикористовується кожного разу і вже з нього дані поступаються у io_uring.
У снепшоті буде Б та старий А. У журналі буде новий А. все вірно

Цитую:

ні, ніякого виділення пам’яті. Нащо? сериалізація проходить через кожен елемент і він одразу йде у стрім.
стрім пише за допомогою IO_URING у сериалізованому форматі, ніякого побітового формату. IO_URING вже цільцевий буфер більше нам і не треба.

Ви всерйоз порівнюєте константний маленький буфер для одного ключа з повним дублюванням на десятки гігабайт у редіс?

Ви всерйоз порівнюєте константний маленький буфер для одного ключа з повним дублюванням на десятки гігабайт у редіс?

Ви пишете ключі на диск по-одному?

не відповім точно, бо у буфері можуть бути оптимізації наприклад записувати по 1МБ. Але якщо ключ великий він запишеться один.

Ось ми вже дізнались що ви навіть мегабайт виділяєте. А не «пам’ять виділяти не треба».

Порой в комментариях еще больше инфы чем в самой статье:) Спасибо Денису за довольно качественные вопросы и аргументы! Борис, на самом деле после прочтения всего треда у меня появился вопрос, извиняюсь если я чтото дублирую, но: в чем тогда килер фича драгонфлая? Как я понимаю Редис однопоточный, ок — но все на продакшне все подымают кластера в которых куча машин, и проблема с однопоточностью решается... Перефразирую — что бы заставило меня перейти с редиса?

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

1) Их многопоточность не быстрее, она просто есть, что позволяет не использовать кластер пока есть возможность просто увеличивать размер машины. Во многих ситуациях это буквально навсегда.
2) Они дублируют не блоки, а отдельные записи. Да, скорее всего это менее эффективно с точки зрения скорости, но для этого продукта это не важно — по всей видимости они выбрали нишу стабильного вертикально масштабируемого кеша. Транзакции тоже хорошо сочетаются с этой нишей.

С другой стороны, на Реддите пишут, что такую базу тянут туда, где критична стабильность системы. И как раз деплой на одну машину со стабильностью не стыкуется, в отличии от кластера.

Не дуже розумію при чому тут стабільність і кластер. Якщо треба надійність є реплікація, якщо не вистачає потужності однієї машини піднімають кластер, що ви маєте на увазі під стабільністю?

Реплікація і є підвидом кластеру.

У нас реплікація працює без проблем, поставили одну машину як майстера і додали ще пару для реплік, зручно і швидко. Не бачу проблем і кластер не потрібен.

Clustering, in the context of databases, refers to the ability of several servers or instances to connect to a single database. An instance is the collection of memory and processes that interacts with a database, which is the set of physical files that actually store data.

Clustering offers two major advantages, especially in high-volume database environments:

Fault tolerance: Because there is more than one server or instance for users to connect to, clustering offers an alternative, in the event of individual server failure.
Load balancing: The clustering feature is usually set up to allow users to be automatically allocated to the server with the least load.

Майстер з репліками та з менеджером, котрий перемикає клієнтів на репліки і створюють кластер за означенням.

Стыкуется так же как и деплой постгреса на одну машину. Вопрос в том насколько быстро можно подняться из бекапа, нужно ли держать реплику, насколько долгий даунтайм позволителен. И в случае кеша все конечно менее критично потому что его потеря приводит к деградации производительности, а не утрате пользовательских данных.

Ну и не нужно смешивать кластер мастер-реплика с фейловером и кластер с шардированием — второе это на порядок более сложная система.

невеличкий коментар стосовно другого пункту

Они дублируют не блоки, а отдельные записи. Да, скорее всего это менее эффективно с точки зрения скорости, но для этого продукта это не важно — по всей видимости они выбрали нишу стабильного вертикально масштабируемого кеша. Транзакции тоже хорошо сочетаются с этой нишей.

, бо редіс використовує журнал так само. Якщо приходить якась інформація коли йде серіалізація вона йде через патчі журналу і витрати по жорсткому диску такі самі, в нас навіть можуть бути менші бо ми не використовуємо COW а беремо самі останні існуючі дані у бакеті хеш таблиці, в журнал йдуть тільки ті що вже були сериалізовані.

Redis потужний інструмент, його вибирають із-за стабільності в порівнянні з KeyDB та DragonflyDB

Тема про DragonflyDB вийшла вчасно враховуючи новину про зміну ліцензії у Redis

А какие у вас есть большие клиенты? Есть ли сервис на авсе или в других клаудах? Интересны также юз кейсы — только кеширование? или лонг терм сторадж тоже?

Ми ще стартап, але у нас вже є досить великі клієнти. Нажаль більш детальну інформацію по клієнтах я надати вам не можу. Ми можемо тей саме що й редіс + вертикальне масштабування. Також у розробці є декілька цікавих фіч як наприклад Tiering — де ми використовуємо SSD для розширення пам’яті, що дозволяє значно знизити ціну для клієнтів при невеликому зростанні затримки для запитів. Стосовна AWS ми регулярно використовуємо її для тестування ARM білда, більше я не знаю бо я не дуже знаюся на клаудах. Якщо вам потрібна буде допомога для запуску на клауді, зверніться у наш чат у Діскорд і ви отримаєте підтримку.

под клаудом я имею ввиду есть ли ваш сервис на авс маркетплейсе допустим, чтобы было удобно интегрировать его в существующую инфраструктуру, а не пытаться разворачивать все самому.

Ще нема, але ми працюємо у цьому напрямку.

Хлопцы вы со 122-ой на работу берете?

Спасибо за ответы! Интересно было бы посмореть на него, но отсуствие данных о серьезных клиентов может отпугнуть в сравнении с существующими альтернативами. Плюс у амазона есть еще такая штука — aws.amazon.com/memorydb, интересно насколько она резонирует с вашим сервисом.

Я не можу вам відповісти стосовно сервісів амазон. Якщо вам дійсно цікаво за наших клієнтів ви можете звернутись до наших менеджерів, бо я не впевнений, що маю право на розголос таких даних.

Це все красиві маркетингові слова, є репозиторій де можна запустити бенчмарки й власноруч перевірити?

Звісно, тут ви знайдете все що потрібно, щоб перевірити самостійно github.com/...​lydb/dragonfly#benchmarks
Dragonfly використовує той самий набір команд що і редіс, тому ви можете написати свій бенчмарк, або використати будь який інший. Якщо у вас виникнуть більш детальні питання ви можете зайти до у нас у Діскорд і ми спробуємо вам допомгти.

Підписатись на коментарі