Тонкости эксплуатации PostgreSQL

19.06.23

База данных - Администрирование СУБД

Тема перехода с MS SQL на PostgreSQL становится все актуальнее. В докладе на конференции Infostart Event 2022 Saint Petersburg руководитель проектов Антон Дорошкевич рассказал, что ждёт после перехода, к чему нужно быть готовым, и какие варианты решения задач существуют на данный момент в мире PostgreSQL для его успешной эксплуатации.

Меня зовут Антон Дорошкевич, я – руководитель проектов во Франчайзинговой сети ИнфоСофт.

Именно я – тот человек, который шесть лет вам говорил, что 1С с PostgreSQL работает, и там все хорошо. Кто-то в это верил, кто-то – не верил. Но судя по тому, что вы все здесь, там действительно все хорошо. Если было бы плохо, сюда бы пришло два человека, у которых почему-то все хорошо, а у остальных все плохо.

Поэтому и доклад называется «Тонкости эксплуатации». Потому что «толстостей» там уже не осталось. Ставишь, и оно работает. И это – самая удивительная вещь.

 

 

Оно действительно работает. На всех современных конфигурациях, кроме ERP))).

На ERP тоже работает – все, кроме расчета себестоимости.

Но вы этого не бойтесь. Не нужно такими лицами как на слайде реагировать, что вас заставили переходить на PostgreSQL. Все гораздо лучше, все гораздо проще.

Мой оптимизм основан не на книгах, не на документации, а на реальном опыте перевода больших баз и больших клиентов с MS SQL на PostgreSQL.

Большие клиенты – это клиенты, входящие в список РБК 500 – топ 500 компаний страны. Если уж у них все работает, поверьте, у вас, если вы в этот список еще не входите, тоже все заработает.

Основной момент, на который надо обратить внимание, это ваши кастомизации кода.

Самый последний опыт перехода – переводили ЗУП, Управление холдингом, Документооборот. Очень большая нагрузка, базы на много терабайт – сейчас база до терабайта вообще не считается большой. Пользователей много – тоже сотни, где-то даже тысяча.

Так вот, мы во время перехода не поправили ни одной строчки типового кода вообще. Все, что мы оптимизировали, касалось внешних обработок, отчетов и массовых операций, которые сделаны «поверх» типового кода. Если сформировать и провести документ на одного человека – быстро и примерно одинаково на MS SQL и на PostgreSQL, то когда начинаешь формировать на 15 тысяч, вылазят всякие интересные моменты.

И вот именно об этих моментах мы с вами и будем сегодня говорить.

 

Настройка PostgreSQL

 

Настраивается PostgreSQL сейчас гораздо проще, чем MS SQL. Вообще ничего не надо трогать.

Есть два лагеря адептов разного PostgreSQL – есть 1С-сборка от Postgres Pro и есть 1С-сборка от фирмы 1С.

Если у вас религия или убеждения, или шеф не разрешают ставить сборку 1С от Postgres Pro, ставьте с сайта 1С, но рядом втихую поставьте сборку от Postgres Pro, возьмите оттуда настроечный файл (он сформируется автоматически и настроит все под ваше железо) и положите в файлы сборки от 1С. Больше ничего делать не нужно.

Там останется подправить один параметр – random page cost – согласно вашим дискам, и все, PostgreSQL настроен. Одна настройка на весь PostgreSQL.

Страх, что PostgreSQL сложно настраивать, у вас уже давно должен был пройти.

Да, потом вы, может быть, что-то подкрутите. Например, степень параллелизма, с которой все администраторы обожают экспериментировать: «Сейчас как врублю, и отчет залетает». Всё остальное встанет колом, зато отчет будет быстрый. Это надо крутить аккуратно, экспертно, понимая что делаешь, и так далее.

Страх перед PostgreSQL давно прошел. Страх, что он тормозит, тоже должен уйти. Ничего не тормозит, все работает. Но есть нюансы, есть тонкости…

 

Особенности работы с СХД

 

 

Первая тонкость – PostgreSQL и СХД несовместимы. При том, что мир КОРП так устроен, что там системы без СХД практически не существуют. Редко у КОРПов увидишь сервер с дисками NVMe.

Что значит несовместимы? Насколько несовместимы? Не то что прям – все пропало. Нет, нормально все работает.

Пока вы боретесь в запросах за секунды, хотите, чтобы запрос был не 5 секунд, а 4 секунды, 3 секунды – все прекрасно. На хорошей СХД (а на экране хорошая СХД, например) все работает прекрасно.

Но когда вы начинаете бороться в запросах 1С за миллисекунды, начинает играть роль всё.

Смотрите, как выросла платформа 1С – мы уже боремся в запросах за миллисекунды! Например, нам нужно, чтобы этот запрос, который потом будет выполняться 6 миллионов раз, занимал 6 миллисекунд, а не 13. Потому что так нужно бизнесу. Иначе мы не успеем провести закрытие месяца. И начинается борьба…

