После нескольких лет пребывания в пространстве «NoSQL» у меня появилась проблема, которая по своей природе является «реляционной». Сегодня я вижу хранилища данных совершенно другими глазами, чем раньше. Такие вещи, как Riak, испортили меня таким образом, что я больше не могу терпеть отдельные точки отказа, «отказ в обслуживании» и т. Д. Конечно, (или я надеюсь) я не «полностью потерял рассудок». Это личный проект, который не совсем (или еще) предъявляет чрезвычайно высокие требования.
Большинство решений шардинга не дают мне того, что я хочу (по крайней мере, мельком), вероятно, потому, что моя проблема довольно «проста» для решения. По крайней мере, на концептуальном уровне (игнорируя ограничения, которые сами RDBM вносят в таблицу).
У меня есть небольшое количество «общих» данных, которые можно свободно копировать. У него нет требований жесткой согласованности. Это может быть сохранено в подобной динамо базе данных и будет масштабироваться бесконечно. Но я все еще хотел бы использовать одну базу данных, если это возможно.
У меня много данных для каждого пользователя. То есть - множество пользователей, каждый из которых имеет данные абсолютно разумного размера, действительно подходит для хранения на одном узле PostgreSQL. Мы говорим о десятках тысяч записей максимум.
Мне никогда не нужно запрашивать межпользовательские и мне не нужно межпользовательское атомарность.
Это звучит очень легко достичь. По крайней мере, когда я смотрю на это своими «глазами NoSQL».
Вот мои наивные идеи для начинающих:
В крайнем случае, я мог бы просто сериализовать всего пользователя как единый ключ / значение в Riak. Конечно, постоянная де-сериализация нескольких мегабайт данных будет медленной, и поэтому я рассматриваю возможность использования PostgreSQL. Многие Riak K / V не нужны, так как мне нужны атомарность / транзакции в данных каждого пользователя.
Я мог бы использовать базу данных SQLite для каждого пользователя и использовать что-то вроде GlusterFS для избыточности / доступности. Это, вероятно, решение, которое я выберу, если не смогу найти что-то такое же хорошее, используя PostgreSQL. Плюсы: действительно хорошо масштабировать; Минусы: я бы предпочел иметь типы PostgreSQL и строгость по сравнению с SQLite
Итак, что я бы в идеале запросил у решения шардинга PostgreSQL:
- Автоматически хранить несколько копий данных каждого пользователя (на разных машинах). Уметь динамически переключать мастер-узел для каждого пользователя / шарда (если предыдущий мастер вышел из строя).
- Уметь динамически увеличивать / уменьшать масштаб, добавляя / удаляя узлы сервера. Главным образом, как это умеет Риак.
- Не требуйте, чтобы мое приложение знало, с какими узлами разговаривать и когда.