Cassandra vs. PostgreSQL
Я люблю PostgreSQL и всем рассказываю о том, какая это универсальная СУБД с инструментами и расширениями на все случаи жизни. И когда встает вопрос хранения, в первую очередь всегда думаю о PgSQL.
Но бывают специфичные кейсы, которые можно на PgSQL, но с оговорками, и количество оговорок заставляет задуматься об альтернативах.
Расскажу про один из таких кейсов в формате "Условие" - "Сравнение двух СУБД".
1️⃣ Условие – Одна табличка без связей и логики. Одна запись на один платёж. Платежей – миллионы в сутки. При этом реляционная модель и транзакционность не нужны.
Внутреннее устройство реляционных СУБД здесь будет скорее мешать. Движок MVCC ничем не пригодится и скорее создаст проблемы. Миллионы записей в сутки очень быстро приведут к деградации на одной таблице, нужно делить данные между таблицами. В PgSQL администрировать партиционирование или шардирование нужно самим, и это еще одна механика, за которой нужно следить.
Вы не подумайте, что в Cassandra можно хранить только одну таблицу) Просто такой кейс. Ограничение Cassandra – отсутсвтие JOINов. Поэтому приветствуется денормализация данных, чтобы доставать всё из одной таблицы. Подробнее о проектировании структуры хранения в Cassandra: https://cassandra.apache.org/doc/latest/cassandra/data_modeling/data_modeling_rdbms.html
А такой объем данных – не много, и из коробки есть обязательное шардирование между нодами, которое называется там партиционированием).
2️⃣ Условие – Нужны самые быстрые вставка и чтение, которые только возможны. При этом данные – критичные и могут повлиять на конверсию платёжной формы. Читай, платежи ходить не будут, если потеряется.
Аналогично предыдущему пункту, MVCC будет скорее мешать. А синхронная репликация между датацентрами даст лишнюю задержку на записи.
Cassandra позволяет управлять балансом скорости и надёжности. Можно указать уровень консистентности при вставке и чтении. Указывая
Читать будем через 10 секунд, максимум сутки после вставки.
За это время данные точно разлетятся по всему кластеру и читать их можно откуда быстрее.
3️⃣ Условие – Читать будем только по первичному ключу.
Это ограничение Cassandra, и в этом кейсе мы по нему проходим. Вообще очень важно понимать ограничения, мне в этом помогла статья коллеги на хабре: https://habr.com/ru/company/qiwi/blog/486800/
4️⃣ Условие – Повторное чтение данных не нужно. То есть данные одноразовые. А старые данные будут мешать и со временем приведут к деградации системы. Надо их как-то чистить.
А в Cassandra есть встроенная механика TTL (Time To Live) записей. Можно прямо при вставке указать, типа INSERT
Итог
Выбрали Cassandra, потому что она автоматом решает проблемы, которые нужно было бы решать руками на PgSQL.
Признаюсь, я хотел попробовать Cassandra, и это было в моем ИПР. Но я не тащил её в первую попавшуюся задачу, а дождался подходящей, поисследовал вопрос, пообщался с экспертами, выписал аргументы за и против, презентовал команде и мы все вместе приняли это решение.
С момента запуска прошло время и я уже полгода работаю в другой компании, поэтому прежде чем писать пост спросил у ребят, как оно.
Ответ: "Вроде всё отлично, проблем никаких не было) Качественно довольно запедалили"
Я люблю PostgreSQL и всем рассказываю о том, какая это универсальная СУБД с инструментами и расширениями на все случаи жизни. И когда встает вопрос хранения, в первую очередь всегда думаю о PgSQL.
Но бывают специфичные кейсы, которые можно на PgSQL, но с оговорками, и количество оговорок заставляет задуматься об альтернативах.
Расскажу про один из таких кейсов в формате "Условие" - "Сравнение двух СУБД".
1️⃣ Условие – Одна табличка без связей и логики. Одна запись на один платёж. Платежей – миллионы в сутки. При этом реляционная модель и транзакционность не нужны.
Внутреннее устройство реляционных СУБД здесь будет скорее мешать. Движок MVCC ничем не пригодится и скорее создаст проблемы. Миллионы записей в сутки очень быстро приведут к деградации на одной таблице, нужно делить данные между таблицами. В PgSQL администрировать партиционирование или шардирование нужно самим, и это еще одна механика, за которой нужно следить.
Вы не подумайте, что в Cassandra можно хранить только одну таблицу) Просто такой кейс. Ограничение Cassandra – отсутсвтие JOINов. Поэтому приветствуется денормализация данных, чтобы доставать всё из одной таблицы. Подробнее о проектировании структуры хранения в Cassandra: https://cassandra.apache.org/doc/latest/cassandra/data_modeling/data_modeling_rdbms.html
А такой объем данных – не много, и из коробки есть обязательное шардирование между нодами, которое называется там партиционированием).
2️⃣ Условие – Нужны самые быстрые вставка и чтение, которые только возможны. При этом данные – критичные и могут повлиять на конверсию платёжной формы. Читай, платежи ходить не будут, если потеряется.
Аналогично предыдущему пункту, MVCC будет скорее мешать. А синхронная репликация между датацентрами даст лишнюю задержку на записи.
Cassandra позволяет управлять балансом скорости и надёжности. Можно указать уровень консистентности при вставке и чтении. Указывая
LOCAL_QUORUM
при вставке, мы получаем достаточную надёжность записи на несколько нод в кластере, при этом избегаем сетевой задержки между датацентрами.Читать будем через 10 секунд, максимум сутки после вставки.
За это время данные точно разлетятся по всему кластеру и читать их можно откуда быстрее.
3️⃣ Условие – Читать будем только по первичному ключу.
Это ограничение Cassandra, и в этом кейсе мы по нему проходим. Вообще очень важно понимать ограничения, мне в этом помогла статья коллеги на хабре: https://habr.com/ru/company/qiwi/blog/486800/
4️⃣ Условие – Повторное чтение данных не нужно. То есть данные одноразовые. А старые данные будут мешать и со временем приведут к деградации системы. Надо их как-то чистить.
DELETE
в PgSQL – не лучшая идея, хотя и возможная. Типа, чистить сразу после прочтения. Но фактически это лишняя нагрузка на запись и необходимость последующего vacuum (сборки мусора). Поэтому мы решали бы эту задачу с помощью партиционирования и дропа старых партиций.А в Cassandra есть встроенная механика TTL (Time To Live) записей. Можно прямо при вставке указать, типа INSERT
... USING TTL 1800
. Есть свои нюансы у этой механики, но подкупает факт, что она предусмотрена из коробки.Итог
Выбрали Cassandra, потому что она автоматом решает проблемы, которые нужно было бы решать руками на PgSQL.
Признаюсь, я хотел попробовать Cassandra, и это было в моем ИПР. Но я не тащил её в первую попавшуюся задачу, а дождался подходящей, поисследовал вопрос, пообщался с экспертами, выписал аргументы за и против, презентовал команде и мы все вместе приняли это решение.
С момента запуска прошло время и я уже полгода работаю в другой компании, поэтому прежде чем писать пост спросил у ребят, как оно.
Ответ: "Вроде всё отлично, проблем никаких не было) Качественно довольно запедалили"