Первый убийца миллисекунд – это СХД. Вам админы будут говорить: «Там IOPS целый камаз, у нас сеть 40-ка гигабитная». И это все правда. Они не врут, так и есть. Но только толку от этого почти ноль. Это, конечно, лучше, чем 100 мегабитная сеть для СХД, но в целом толку для СУБД почти ноль, потому что там на каждое обращение теряются миллисекунды.

А когда вы обращаетесь к железному диску, к NVMe, к флеш-накопителю – они не теряются. Поэтому, если есть возможность, откажитесь от СХД на проде.

Когда мы поднимаем такой вопрос перед заказчиком, нам обычно говорят: «Вы что, у нас же баз триллиарды», а потом оказывается, что все эти базы на среде разработки и тестирования. А на проде база одна.

Другое дело, что вы потом каждую ночь на среду разработки 500 ее копий разворачиваете. А разработчики пусть мучаются – чем хуже железо в разработке, тем лучше код 1С!)))

Ваши параметры на проде должны быть огромные, но у разработчиков все должно тормозить. Как у нас разработчики меряют, быстро ли работает 1С? По одному единственному параметру – конфигуратор у него быстро с утра запустился или нет? Если медленно, то 1С тормозит. И виноват в этом PostgreSQL, ага…. А то, что там СУБД вообще не участвует, никому не интересно. Поэтому среда разработки или тестирования может быть на СХД.

Да и для прода – если нет другого варианта, тоже используйте СХД. Но знайте, что маленькие запросики станут чуть медленнее на 3-5 миллисекунд каждый.

Когда запрос длится несколько секунд – вам все равно. А когда запрос длился 6 миллисекунд, а стал 9 – у вас время выполнения этой массовой операции увеличилось на 50%. У вас какая-то массовая обработка на железе проходила 4 часа, а после перехода на СХД – стала 6 часов. Это плохо.

Почему это плохо для PostgreSQL? Мы же в мире 1С в любом случае все сравниваем с MS SQL. С файловой базой, я надеюсь, уже никто не сравнивает, Oracle почти никто не видел, об IBM DB 2 почти никто не слышал, поэтому все равно сравниваем с MS SQL.

Вся фишка в том, как хранятся файлы в СУБД. У MS SQL вся база – два файла, если вы не занимаетесь секционированием, разбиением на table space и так далее.

Чаще всего – это просто два файла MDF и LDF. Все, там больше ничего нет.

Соответственно, на получение этой информации с СХД никакого времени не тратится.

А у PostgreSQL на каждое отношение каждый раз тратится дополнительное время – имя файла передать, служебную информацию передать и т.д…
Очень грубо это можно сравнить с ситуацией, когда вы копируете один файл в 10 ГБ по сети или 1000 файлов по 10 МБ, надеюсь все знают, какую разницу во времени этих операций вы получите.

Что такое отношение? Это не отношение 1С с PostgreSQL – и так понятно, что у них там любовь. Отношение в PostgreSQL – это табличка либо индекс, еще и разбитые по одному гигабайту. Этот один гигабайт вообще прошит через весь PostgreSQL красной нитью. И это решение, принятое 30 лет назад сейчас стало немного мешать, дальше расскажу где.

Получается, что наша великолепная база какого-нибудь «Управления холдингом», на MS SQL занимает 2 файлика и там на СХД все летает.

А если мы перешли на PostgreSQL, все тормозит, потому что там она будет занимать в районе 100 тысяч файлов. Там будет 11 тысяч табличек. Даже если каждая табличка в 1 гигабайт влезла, там будет 25 тысяч индексов примерно. Плюс на каждое отношение еще есть 2-3 служебных файлов у самого PostgreSQL.

Представьте, сколько служебной информации на каждый ваш запрос вам нужно поднять именно из СХД.

При этом производительность падает. Кажется, что это – миллисекунды, но это серьезно. В больших количествах операций, когда вы переходите от толстости к тонкости, это играет огромную роль.

 

Загрузка из DT

 

 

Следующий момент – многопоточный DT, точнее многопоточная загрузка DT, которая появилась в платформе 8.3.19.

Казалось бы, при чем тут PostgreSQL? Но мы же с вами на секции Highload говорим о больших системах. А в больших системах прода без репликации не существует – в больших системах на PostgreSQL, по крайней мере точно. Плюс мы все с вами – или в мечтах пока, или в жизни – обладатели корпоративных лицензий 1С. Соответственно, у нас нет ограничения на 12 ядер сервера 1С.

Как работает многопоточная загрузка DT? Почему-то, по неизвестным мне причинам, в конфигураторе нам не дали этим управлять. И начиная с платформы 8.3.19, если ты просто пробуешь залить DT, потоков загрузки будет столько, сколько у вас ядер на сервере 1С.

В КОРПе ядер на сервер 1С не жалеют. Там и 80 бывает.

Но вот представьте, у вас DT начнет литься в 80 потоков. Это очень быстро. Но реальная скорость загрузки будет равняться скорости загрузки самой большой таблицы, которая у вас заливается, потому что все остальные 80 потоков всяко зальются. Из всех 11 тысяч таблиц в базе 1С 90% места занимают первые 20. Все остальные – это остальные 10%.

