Comments 8
Версия PostgreSQL = 9.6 это не опечатка ?
Чем обусловлено использование столь старой версии СУБД ?
На момент проектирования системы в 2016 году Postgresql 9.6 только вышел (29 сентября 2016) и не был старым.
Прошло 8 лет. Версия СУБД - не менялась ?
На тот момент (2020) прошло 3,5 года, и версия, да, была 9.6. Мысли про обновление СУБД были, но без доработок кода в папке vendor приложение не работало, поэтому данный вопрос тогда отложили.
Вообще когда доработки архитектуры заканчиваются и нужно всё оформить, возникает много вопросов не касающихся напрямую новых возможностей ПО и тогда не дата релиза определяет решение перехода на новые версии. У нас такие решение принимала целая коллегия. При рассмотрении смотрят, например, если приложение аттестовано, как повлияет на аттестацию новая версия ПО, является ли оно рекомендованным и протестированным на этой версии ОС, есть ли какие-то рекомендации ФСТЭК, есть ли одобрение на эти действия вышестоящих инстанций и т.п.
Подскажите, по структуре кластера СУДБ, у вас организована синхронная репликация или асинхронная? Интересно, позволяет ли приложение неконсистентное чтение данных которые ещё не успели примениться на slavы, но закомичены на мастере?
Реплекация была дефолтная, т.е. асинхронная, но с одной стороны она была практически мгновенной, а с другой PgBouncer и PgPool с настройками, которые я указывал в PgBouncer pool_mode = session и в PGPool master_slave_mode = on master_slave_sub_mode = 'stream' позволяли избегать проблем.
Само приложение неконсистентное чтение данных не позволяет и не отслеживает. Т.е. при рассинхронизации нод, с точки зрения приложения возможно, что пользователь сохраняет что-то в ЛК, например сменил имя, нажимает F5 и видит старые данные. Это ещё самый безобидный пример, в большинестве случаев это будет ошибка 500, или в dev режиме - красный экран ошибки Symfony и что-нибудь про SQL.
Но PgBouncer держал сессию и все запросы как правило пролетали внутри этой сессии, и PGPool, тоже, как я понял, в рамках сессии все запросы старается направлять на одну какую-то конкретную ноду.
Возможно если выделить фронт от бэка, перейти полностью на js, скомпилировать его и отдавать с cdn статические ассеты, отдав на откуп всю клиентскую логику броузеру пользователей, то прирост мог бы быть еще более ощутимым.
Как настроить веб-приложение под высокие нагрузки