Re[28]: Выбор NoSQL
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.06.16 02:16
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>Здравствуйте, gandjustas, Вы писали:


G>>В этом случае давно придумано решение — сохранять на локальный диск или inprocess базу, а потом синхронизировать. Не нужны никакие nosql движки.

G>>Или другой вариант — пока сервер недоступен хранить в памяти приложения и повторять попытки сохранить надежно. Тоже лучше, чем писать в условно /dev/null.
CK>Костыль же жуткий.
Вовсе нет. Во многом даже проще, чем трахаться со скорость. записи в общее хранилище. Только прочитать сразу данные не сможешь.

CK>Но пока ты хранишь inprocess — приходят новые данные и ты не можешь их записать, пока не запишешь то что хранишь inprocess. Легко может наступить ситуация, когда у тебя память кончится до того как ты все запишешь.

Тогда и распределенной базы будет та же проблема.

CK>Помимо этого нужно будет как-то прозрачно дать доступ к тому что ты хранишь в памяти. Намного проще писать в эластик, например, и не думать об этом вообще. А если запись отвалилась — то выбрать следующую ноду по round robin и продолжать писать в нее.

Да, всего-то пару серверов нужно еще, со всеми вытекающими проблемами

CK>К тому же, если мы говорим о веб системах, то ты там тупо не сможешь ничего в памяти держать, так как у тебя на каждый запрос создается новый процесс и весь стейт в БД.

Ты точно делал веб-сервисы? По процессу на запрос это сильно.



G>>Не всегда конфликт можно разрулить на уровне приложения. И что делать в этом случае если у тебя AP система? Молиться?

CK>Так никто ведь не заставляет в такой БД хранить такие данные, для которых ты не можешь разрулить конфликт.
Я бы больше сказал, я даже не хочу разруливать конфликты, хочу чтобы конкурентный доступ база на себя взяла, она для этого создана. Внезапно NoSQL при такой постановке вопроса начинают сосать. И сразу вспоминают про CAP.

CK> На запись запускается консенсус, а на чтение нет, поэтому даже если запись невозможна(отсутствует связь с большинством машин), можно все равно читать старые данные. Но можно читать данные через sync и в этом случае консенсус будет гоняться на чтение и оно будет уже не АР а СР.

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


CK>И латентность будет ниже, а пропускная способность выше.

Про быстродействие еще ни слова не было.

CK>Смотри, можно как zookeeper или etcd гонять консенсус для всех транзакций и обеспечивать с его помощью полную линеаризуемость, можно не гонять его для операций чтения, только для записи и получить сериализуемость. Можно разделить данные на части и гонять консенсус только для тех данных, которые должны быть согласованными, а для тех что не должны, можно гонять консенсус параллельно (например можно иметь транзакции, работающие в рамках одной таблицы или одной записи/документа, получится что если мы пишем в два документа, то две параллельные транзакции запустят два независимых инстанса алгоритма консенсуса, это работает быстрее и лучше масштабируется, но нельзя согласовать данные в двух документах).

Обязательно посмотрю на zookeeper.


CK>И да и нет. Если записи просто изменят значение, то да, будет конфликт. Но ты можешь использовать CRDT и просто добавить данные на обоих нодах, а потом слить все вместе.

Давай подробный сценаий кто к кому и вкакой момент обращается.

CK>>>Вывод из этого следует такой — нельзя делать системы без partition tolerance.

G>>Все указанные в примерах системы были AP
CK>В статье есть примеры и с VoltDB и с монгой.
Про VoltDB не в курсе, а монго — AP при чтении (возвращает мусор), а при записи вообще гарантий не дает.

G>>Node majority это когда новый мастер выбирается N/2+1 голосов. Естественно голосов должно быть нечетное количество. Если две стойки перестали видеть друг друга — два мастера не появится.

CK>Это если нет автоскейлинга, заранее известен состав кластера и машины добавляются в него ручками.
Автоскейлинг мешает знать состав кластера?

CK>Ну это работает, я согласен, так можно жить. Но это не CA система. В зависимости от того как ты выбираешь мастера — система может быть СР, так как если поляжет больше половины машин, ты просто не выберешь нового мастера. Я конечно не знаю как там все работает, но подозреваю, что если нет автоскейлинга и failure детектора, то кластер не поймет что для консенсуса нужно меньше машин, а если он есть и алгоритм выбора лидера не partition tolerant, то две независимые части могут выбрать себе по мастеру.

В реальности вероятность полегания двух машин из трех в кластере мала, менее 0,01%, то есть 4 девятки на них спокойно живут.


G>>За несколько лет сделал более десятка отказоустойчивых SQL Server, которые именно так и работают.

CK>А как данные реплицируются и откуда клиенты читают данные? Просто если стойки друг друга не видят, то где гарантия что ты не прочитаешь устаревшие данные? Данные на slave-е могут быть непротиворечивыми с точки зрения ACID гарантий, но при этом отличаться от мастера.
Зависит от конфигурации. Чаще всего синхронная readable реплика. В Always on таких может быть две.

G>>Существенные ограничения должны идти в начале разговора. Пока они не указаны единственно верное решение — кластеры РСУБД.

CK>Я бы сказал что не существует дефолтного решения. РСУБД это клево и очень широко применимо (а многим адептам NoSQL нужно просто выучить SQL наконец и выкинуть монгу на помойку), но не универсально, как и NoSQL решения. Я не могу представить РСУБД кластер, который будет в состоянии заменить наш сетап
Я бы сказал что существует, пока нет серьезных оснований использовать что-то другое.

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