И, казалось бы, 1С прекрасно позаботилась о нас, но она не позаботилась о репликах PostgreSQL.

Что у вас произойдет? У вас реплики умрут. Почему умрут? У них место кончится, потому что PostgreSQL сформирует столько записей журнала транзакций, что реплика гарантированно не успеет их «проиграть» в себя (записать в базу). Когда она будет не успевать в себя «проигрывать», она будет хранить эти журналы транзакций у себя на диске.

Несколько лет назад в среде PostgreSQL отказались от слова master и slave (главный и подчиненный). Теперь есть «master1» и «master2», чтобы админы не думали, что реплика slave – это что-то незначимое. Они должны относиться к ней как ко второму мастеру.

Должны, но так происходит не всегда. Обычно на реплике выделяют очень мало места под наши любимые WAL-ы (под логи транзакций). И когда место заканчивается, реплика останавливается. А когда у вас остановилась реплика, а вы же настроили репликацию со слотами (без слотов редко кто настраивает – такое тоже бывает, но это обычно исключение из правила), мастер, видя, что реплика не работает, начинает WAL-ы держать уже у себя на дисках. И у вас по аналогии с каскадным отключением электричества будет каскадное отключение PostgreSQL. Сначала отключатся самые далекие, медленные реплики по сети, потом побыстрее, побыстрее, в итоге отключится мастер.

И все это потому, что кто-то взял и начал лить на мастер большой DT-шник.

Так происходит потому, что мастер пишет многопоточно – он так устроен. А реплика многопоточно писать не умеет. Она всегда пишет одним процессом, одним ядром. Вы ничего не сделаете, вы ее никак не заставите. Конечно там всё пишется очень оптимально, зависимость не прямая, но реплика точно отстанет от мастера и надолго.

И вот теперь представьте, что такое многопоточная заливка DT. И у вас на сервере 1С 48 ядер – это то же самое как вы вместо своих пользователей 1С посадили 48 роботов, которые фигачат документы в бесконечном цикле. Они столько пишут, что реплике, чтобы это прожевать в один поток, нужно почти во столько раз больше времени, сколько раз у вас ядер на сервере 1С (не на сервере мастера PostgreSQL).

Если у вас на сервере 1С 48 ядер, реплике на проигрывание того, что нагенерил мастер при заливке DT, понадобится примерно в 30 раз больше времени.

А вам понадобится примерно в 30 раз больше места под WAL-ы, чем при обычной работе. Это нужно учитывать.

Чтобы это учитывать, заливайте DT-шник из командной строки. Не из конфигуратора через «Загрузить информационную базу», а выполняете пакетный режим запуска конфигуратора, говорите залить DT-шник и там есть параметр jobs, выставляйте его в разумные значения, 4 скорее всего будет достаточно, с увеличением потоков реальная скорость загрузки навряд ли будет увеличиваться. Так как всё упрётся в больших таблицы, а каждая таблица льётся в один поток в любом случае.

Нас даже платформа 1С приучает к командной строчке)). Вы тут от PostgreSQL требуете визуализацию бэкапов, а вам 1С говорит – ничего не выйдет, вы даже DT-шник будете с командной строки загружать.

Зачем вы переливаете DT-шник? Вы явно с MS SQL поехали на PostgreSQL, другого смысла почти нет. Не с файловой же базы вы едете.

Так что зайдите в MS SQL, задайте отчет по верхним таблицам и посмотрите, что у вас там в лидерах по объёму. Вот сколько у вас лидеров таблиц, поделите это на два и примерно столько потоков задайте. Если у вас 10 таблиц, вы их будете лить в 5 потоков, у вас скорость заливки DT-шника будет аналогична скорости заливки двух больших таблиц.

Я очень много времени этому уделяю, потому что очень много кластеров PostgreSQL на этом моменте упали – и со слотами, и без слотов.

Без слотов у вас будет еще хуже – когда у вас нет слотов на мастере, у вас реплика без слотов, у вас произойдет следующее. Реплика с какой-то своей скоростью будет явно очень сильно отставать от мастера. У мастера нет слота, ему пофиг, отстает ли от него реплика, он начинает удалять WAL-ы, согласно вашему параметру max_wal_size.

Он достиг max_wal_size и начинает их удалять.

И когда реплика наконец-то прожует те WAL-ы, которые она закачала в себя, и наткнется на то, что нужный ей элемент WAL-а удален, она остановится. У вас будет точно такой же веерный отказ реплик, но мастер выживет.

Поэтому очень аккуратно. Кайфовая функция, но с ней нужно уметь работать.

 

Ограничение на один гигабайт

 

 

 

Следующий момент – это гигабайт, ещё одна «красная нитка» в PostgreSQL.

Уже года два по форумам ходит вопрос: «У меня конфигурация занимает много места, и я не могу ее сдампить. Вызываю pg_dump, и он падает, говорит у тебя в ячейке больше одного гигабайта».

Я вас расстрою, эта проблема не только в таблице config. Этого можно добиться почти во всех таблицах. Попробуйте сформировать регламентированную отчетность в ФСС на 15 тысяч сотрудников. Если файлик xml будет занимать больше гигабайта – вы не сможете забэкапиться с pg_dump-ом.

