Что выбирать: SQL vs NoSQL?

Привет всему хабрасообществу.

Решил все же дать жизнь своей мечте в создании одного не маленького проекта. И возникает вопрос, что же лучше использовать для Primary Storage?

На данный момент, думаю над PostgreSQL (MySql) или же каким-то NoSql решением (на примете Redis).

Задача проекта, это сбор информации с разных источников с большой скоростью.

Но вот, появляется куча ньюансов в из-за которых не могу определиться:

1. Редис все же быстрый (я бы сказал очень быстрый), но имеет больше процент потери данных при падании сервера чем реляционная БД
2. Редис не дает возможности явно указывать связи между сущностями.
3. БД (MySQL) при огромном количестве записей (ожидается более 20 млн записей) очень сильно начинает «тупить».

Поставленные требования:
1. Быстрая скорость записи/чтения
2. Возможность репликации на другие сервера
3. Фильтров почти нету, по сути, только списки.
4. Допустима потеря данных до 2%

Может кто-то сталкивался с такой задачей, и имеет опыт. Буду очень благодарен за ответы/советы. Спасибо!
  • Вопрос задан
  • 21052 просмотра
Решения вопроса 1
@WEBIVAN
1) сильно сомневаюсь, что 32gb ram вам хватит на 20+млн записей, для редис
2)У редиса есть AOF при котором потери данных крайне маловероятны
3) Редис быстрый не потому что nosql, а потому что бд в ram
4) при корректно построенных индексах и структуре бд на 20 млн мускул не тупит, у нас на одном продакшн проекте в таблице сейчас 100 млн и все отлично шустро работает. кстати таблица переехала из редиса, когда тому перестало хватать РАМа, после тюнинга мускула быстродействие не пострадало.
5) Как выше написали, если делать инсерты пачками, а не по одному, это значительно ускорит работу бд
6)у хетцнера диски очень любят сыпаться, крайне не рекомендую их сервера. Сопоставимые цены у OVH, при явно лучшем качестве
7) Как показывает мой опыт, корректно настроенный SQL достаточен в 99% случаев
Ответ написан
Пригласить эксперта
Ответы на вопрос 9
opium
@opium
Просто люблю качественно работать
20 миллионов для mysql это ничто.
Ответ написан
rfq
@rfq
Программист
Перечисленным вами требованиям вполне удовлетворяет простая запись в файлы. Но вы этот очевидный вариант не рассматриваете, значит, он вам не подходит. По каким причинам не подходит — вы умалчиваете, но хотите получить совет. Чтож, это открывает простор для фантазий. Я вам советую Java-Chronicle или MapDB — самые быстродействующие решения.
Ответ написан
Комментировать
Если вам надо только читать\писать используйте постгре. С этими задачами она справляется вполне неплохо.
Ответ написан
@r1alex
MongoDB начиная с версии 2.4 вполне пригоден для продакшн. И репликация есть и отличная скорость. Используем в боевом проекте. Объем базы 32 Гб. Три реплики в реальном времени. Пишет только мастер. Читают только слейвы(у нас операций чтений больше почти в 20 раз)
На первый взгляд может показаться, что отсутствие реплики мастер-мастер — не есть гут. Однако в БД реализованы механизмы переизбрания мастера в случае падения.
Ответ написан
Комментировать
begemot_sun
@begemot_sun
Программист в душе.
Лучше подумайте над тем какие преимущества дадут вам SQL против NoSQL. Сейчас модно говорить об NoSQL, но это всего лишь слова. А что вы будете делать когда схема БД будет меняться? Когда возникнут потребности в выборках которые вы не предусмотрели изначально? NoSQL хорош там, где нужна помощь SQL-решениям. Как самостоятельное primary решение я думаю его даже не стоит рассматривать.
Ответ написан
Комментировать
@niko83
Допустима потеря данных до 2%

Один из 50 insert'ов падает, и это приемлемо, я верно понял?

БД (MySQL) при огромном количестве записей (ожидается более 20 млн записей) очень сильно начинает «тупить»

Если структура данных вполне определена и поддаётся секционированию, возможно можно разбивать инфу по таблицам по месецам/неделям/ и др. ( смотря какой поиск будет производится)

1. Хотите быть гибкими чтоб поменять редис-могно-sql, подумайте об абстракции, используйте шлюз между вызывающим кодом и хранилищем. ( в таком случае кеширующую прослойку можно легко внедрить при необходимости)
2. Напишите тест генерирущий кучу предположительных запросов на чтение и на запись (если проект будет развиваться — пригодится)

(оба пункта дадум вам ценный полезный практический опыт)

Большой поток инсертов можно решить буферизирование на клиенте, и вставлять кучу строк за одну зоманду — Хорошая оптимизация, подумайте, возможно в вашем случае это вполне приемлемо.

Мне больше нравится как первичное хранилище реляционка, редис/монго и прочее как промежуточно хранение агрегированной инфы или для кеширование.
Ответ написан
Комментировать
EugeneOZ
@EugeneOZ
В первом пункте Вы сильно ошибаетесь — при дефолтных настройках он надёжнее Postgre.

Второй пункт — да, отличие от реляционных БД радикальное.

Чтобы данные вмещались в память, будут требоваться несколько серверов (горизонтальное масштабирование). Сервера БД и приложения должны быть раздельными.
Ответ написан
Комментировать
@IDVsbruck
Для динамических данных (структура, связи, частый апдейт) — RMDB, для статики (текст, коллекции и т.д.) — NoSQL. Вполне можно сдружить в одном проекте.
Ответ написан
Комментировать
KEKSOV
@KEKSOV
Посмотрите в сторону Percona Server + Percona NoSQL Это всем давно и хорошо известный MySQL. Где нужны сложные запросы для анализа данных — используете обычные SQL запросы, где нужна скорость — обращаетесь к тем же самым данным через NoSQL интерфейс. Еще один бонус — мастер-мастер репликация из коробки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы