Pull to refresh

Comments 25

кролики — это не только ценный мех, это еще и 2 а то и 3 килограмма мяса.
Спасибо за внимание, ждите следующих статей.
Кролик — это ещё и отличная шина обмена данными!

Peer/ident аутентификация в действительности полезна в довольно узком круге окружений. Например сейчас, при развитии контейнерезации, в контейнере с СУБД будет только один пользователь. Да и просто в облачных СУБД у вас нет возможности настраивать пользователей сервера СУБД.
Да и безопасность, в случае с ident, становится ниже, как вы и сами говорите.
И масштабируется такой подход не очень хорошо: что будете делать с сотнями тысяч пользователей — каждому создавать пользователя?
А разделение данных пользователей по разным физическим серверам?


А всем остальным и так пользуются.

В части облачных СУБД вы правы, там доступ только к БД и от ОС вы отделены.


Касаемо безопасности внутри защищённого периметра — спорно. Если к вам во внутреннюю сеть влезли враги, то у вас уже всё плохо и наличие/отсутствие ident там погоды не сделает.


Относительно масштабируемости я честно не знаю откуда сотни тысяч пользователей. Если у вас собственная инсталляция, то реальных пользователей БД (не веб-приложения) будет штук 5: для веб-приложения, для фоновых задач, для деплоя, для разработчиков, ридонли и ещё чего-нибудь. Поэтому вполне реально им права настроить.


В случае шардирования по разным физическим серверам в PG, обычно, используют FDW и там свои особенности. А на аутентификацию к основному серверу БД это никак не влияет.

А зачем тогда вообще peer/ident аутентификация, если пользователей всего 5 и это не столько пользователи, сколько роли?
Для разработчиков: уж если и иметь аккаунт на машине, то лучше каждому свой чтобы можно было лишать доступа прицельно. При этом доступ к БД у вас получается всё равно групповой.
Я про то что реальной пользы от peer/ident аутентификации сейчас нет.

И где-то тут мы плавно перешли от ситуации "одна учётка на проде и 1 пользователь на всех" к ситуации "каждому свой аккаунт". Давайте будем последовательны и хотя бы на группы пользователей разобьём. Так же, в случае peer вполне себе можно иметь много пользователей с разными ssh ключами, которые ведут на одного юникс-пользователя. Там и логирование нормально настраивается на уровне системы, и групповые политики доступа к БД работать не перестают. Лично видел и работал с такими инсталляцими.

Пользователь может быть и один, а вот ключик ssh у каждого свой.
«Касаемо безопасности внутри защищённого периметра — спорно. Если к вам во внутреннюю сеть влезли враги, то у вас уже всё плохо и наличие/отсутствие ident там погоды не сделает.»
Тут все зависит от проекта. Если это соцсеточка, то можно надеяться на периметр, все равно безопасность никого не волнует. А вот если это финтех или приличный энтерпрайз, то уже неплохо бы защищаться и от собственных админов (и тут разделение паролей сильно помогает).
У такого подхода есть один существенный минус — подходит только для standalone-приложений, разработанных с нуля. Если вы разрабатываете софт на какой-либо платформе, включающей ORM, а тем паче саму такую платформу, то вы будете прибиты гвоздями к выбранной СУБД, либо будете вынуждены громоздить дополнительные слои абстракций, и поддерживать несколько реализаций.
Все дело в том, что реализация описанных (и безусловно полезных) механизмов значительно отличается для разных СУБД.

Да, в разных СУБД разные реализации и для ORM это не подходит, там свой дивный мир. Но по личному опыту, привязка к типу БД происходит почти всегда и смена БД в проекте — это скорее исключение, нежели правило. Поэтому, почему бы не воспользоваться доступными инструментами?

Ну, например потому, что я являюсь как раз разработчиком платформы, в которой описанное в статье реализовано чуть менее чем полностью, и еще многое другое. И многие заказчики прикладных решений на нашей платформе желают другую базу данных — например, потому, что у них имеются обученные админы. Что дает нам упущенную выгоду, к сожалению. И заставляет нас двигаться по тернистому пути громождения абстракций и поддержки реализаций.

Значит у нас с вами просто разный опыт. Я, чаще всего, наблюдаю как разработчики хотят сохранить независимость от БД и громоздят абстракции на уровне веб-приложения, хотя нет никаких предпосылок или требований со стороны бизнеса к независимости от БД.