Плюс вы не сможете сделать RESTORE.

Причем тут есть фишка:

  • Когда вы бэкапитесь через pg_dump, он ругается на отсечку в один гигабайт.

  • И при ресторе тоже ругается – правда на чуть меньше чем гигабайт, примерно на 950 мегабайт.

Это большая проблема.

Но тут на картинке не просто так две видеокарты GIGABYTE изображены, потому что в ноябре 2022 года Postgres Pro выпустил pg_dump, в котором реализован специальный параметр --enable-large-mem-buffers «Обрабатывать большие данные». Там это ограничение будет увеличено до 2 гигов. На MS SQL тоже 2, поэтому увеличивать до 4 или до 8 нет смысла. Вы в ячейку MS SQL больше двух гигов не положите, он вам не позволит – будет ругаться.

Наверное, это сначала въедет в Postgres Pro версии Enterprise, не знаю когда это дойдет до ванильной версии. Но когда-то, наверное, дойдет.

А вообще вам как 1С-разработчикам совет – начните уже использовать сжатое хранилище в 1С. Кладите данные в сжатое хранилище, а не просто так храните. Очень хорошо помогает.

 

Работа с временными таблицами и динамическими списками в памяти

 

 

 

Следующая тонкость – это temp_buffers и work_mem.

Сколько туда нужно поставить? Да поставьте хоть терабайты, просто вычислите эти параметры нормально.

Temp_buffers и work_mem нужны каждому сеансу. Теперь возьмите, сколько у вас памяти на сервере и разделите на количество активных пользователей – вот вам примерные ориентиры.

Зачем вообще нужен temp_buffers и work_mem?

Temp_buffers нужен, чтобы ваши временные таблицы создавались в памяти. Это не значит, что если временная таблица будет больше, чем temp_buffers, у вас все упадет. Нет, она просто на диск скопируется и там будет дальше работать.

Work_mem нужен, чтобы операции order by и distinct делались в памяти, эти операции сопровождают все динамические списки.

Поэтому work_mem тоже не забывайте увеличивать.

В настройках выставьте log_temp_files=temp_buffers. И если у вас в логах будут появляться записи, что у вас TEMPORARY TABLE создана на диске, там будет указано еще и сколько туда байт всунули и какой оператор это вызвал. И вы поймете, если у вас очень много таких записей, вам надо temp_buffers увеличить или work_mem.

Это такая тонкость, на которую нужно обратить внимание.

 

AUTOVACUUM при INSERT

 

 

Следующий момент – AUTOVACUUM.

В 14 PostgreSQL AUTOVACUUM научился срабатывать при insert. Казалось бы, AUTOVACUUM – это пылесос. Он должен мне пропылесосить таблицу, когда я в ней что-то наудалял. А тут я же вставляю. Я вообще ничего не удаляю. Зачем мне AUTOVACUUM?

Когда вы навставляли данных, вам нужно, чтобы кто-то статистику посчитал.

Например, вы взяли и посчитали итоги за новый месяц. Если у вас нет регламентной ежедневной операции по пересчету статистики PostgreSQL, вы получите проблему – в PostgreSQL будет старая статистика. Планировщик будет не в курсе, что теперь в базе не один миллиард записей, а два миллиарда записей у итогов. Будут проблемы.

Поэтому в 14-м PostgreSQL добавили параметры:

autovacuum_vacuum_insert_threshold = 1000

autovacuum_vacuum_insert_scale_factor = 0.2 -> 0.01

Теперь можно заставить AUTOVACUUM сработать при insert. Поправьте его умолчательное значение 20% на 1%, и будет работать намного лучше – он сам при insert будет вам обновлять статистику.

При этом ночная регламентная операция по статистике уходит на второй план.

 

Тонкости бэкапов

 

 

 

Ну и на закуску, самая большая тонкость эксплуатации PostgreSQL, как ни странно – это драка админов за то, как им бэкапы делать.

В PostgreSQL с бэкапами все совсем не так, как в MS SQL – настолько, что это требует перелома психики и всех знаний.

В целом у PostgreSQL есть два вида бэкапов – pg_dump и pg_probackup.

Я сюда не вывел pg_basebackup, потому что pg_probackup построен на pg_basebackup, т.е. он почти такой же, но pg_probackup по сравнению с pg_basebackup однозначно лучше.

Чем отличаются pg_dump и pg_probackup?

