metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2016-07-29 10:51 am

Postgresql в убере

https://eng.uber.com/mysql-migration/
http://postgresql.nabble.com/Why-we-lost-Uber-as-a-user-td5913417.html

Занятное чтиво про заморочки MVCC и реализации индексов в postgresql.
Все бы это хорошо, но я не понимаю один момент - почему они сравнивают только физическую репликацию (передачу изменений в страницах БД) и репликацию передачей исполняемых запросов?
Есть же вариант "передавать логические изменения в во всех измененных записях в порядке их коммита". Т.е. в таком варианте проблемы с недетерминированным выполнением запросов отсутствуют, но размер передаваемых данных заметно меньше, чем в случае "передавать весь WAL".

[identity profile] jakobz.livejournal.com 2016-07-29 09:51 am (UTC)(link)
Вон чуваки их бинарного лога посгреса выгребают логические изменения и кладут в кафку
http://www.confluent.io/blog/bottled-water-real-time-integration-of-postgresql-and-kafka/

Я вообще думаю что на замену "мы выбрали одну БД и трахаемся с кэшами", грядет "срем в очередь, откуда одни куски летят в РСУБД, другие в Elastic, третьи - сразу в in-memory cache, и еще в аналитику".

Т,е. transaction log на той же кафке должен стать главным узлом, а не БД, которая умеет всего понемногу и плохо.

Хотя именно что РСУБД на входе в очередь все равно большинству потребуется. Чисто для OLTP-целей - чтобы reference integrity была, и прочая consistency.

Так что как по мне, все эти хипстерские самодельные репликации как в MSSQL - в жопу. БД должна уметь шипать логический transaction log в понятном другим виде, который будет уметь жрать не только эта самая БД, а еще куча всего вокруг. И Postgre делает правильно как всегда, а MSSQL как всегда - хипстерское попсовое говно ради сиюминутных бенчмарков.
Edited 2016-07-29 09:53 (UTC)

[identity profile] metaclass.livejournal.com 2016-07-29 10:09 am (UTC)(link)
Консистентность без одной точки с транзакциями или распределенных транзакций как-то не получается.
Т.е. для некоторых систем оно то пригодно - логи там собирать, метрики миллиардами, а вот если гонять деньги - без БД чо-то не получается, очереди либо дают нужные гарантии с транзакциями либо производительность, вместе что-то не придумывается.

[identity profile] jakobz.livejournal.com 2016-07-29 10:18 am (UTC)(link)
Ну да, я ж и говорю что РСУБД (или чот-то еще с консистентностью) на входе все равно большинству надо.

Но из нее можно выкинуть большую часть обычной РСУБД:
- все данные которые не влияют на консистентность. В типичной СУБД это большая часть данных, за вычетом ID-шек в табличках, и может каких-нибудь там "сколько денег на счете"
- все индексы, которые не нужны чтобы чекать консистентность
- оптимизатор запросов - тоже вряд ли нужен
- всякие там аудиты, все про аналитику, в общем все что не касается OLTP.
- даже персистить на диск не надо

Т.е. точка входа может заниматься только тем чтобы:
- проверить что операция не нарушает consistency
- если ок - записать в transaction log

В этом раскладе, может оказаться что хватит какой-нибудь шустрой in-memory БД. А может и просто самописного кода в стиле applyTransaction(state, transaction) => state.

[identity profile] anonim-legion.livejournal.com 2016-07-29 04:47 pm (UTC)(link)
>MSSQL

В статье MySql