С другой стороны, если приложение зависит от одной базы, это знаете-ли еще то «удовольствие». Она, база, так быстро никуда не денется, но и переписать огромную софтину, которую писали десятилетиями, «быстро переписать» под другую базу не выйдет и за пару лет… И когда наблюдаешь тенденцию, что «твоя родная БД» превращается в какую-то дурнопахнущую жижу, становится как-то грустно.
К счастью, «родная БД» наоборот становится все лучше и лучше, однако от проблем это не избавляет — её всё равно не слишком хотят (и напрасно, кстати)
В данном случае Вам повезло. И у Вас на порядки проблем меньше чем у тех, кому повезло с базой меньше.
Если кто-то чего-то не хочет, а Вы считаете что ему это нужно — посоветуйте один раз, предложите позже еще раз при удобном случае. И если это не принесло желаемого результата — оставьте. В конце концов для каждого не только свои грабли, но и время, когда он на них должен наступать.
А ещё это называется упущенная выгода =)
Ограничение целостности...

Достаточно спорно нынче стало все это.
1. Проверка бизнес целостности на уровне БД при eventually consistent подходе невозможна, да и ссылочная тоже.
2. При миграции большого кол-ва данных все constraints отключают для скорости и непрерывности процесса. А проверку проводят при подготовке данных.
3. Тут как всегда панацеи нет — что-то должно быть реализовано на уровне БД, что-то на уровне контроллера. Но и размазывать логику тоже не хочется, поэтому все чаще и чаще логика переносится на котроллер

Но, согласитесь, мигрировать данные так, что после миграции приложение их прожевать не сможет — глупое занятие. Поэтому и написал, что основа бизнес-логики должна быть прибита констрейнтами. Остальное — по вкусу. Эта же штука простимулирует правильную расстановку транзакций в приложении и хранение нецелостных данных в промежуточном месте. Например, последовательность шагов визарда складывать в редиску и только на последнем шаге всё сохранять, а не держать в базе неконсистентные данные, надеясь что визард успешно завершится и его не дропнут.

Когда речь идет о серьезных объемах, и количестве связей — визард не прокатывает. bulk insert работает на порядки быстрее. И плюс миграция один в один очень редкое занятие- всегда есть хоть какая-то трансформация. Для этого, как правило создается отдельное приложение или несколько, которые в несколько этапов закачивают данные. И как уже сказал, констрейнты на этот период отключают.
Ну почему сразу глупое? Нередко лучше иметь хоть какие-то битые данные, чем никаких. Ну, навскидку, данные об операциях по какому-то денежному счёту. Лучше записать сведения от контрагента об оплате со счёта 1000 рублей за товар без названия неизвестному продавцу, чем не записывать вовсе. По крайней мере баланс будет актуальным.

Тут бабушка надвое сказала. Потом приходят гос.органы, запрашивают данные и нагибают вас за неполные/недостоверные/отсутствующие данные. Особенно весело, если это не проверка пришла, а по какой-нибудь уголовке нужно.

А за какие из «неполные/недостоверные/отсутствующие» больше нагнут? Если одинаково, о этот фактор можно не учитывать при принятии решения о том, на каких уровнях контролировать целостность.
Я вам не скажу за всю Одессу Postgres, но DB-линки в Oracle — зло злейшее для высоконагруженных систем. При возникновении нагрузок (неоптимальный SQL-запрос, рост числа запросов от приложения etc) аффектятся обе базы. При том, что сам запрос не факт требует использования объектов из обеих БД.
Так что не ведитесь на удобство конфигурирования, аукнется.
Не думаю, что механизм FDW принципиально отличается от DB-линков, так что, скорее всего, вышесказанное применимо и к Postgres

В любом случае аффектятся обе базы, всё зависит от пропорциональности аффекта и плана выполнения. Для начала, коннект внешней БД занимается, а он кушает ресурсы, которые всегда ограничены. Так же, например, с FreeTDS для MSSQL всё не очень и pushdown для многих вещей не работает, что влечёт выборку всей внешней таблицы там, где по здоровой голове 1 строка в результате должна быть. Так что волков бояться — в лес не ходить. В итоге мы приходим либо к комбинации DSL-команд, которые не работают физически, либо к запросам, которые съедают все ресурсы. Хрен редьки не слаще и тут уж локально выбор делается и панацеи нет.

Я вообще про вот эту вашу фразу:
Вместо конфигов с координатами нескольких БД в веб-приложении несравнимо проще оставить одно подключение к БД и разрулить всё на уровне самой БД.
Прочитал, как почти призыв использовать линки везде, где можно. Ибо (в том числе) это упрощает конфигурирование.

С другой стороны, чаще всего запросы не требуют данных более чем одной базы. В противном случае это попахивает не очень хорошим проектированием этих самых БД.
Потому утверждение
В любом случае аффектятся обе базы
немного преувеличено.
Если приложение будет ходить в БД отдельно, то в большинстве случаев напрягаться будет только одна из них.

Sign up to leave a comment.

Articles

Change theme settings