pg_dump:

  • Самая кайфовая утилитка для маленьких баз. Все прекрасно. Ее самый главный плюс – она может дампить одну базу, как мы все привыкли в MS SQL.

  • По просьбам 1С-ников в pg_dump можно сделать бэкап только нужных таблиц. Скоро там будут еще и запросы – вы сможете в нужных таблицах дампить только нужные данные через выборку, для среды разработки это будет очень полезно. А так вы можете дампить только нужные таблицы либо все, кроме ненужных. Например, зачем вам для среды разработки дампить из прода таблицу версионирования? Сдались вам эти 200 гигов. Просто в параметрах как исключение эту таблицу указываете, он вам схему таблицы сдампит, а данных там не будет. У вас и дамп будет быстрее, и рестрор быстрее. Это тоже огромный плюс pg_dump.

  • Вам не нужно хранить архив WAL-ов. Это не плюс и не минус. Не нужно, потому что это бессмысленно – к дампу WAL-ы не подлить. Дамп самодостаточный. Это просто фулл бэкап.

  • И то, что это – фулл бэкап, это минус. Всегда фулл, никаких дифференциальных бэкапов нет.

  • Он реально долгий. Многопоточность, конечно, немного решает этот вопрос.

  • Но вот по поводу многопоточности pg_dump у меня здесь сомневающаяся рожица. Почему она сомневается? У многопоточного дампа есть особенность, многопоточный дамп из коробки работает только для формата directoty -Fd. Это когда у вас дамп будет каждую табличку складывать в отдельный архив внутри каталога. Можно еще обмануть всех, лить дамп как SQL-текст и потом передавать в pgzip и там многопоточно сжимать. Но это уже не коробочное решение получается. Кроме этого, если мы в коробочном решении льем дамп многопоточно, то многопоточный дамп может пасть жертвой блокировок. У вас 11 тысяч таблиц, вы их начинаете сливать, и если при этом кто-то какую-то таблицу меняет, дамп просто останавливается. Этот момент можно поймать, даже если вы дампите с реплики, а в этот момент 1С-ники сделали структурное обновление на мастере. На реплику это все прилетело, у вас изменились таблицы, и дамп упал. Поэтому если вы дампите с реплики многопоточно через каталоги, вам придётся отключать реплику от мастера на время дампа и потом подключать обратно, это всё скриптуется.

Почти всех этих минусов лишен pg_probackup:

  • Но у pg_probackup есть один большой минус – он всегда дампит целый кластер. Он нужен для резервного копирования всего кластера.

  • pg_probackup нужен архив WAL-лов, если вы собираетесь откатываться на произвольный момент времени.

  • У pg_probackup зато есть инкрементальный бэкап.

  • Есть многопоточность.

  • И есть совершенный иммунитет от проблемы одного гигабайта. Ему все равно, он работает с файлами, он не работает с вашими данными. Pg_dump читает данные и упаковывает, а pg_probackup просто файлы копирует.

  • И когда pg_probackup работает инкрементально – это очень быстро. Если еще и через PTRACK – это еще быстрее.

 

 

Помимо дампа у этих утилит есть возможность рестора. И с точки зрения рестора у них есть такие же плюсы и минусы.

У pg_restore почти такие же плюсы как у pg_dump:

  • Можно ресторить одну базу. Можно в том же сервер, откуда взяли, рядом базу создать. Можно эту заменить – все, что хотите.

  • При ресторе не нужны WAL-ы, рестор самодостаточный.

  • pg_restore может производиться многопоточно для форматов pg_dump -Fc и _Fd

  • Но это не быстро. Хотя я уже не стал писать, что это долго, это не быстро. В основном скорость страдает от того что дамп не содержит индексы и соответственно рестору их необходимо создать заново.

А у рестора через pg_probackup есть свои особенности:

  • Многие думают, что раз через pg_probackup дампится весь кластер, то и восстановить можно только весь кластер. Нет, можно восстановить одну базу. Но у вас рядом все равно на новом порту будет восстановлен весь ваш кластер PostgreSQL, в котором будет только одна база. Файлы всех остальных ваших баз будут нулевого размера, а только у той базы, которую вы указали, файлы будут не нулевых размеров. И работать в этом кластере вы сможете только с этой базой. Боль в том, что это – отдельный кластер, ему нужно свои shared_buffers настроить, temp_buffers. Это отдельные ресурсы. Поэтому восстанавливать из pg_probackup с прода на разработческий контур и на контур тестирования больно и дорого, к сожалению. Там лучше pg_dump работает.

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

 

Вопросы

 

Есть ли особенность работы с индексами именно с точки зрения СУБД? Перестроить индекс, дефрагментировать индекс, ребилды. Например, у MS SQL только Enterprise версия умеет полностью на лету заменять и перерасчитывать индекс. Есть ли сложности в PostgreSQL?

Мы же в MS привыкли заниматься этой ненужной никому работой, дефрагментировать, ребилдить индексы.

Во-первых, дефрагментировать индексы в PostgreSQL вообще не надо. Ребилдить просто так их тоже не надо, этим никто не занимается – только если у вас проблема с индексом. Либо он ужасно распух и у вас упала скорость запросов из-за того, что он распух.

Так вот, в ванильном PostgreSQL есть команда – есть REINDEX CONCURRENTLY, это аналог перестройки индекса онлайн, доступной в MS SQL Enterprise.

Скажите, пожалуйста, что у ванильной версии PostgreSQL с 1С и кластеризацией? Хотя бы мастер – слейв. По нашему опыту – собрали, все прекрасно работает на других приложениях. Но платформа 1С 8.3.19 у нас час не могла понять, что у нее переехала нода. Один пинг потерян.

Это не к PostgreSQL. У вас речь о том, что мастер переключился на реплику, на второй мастер – привыкаем так называть, нет больше слейва. И вы в консоли поменяли имя сервера? Тут, к сожалению нет какого то единого инструмента для «прозрачного» переключения.

Нам проще в хосте сервера 1С заменить IP мастер-реплики сервера PostgreSQL. Когда у тебя мастер 1 выходит из строя, ты в хосте сервера 1С заменяешь IP на мастер 2. Оно сразу мгновенно работает, никаких проблем. И в 1С тоже ничего трогать не надо.
Кто-то делает это через HaProxy, кто-то через ngnix, кто-то через corosync и так далее. Вариантов много, каждый может подобрать себе тот, который его устроит больше всего.

Мы счастливые обладатели 1С:ERP, работаем на MS SQL, и еще у нас есть MES-система самописная на обычных формах. Два вопроса. Первый – стоит ли нам ERP пробовать уже на PostgreSQL? И второй вопрос – я слышал, что PostgreSQL с неуправляемыми приложениями, таким как наша MES-система, не очень дружит.

Первое. Стоит ли пробовать ERP? Пробовать точно стоит. Много ERP уже внедрено на PostgreSQL. Уже накоплены знания. Точно стоит пробовать. Это раз.

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

Вам надо перейти на управляемые блокировки, и все. И никакой больше особенности нет. Автоматические блокировки и PostgreSQL – несовместимые вещи. Совсем. Даже хуже, чем СХД.

Поэтому если она на автоматических блокировках, сначала переводите на управляемые. Делов два дня работы одного спеца. И все, у вас вся конфигурация будет на управляемых.

А дальше уже оптимизируйте запросы.

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции  Infostart Event 2022 Saint Petersburg.

См. также

Администрирование СУБД Системный администратор Платформа 1С v8.3 Бесплатно (free)

Пользовался ранее https://infostart.ru/1c/articles/1120161/#, но она устарела, т.к. службы запускаются через systemctl, да и сами службы слегка изменились. Возможно, где-то на ИТС уже есть нужная инструкция, но мне не попалась.

15.11.2024    297    Baser    2    

1

HighLoad оптимизация Администрирование СУБД Системный администратор Программист Платформа 1С v8.3 Россия Бесплатно (free)

Мы исследуем проблему долгого выполнения запросов PostgreSQL при использовании конструкции VALUES: когда она возникает, как на нее можно повлиять, а главное, почему ее продуманная отработка важна для более быстрого функционирования решений на базе 1С

12.11.2024    829    Tantor    19    

14

HighLoad оптимизация Администрирование СУБД Механизмы платформы 1С Программист Платформа 1С v8.3 ИТ-компания Россия Бесплатно (free)

В данной статье мы рассмотрим, как работает механизм временных таблиц на postgres на платформе 8.3.23 и что изменилось в нем при добавлении новых возможностей в платформе 8.3.25. А также на примере покажу, как понимание работы платформы позволяет оптимизировать СУБД для работы с 1С.

29.10.2024    3136    Tantor    38    

34

Администрирование СУБД Системный администратор Программист Бесплатно (free)

CDC - очень мощный механизм, который можно использовать во многих сценариях, возможность развернуть его в Docker показывает простоту и лёгкость данной технологии.

08.10.2024    730    AlexSvoykin    1    

7

Администрирование СУБД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ и решение ошибок СУБД. Во время реиндексации базы Ошибка СУБД: Microsoft SQL Server Native Client 11.0: Не удалось найти объект "ИмяБазы.dbo._RefSInf21806", так как он не существует, или отсутствуют разрешения. Во время проверки целостности Ошибка СУБД: Microsoft SQL Server Native Client 11.0: Недопустимое имя объекта "dbo._RefSInf21806".

19.09.2024    4341    Xershi    10    

17

HighLoad оптимизация Администрирование СУБД Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Бэкап в Postgres состоит из набора граблей, которые нужно обойти для успешного восстановления. Они заложены в самых неожиданных местах от предмета резервного копирования (база или кластер) до структуры каталогов. Один неверный шаг и восстановление будет невозможным. Почему нельзя было сделать проще, как в MS SQL или Oracle? Почему бэкап в Postgres оставляет впечатление чьей-то лабораторной работы? Статья адресована прежде всего специалистам 1С, избалованным комфортом в MS SQL, в суровых буднях импортозамещения на Postgres.

13.08.2024    2966    1CUnlimited    9    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user678861_9209206666 19.06.23 13:54 Сейчас в теме
Так если не идёт " расчет себестоимости" то как переходить с ЕРП? или идёт но "долго" ?
2. Nabi911 19.06.23 17:13 Сейчас в теме
(1) Все идет, в чистой не переписанной ERP последних релизов все вполне норм, как и с расчетом себестоимости в типовой ERP. В докладе как раз говориться что основные проблемы не с типовыми конфигурациями, и с нетиповыми доработками/отчетами.
3. PerlAmutor 155 19.06.23 21:43 Сейчас в теме
Про wal_compression замолвите слово.
5. a.doroshkevich 1496 20.06.23 11:49 Сейчас в теме
(3)Даёт не сильно большой эффект в части уменьшения количества генерируемых WAL-ов, в этом смысле full_page_writes = off гораздо более эффективен, но это не безопасно
4. korefano 20 20.06.23 10:15 Сейчас в теме
Оно действительно работает. На всех современных конфигурациях, кроме ERP))).


И ТОИР ;)
13. a.doroshkevich 1496 21.06.23 03:57 Сейчас в теме
(4)с ТОИР опыта перехода не было, но судя по тому что эта конфигурация и на ms sql то не особо быстра скорее всего вы правы)
21. eLeMeNtaLe 21.06.23 10:46 Сейчас в теме
(4)Т.е. в ТОИРе проблема только в быстродействии? А то нам в ближайшем будущем предстоит переезд на новый сервер с Postgre, не хотелось бы столкнутся с нерабочим функционалом базы.
32. a.doroshkevich 1496 06.07.23 02:44 Сейчас в теме
(21)Из-за смены субд функционал 1с работать не перестанет
6. sandr13 35 20.06.23 14:47 Сейчас в теме
А почему надо переходить с MS на Postgre?
7. user1961333 20.06.23 18:54 Сейчас в теме
(6)импортозамещение
23. sandr13 35 21.06.23 14:48 Сейчас в теме
27. nutbutter 1 23.06.23 11:30 Сейчас в теме
(23) Postgres Professional - российский
28. sandr13 35 23.06.23 15:54 Сейчас в теме
(27) Терзают смутные сомнения, хотя по опыту, так как он падал у нас во франчайзи почти каждый день, очень может быть...
30. siamagic 26.06.23 07:34 Сейчас в теме
(27)Стоит как самолет, тупит как обычный потсгри - нах он нужен?
20. eLeMeNtaLe 21.06.23 10:43 Сейчас в теме
(6)Как вариант, лицензии 1С итак не очень дешёвые. Говоря о среднем бизнесе, когда пользователей онлайн за 100-150 человек и файловой базой уже не обойдёшься. Тут можно сэкономить на СУБД.
24. sandr13 35 21.06.23 14:50 Сейчас в теме
(20) Если я правильно понял, то переход с MS на Postgree (написано в самом вверху). Другими словами: MS уже был и прекрасно работал.
8. skyadmin 60 20.06.23 19:29 Сейчас в теме
12. a.doroshkevich 1496 21.06.23 03:56 Сейчас в теме
(8)Это утилита для других целей, именно миграции. И чтобы миграция была корректной база должны быть заблокирована. Бизнес такое ради бэкапа наврятли позволит сделать, да и смысла нет.
Тогда проще реплику делать каждый день)

Но повторюсь - это всё разные цели и соответственно другие инструменты
18. skyadmin 60 21.06.23 09:52 Сейчас в теме
(12)
Но повторюсь - это всё разные цели и соответственно другие инструменты


Не думаю, что бэкап с помощью pg_dump будет более целостным, чем скопированная база на другой сервер.
Плюс вижу в том, что копию базы с другого сервера можно подключить без процедуры восстановления.

Еще интересно есть ли у PG полная модель восстановления, чтобы откатить базу на 30 секунд назад?
И чем плох для бэкапа Acronis Cyber Protection?
19. a.doroshkevich 1496 21.06.23 09:55 Сейчас в теме
(18)
Dump консистентен на уровне субд, а копия нет

Полная модель не требуется, задача решается архивирование wal-ов и использование basebackup или probackup или подобных им утилит, которые копируют кластер как папку с файлами

Не знаю кто сказал что акронис плох, как и куча другого по, но в статье рассматриваются утилиты субд, а не сторонней по
31. siamagic 26.06.23 07:35 Сейчас в теме
(8) нормальный люди реплики делают.
skyadmin; +1 Ответить
9. PerlAmutor 155 20.06.23 20:34 Сейчас в теме
Попробовал загрузить DTшник с MSSQL на PostgreSQL.
На виндовой машине (не сервер), диск обычный (IDE), т.к. на SSD просто не влезет.
Грузился 2 дня (размер DTшника 44Гб).
В MSSQL база весит 250Гб, в PostgreSQL стала весить 650Гб. В базе никого нет, а диск загружен на 100%.
Открытие любой формы - минуты. Тоже самое с прокруткой в динамических списках. До этого разворачивал базу на MSSQL та же самая машина. В ней даже можно было работать, особо не тормозила.
А тут получается даже в тестовом контуре базу никак не пожать, т.к. лицензия Enterprise нужна и особо не потестить.
Антивирусу похоже тоже не особо нравится ворох из сотен тысяч файлов.
В pgAdmin вообще всё скудно, не посмотреть какие запросы выполняются, их планы. Постоянные Connection Lost или долгие обновления страницы.
Но это я так, просто пощупать.
10. a.doroshkevich 1496 21.06.23 03:51 Сейчас в теме
(9)такой разницы а размере базы быть не может, её нет вообще
Что-то не то)
Ну и 43ГБ dt на сата диск (надеюсь реально не ide) грузится несколько часов.
Проверьте настройки постгреса и используйте многопоточную загрузку либо ibcmd от последней 23 платформы.
По поводу открытия форм - тут сильно зависит от кода 1с, если конфигурация старая или писалась без соблюдения стандартов разработки 1С, то не оптимизирован и надо приложить усилия.
11. a.doroshkevich 1496 21.06.23 03:53 Сейчас в теме
(9)как запросы выполняются в pgadmin 4 видно онлайн на вкладке дашборд.
Планы - тут или собирать из лога или уже брать текст запроса и формировать в пгадмине с планом.
Про обновление страниц и потерю соединения - никогда такого не видел, ничего сказать не могу.
Ощущение что вы пробовали какие-то странные версии что постгреса что пгадмина.
14. a.doroshkevich 1496 21.06.23 04:00 Сейчас в теме
(9)антивирус - не должно быть такого понятия на серверах (или на машинах которые выполняют роль сервера) защищать инфраструктуру нужно по другому.
Как минимум все каталоги и файлы базы, а так же исполняемые файлы субд должны быть в исключениях.
Наличие антивируса, особенно с не настроенными исключениями критически влияет на скорость работы.


Написал 3 ответа, так как сильно разные моменты затронуты
25. nyam-nyam 22.06.23 16:28 Сейчас в теме
(9) Скорее всего дело в особенностях винды - не любит она кучи открытых файлов, а постря именно это и делает. Попробуйте пострю на линукс поставить - ещё и на лицензии на винду сэкономите. :)
15. korefano 20 21.06.23 08:13 Сейчас в теме
(13)
В ТОИР версии 2 и 3 есть один запрос (один точно), который составлен очень неоптимально. MSSQL грамотно выполняет его за 0.1 мс, он за разработчика его оптимизирует. PG выполняет этот запрос "тупо" как написано за 30 сек. MSSQL прощает ошибки разработчиков и имеет продвинутый оптимизатор. По этойже причине, по моему мнению, не работает расчет себестоимость на ERP+PG


P.S.
Я лично наблюдал различия в результатах запросах одной и тойже базы на MSSQL и PG. Разные цифры
16. a.doroshkevich 1496 21.06.23 08:21 Сейчас в теме
(15) 20 лет оптимизируем 1с под ms SQL, теперь будем под postgres)
Хороший запрос везде быстрый, а так да, ms SQL много что прощает
ivanov660; +1 Ответить
17. korefano 20 21.06.23 09:19 Сейчас в теме
22. korefano 20 21.06.23 11:52 Сейчас в теме
(21) (21)
Только быстродействие
26. limus80 23.06.23 11:00 Сейчас в теме
(16)
по вестям с полей все хорошо и быстро работает в основном на платных версиях PostgrePro, особенно на Enterprise
А вот тут начинаются нюансы, все это по цене (учитывая цену спецов) выходит чуть ли не дороже сиквела
Антон, поправьте если не так
29. a.doroshkevich 1496 23.06.23 19:14 Сейчас в теме
(26) сильно не так.
По скорости работы главное это качество кода 1с
Платные версии pg имеют другие плюсы...
Грубо говоря перейдя с бесплатной на платную версию скорость в большинстве сценариев останется прежней
strav; G.Shatrov; ivanov660; +3 Ответить
33. Salavat 14 09.11.24 19:05 Сейчас в теме
Антон, подскажите, пожалуйста:
Нужно ли блокировать обновления - для 1С-сборки от фирмы 1С?
Поставил сейчас текущий релиз от 1с - 16.4-5.1C.
И не знаю - блокировать или нет.
(Саму Ubuntu и прочие приложения - обновляю, да!)
----
(Про 1С-сборку от Postgres Pro согласен с Вами - с нею, всё очень просто делается.
Несколько скриптов по емайлу приходят - которые копи-пастом ввести - и всё без вопросов, да!
Но - с нею, проблема у меня другая.
Вопрос по той проблеме, отдельный - также задам, здесь же.)
34. Salavat 14 09.11.24 19:22 Сейчас в теме
(И 2-ой вопрос - со 1С-сборкой от Postgres Pro - именно так у меня, всегда было!
На 1С-сборке от фирмы 1С - пока не знаю, ещё.)
После установки комбинации "1С-сборки от Postgres Pro" и "pgAdmin 4 (APT)" -
(Обе с оф.сайтов - разные версии пробовал, в течение 2-ух лет!)
Возникает ошибка - https://sun9-15.userapi.com/impg/Sspc3bZDW2X8grZK_72vKmpdZqJcwxqKSC-hdw/nVzZyKLuDYQ.jpg?size=1280x720&quality=95&sign=593cd66e4faf766a47c5084eac87a9­00&type=album

Эта ошибка возникает - и при обновлении системы, и установке программ в Ubuntu, и...
(На какой-то пакет жалуется - postgresql-client-14.
Хотя на фото - версия от Postgres Pro - у меня 16-ая стояла!!
На 15-ой - аналогичная ошибка была!)
В итоге - программы не ставятся, после установки "pgAdmin 4 (APT)"!
----
Подскажите, пожалуйста - как решить эту проблему??
Оставьте свое сообщение