Сегодня хочу рассказать об установке и небольшой настройке сервера бд postgresql для работы с базами 1С. Задача не сложная, но есть небольшие нюансы как по настройке, так и по выбору дистрибутива. Существуют несколько модификаций postgresql для 1С. Я расскажу про установку двух из них - одна от самой компании 1С, вторая от postgrespro.
Содержание:
Данная статья является частью единого цикла статьей про сервер Debian.
Введение
Расскажу немного о возможности работы 1С, при которой можно сэкономить деньги на лицензиях, используя дистрибутив linux и бесплатную бд postgresql. Сервер 1С обычно используют в одной из следующих связок:
- Сервер 1С на Windows + MSSQL Server. Тут все понятно, самая распространенная и самая дорогая связка. Требуется лицензия для MSSQL сервера.
- Сервер 1С на Linux + PostgreSQL. Вариант с максимальным использованием бесплатного ПО. Я давно не использовал эту связку. Последний раз тестировал года 4 назад и мне не понравилась работа 1С сервера на linux. Я использовал дистрибутив Debian. Настройка не сильно сложная, но и не сказать, что простая. Надо ставить драйвера для hasp, чтобы сервер увидел ключ. Сервер работал не стабильно, иногда не получалось сделать выгрузку базы, приходилось перезапускать службу сервера. В целом работало, но не очень надежно. Мне тогда довелось пообщаться плотно с компанией, которая на постоянной основе использовала такую связку и админ тоже жаловался, что приходится сервер 1С перезапускать каждую ночь, тогда более ли менее стабильно все работает. С тех пор я не тестировал работу 1С на линуксе, так что про текущее положение дел ничего сказать не могу.
- Сервер 1С на Windows + PostgreSQL. Более привычный для настройки и управления вариант. Сервер ставится как обычно на windows машину, настраивается традиционным способом, а в качестве бд выступает бесплатная postgresql. О такой связке я и хочу сегодня рассказать.
Стандартная posgresql не будет нормально работать с базами 1С. В чем там проблема, я не знаю, не разбирался. Для работы с 1С используют отдельные сборки, специально под это заточенные. Мне известны 3 сборки posgresql для работы с 1С:
- От Etersoft - http://etersoft.ru/products/postgre
- От Postgrespro - https://postgrespro.ru/products/1c_build
- И от самой 1С. Скачать можно через портал поддержки пользователей.
Я установлю и настрою для сравнения сборку от 1С и от Postgrespro, чтобы попытаться понять, где будет выше производительность. Настраивать все будем на сервере Debian 8. Если у вас еще нет настроенного сервера, то рекомендую мои статьи по установке и настройке debian. Я создал 2 одинаковые виртуальные машины для теста и установил на каждую из них разную версию базы данных.
Подготовка сервера к установке postgresql
Если вы читали мою статью по настройке debian, то наверно уже обновили систему. Если нет, то сделаем это:
# apt-get update && apt-get upgrade
Скофнигурируем локали. Нам необходимо, чтобы в системе были 2 локали: en_US.UTF-8 и ru_RU.UTF-8. При этом русская должна быть установлена по-умолчанию. Выполняем конфигурацию с помощью команды:
# dpkg-reconfigure locales
Отмечаем указанные выше локали и выбираем ru_RU.UTF-8 дефолтной.
Проверить список установленных локалей можно командой:
# locale -a
Устанавливаем необходимые пакеты:
# apt-get install ssl-cert libossp-uuid16 libxslt1.1
Устанавливаем вручную еще один пакет:
# wget http://ftp.ru.debian.org/debian/pool/main/i/icu/libicu48_4.8.1.1-12+deb7u3_amd64.deb # dpkg -i libicu48*.deb
Редактируем системный параметр kernel.shmmax. Какое точно значение для наилучшей производительности выставлять, я не знаю. Не смог найти однозначного ответа. Видел рекомендацию, что в половину оперативной памяти на сервере. Я сделал у себя именно так. Вычислить размер параметра можно по формуле: Mb*1024*1024. У меня виртуальный сервер с 8Gb памяти, значение параметра получается 4096*1024*1024 = 4294967296. Добавляем это значение в /etc/sysctl.conf.
kernel.shmmax = 4294967296
Применяем внесенное изменение:
# sysctl -p
Проверить текущее значение параметра можно командой:
# cat /proc/sys/kernel/shmmax
У нас все готово для установки непосредственно postgresql.
Установка сборки PostgreSQL для платформы 1С от postgrespro
Будем устанавливать самую свежую сборку на момент написания статьи - PostgreSQL 9.6.1. Подключаем репозиторий:
# sh -c 'echo "deb http://1c.postgrespro.ru/deb/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/postgrespro-1c.list'
Устанавливаем gpg ключ
# wget --quiet -O - http://1c.postgrespro.ru/keys/GPG-KEY-POSTGRESPRO-1C | apt-key add -
Обновляем список пакетов:
# apt-get update
Устанавливаем PostgreSQL
# apt-get install postgresql-pro-1c-9.6
Запускаем базу данных и добавляем в автозагрузку:
# systemctl start postgresql # systemctl enable postgresql
Установка сборки postgresql для работы с 1С от postgrespro закончена. Можно начинать работать с базой данных. Но перед этим необходимо задать пароль суперпользователя базы данных и выполнить небольшой тюнинг для увеличения быстродействия базы данных. С дефолтными настройками 1С будет работать очень медленно. Настройкой мы займемся позже, после того, как поставим вторую сборку от 1С.
Установка сборки PostgreSQL от 1С
Свежую версию postgresql от 1С можно скачать в пользовательском разделе на сайте 1С по адресу https://releases.1c.ru/total
Мы устанавливаем postgres на сервер Debian, поэтому скачиваем deb пакет для нашей системы.
Если у вас нет доступа к порталу 1С, можете забрать актуальный файл на момент написания статьи у меня - https://yadi.sk/d/hWi1PMBd1B7QIA.
Передаем файл на сервер, например через sftp или ssh. Распаковываем содержимое архива в отдельную папку:
# mkdir postgres # tar -xvf postgresql-9.4.2-1.1C_amd64_deb.tar.bz2 -C postgres
В архиве были следующие файлы:
# cd postgres # ls -l
итого 5420 -rw-r--r-- 1 120250 июн 2 2015 libpq5_9.4.2-1.1C_amd64.deb -rw-r--r-- 1 3657036 июн 2 2015 postgresql-9.4_9.4.2-1.1C_amd64.deb -rw-r--r-- 1 1069692 июн 2 2015 postgresql-client-9.4_9.4.2-1.1C_amd64.deb -rw-r--r-- 1 72172 авг 11 2015 postgresql-client-common_154.1.1C_all.deb -rw-r--r-- 1 163684 авг 11 2015 postgresql-common_154.1.1C_all.deb -rw-r--r-- 1 457782 июн 2 2015 postgresql-contrib-9.4_9.4.2-1.1C_amd64.deb
Устанавливаем все пакеты:
# dpkg -i *.deb
Все, установка postgresql от 1С закончена. Запускаем и добавляем в автозагрузку:
# systemctl start postgresql # systemctl enable postgresql
Теперь приступаем к настройке для увеличения производительности базы 1С.
Настройка postgresql для увеличения производительности 1С
Настройка это, конечно, громко сказано. Я не занимался серьезно тюнингом postgresql и тестированием. Бегло поискал в интернете информацию и использовал наиболее популярные советы. Так что мои рекомендации не претендуют на реально проверенные и надежные решения. Используйте на свое усмотрение. Я просто делюсь тем, что сам нашел.
Перед изменением конфига, зададим пароль административной учетной записи нашего сервера бд. Для этого заходим в систему от пользователя postgres:
# su postgres
Меняем пароль внутреннего пользователя бд postgres:
# /usr/bin/psql -U postgres -c "alter user postgres with password 'postgrespwd';"
postgrespwd - пароль пользователя для административного доступа к базе данных. Эту учетную запись необходимо использовать для добавления новой базы в Сервер 1С.
Возвращаемся к тюнингу postgres. В первую очередь рекомендую сервис pgtune - http://pgtune.leopard.in.ua. В нем можно указать характеристики сервера и получить рекомендации по настройке. Так как у нас 2 сервера разных версий - первый 9.6, второй 9.4, рекомендации будут немного отличаться. Имейте это ввиду. Вот пример рекомендаций для первого сервера от postgrespro:
Укажите эти параметры в файле конфигураций. В моем случае это файл /etc/postgresql/9.6/main/postgresql.conf. Мне знакомый скинул готовый файл настроек с рекомендуемыми параметрами для 1С. Я не знаю происхождение этого файла, но настройками воспользовался. В итоге с учетом этого конфига и сайта pgtune я получил вот такой файл конфигурации postgres:
data_directory = '/var/lib/postgresql/9.6/main' hba_file = '/etc/postgresql/9.6/main/pg_hba.conf' ident_file = '/etc/postgresql/9.6/main/pg_ident.conf' external_pid_file = '/var/run/postgresql/9.6-main.pid' listen_addresses = '*' port = 5432 max_connections = 10 unix_socket_directories = '/var/run/postgresql' ssl = true ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem' ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key' shared_buffers = 2GB temp_buffers = 32MB work_mem = 104857kB maintenance_work_mem = 512MB autovacuum_work_mem = 64MB dynamic_shared_memory_type = posix shared_preload_libraries = 'online_analyze, plantuner' bgwriter_delay = 10ms bgwriter_lru_maxpages = 1000 bgwriter_lru_multiplier = 10 fsync = on synchronous_commit = off wal_buffers = 16MB checkpoint_timeout = 55min max_wal_size = 2GB min_wal_size = 1GB checkpoint_completion_target = 0.9 effective_cache_size = 6GB geqo = off default_statistics_target = 100 # range 1-10000 default_statistics_target = 10 cursor_tuple_fraction = 0.0001 from_collapse_limit = 2 join_collapse_limit = 2 log_line_prefix = '%t [%p-%l] %q%u@%d ' log_timezone = 'localtime' cluster_name = '9.6/main' stats_temp_directory = '/var/run/postgresql/9.6-main.pg_stat_tmp' log_autovacuum_min_duration = 0 autovacuum_max_workers = 3 autovacuum_naptime = 15s autovacuum_vacuum_threshold = 90 autovacuum_analyze_threshold = 9 autovacuum_vacuum_scale_factor = 0.0002 autovacuum_analyze_scale_factor = 0.0001 autovacuum_vacuum_cost_delay = 10ms autovacuum_vacuum_cost_limit = 10000 datestyle = 'iso, dmy' timezone = 'localtime' lc_messages = 'ru_RU.UTF-8' lc_monetary = 'ru_RU.UTF-8' lc_numeric = 'ru_RU.UTF-8' lc_time = 'ru_RU.UTF-8' default_text_search_config = 'pg_catalog.russian' max_locks_per_transaction = 150 max_pred_locks_per_transaction = 150 backslash_quote = on escape_string_warning = off standard_conforming_strings = off online_analyze.threshold = 50 online_analyze.scale_factor = 0.1 online_analyze.enable = on online_analyze.verbose = off online_analyze.min_interval = 10000 online_analyze.table_type = 'temporary' plantuner.fix_empty_table = false
Не забудьте перезапустить postgresql после изменения настроек:
# systemctl restart postgresql
Для версии 9.4 настройки будут немного отличаться. Там как минимум не будет параметров min_wal_size и max_wal_size. Но есть и другие отличия. Призываю не копировать мой конфиг и вставлять к себе, а сравнивать мои параметры и ваш дефолтный конфиг и изменять непосредственно значения параметров.
Есть хороший материал на тему оптимизации postgresql для работы с 1С - http://nixway.org/2015/12/06/optimizacija-postgresql-pod-server-1c-predpriyatiya. Я не буду повторяться и копировать информацию. Можете сами ознакомиться.
Заключение
В моем случае база 1С работала примерно одинаково в обоих случаях. В итоге я решил остановиться на сборке от postgrespro, так как там более свежая версия 9.6. У меня была база 10 гб. Работала она приемлемо, кроме некоторых операций - когда идет чтение по всей базе для построения каких-нибудь списков. Тюнинг различных параметров не привел к уменьшению времени выполнения подобных запросов. Так что этот вопрос остается открытый. Простого решения найти не удалось. Что точно нужно изменить для ускорения работы подобных запросов - не знаю. Разбор этой ситуации описал в отдельном материале - Ускорение работы 1С с postgresql и диагностика проблем производительности.
Заметил, что во время выполнения запроса на 100% нагружено одно ядро процессора. Погуглил тему, стало ясно, что это особенность архитектуры. Один запрос обрабатывает одно ядро. Простых способов решения данной проблемы не существует. Более подробно я не стал разбираться. На ум сразу пришло установить какой-то кэш, чтобы сохранять тяжелые запросы. Нашел информацию про pg_bouncer. Установить не получилось, он сходу из пакетов не встал с моей версией от postgrespro, ругнулся на зависимости. Надо разбираться и собирать из исходников. Нет уверенности, что это поможет, не стал заморачиваться, так как нет много времени на решение этой задачи. Буду рад любым подсказкам и комментариям по теме.
Если вы решите использовать описанное решение в продакшене, вам пригодится материал на тему бэкапа и восстановления баз postgresql.
Напоминаю, что данная статья является частью единого цикла статьей про сервер Debian.
Онлайн курс по Linux
Если вы хотите стать специалистом по отказоустойчивым виртуальным и кластерным средам, рекомендую познакомиться с онлайн-курсом Администратор Linux. Виртуализация и кластеризация в OTUS. Курс не для новичков, для поступления нужны хорошие знания по Linux. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Что даст вам этот курс:- Умение строить отказоустойчивые кластера виртуализации для запуска современных сервисов, рассчитанных под высокую нагрузку.
- Будете разбираться в современных технологиях кластеризации, оркестрации и виртуализации.
- Научитесь выбирать технологии для построения отказоустойчивых систем под высокую нагрузку.
- Практические навыки внедрения виртуализации KVM, oVirt, Xen.
- Кластеризация сервисов на базе pacemaker,k8s, nomad и построение дисковых кластеров на базе ceph, glaster, linstore.
Дополнительные материалы по Debian
Рекомендую полезные материалы по Debian: |
Настройки системы |
---|
Подробная установка Debian 9 Stratch с помощью графического инсталлятора со скриншотами и пояснениями к каждому пункту установщика.
Базовая настройка сервера Debian. Приведены практические советы по улучшению безопасности и удобства администрирования.
Подробное описание настройки сети в Debian - задать ip адрес, dhcp, отключить ipv6, dns, hostname, статические маршруты и др.
Обновление предыдущей версии Debian 8 Jessie до последней Debian 9 Stratch. Подробная инструкция с описанием по каждому этапу обновления.
Обновление версии Debian 7 wheezy до Debian 8 Jessie. Подробная инструкция с описанием по каждому этапу обновления.
Включение записи логов cron в Debian в отдельный файл и настройка ротации этого файла. Отключение логов в syslog.
|
Настройка программных комплексов |
Подробное описание установки гипервизора proxmox на raid1 mdadm на базе операционной системы Debian 8. Приведены практические советы по настройке.
Настройка интернет шлюза на Debian. Включает в себя настройку iptables, nat, dhcp, dns, iftop.
Чистая установка Asterisk 13 на сервер под управлением Debian 8. Никаких дополнений и GUI, только vanilla asterisk.
Установка Freepbx 12 и Asterisk 13 на сервер под управлением Debian/Ubuntu. Подробное описание и разбор ошибок установки.
Рассказ об установке и небольшой настройке сервера бд postgresql для работы с базами 1С. Задача не сложная, но есть небольшие нюансы как по настройке, так и по выбору дистрибутива.
Описание установки и настройки pptp сервера в Debian с передачей статических маршрутов клиенту для организации доступа к ресурсам сети.
|
Разное |
Подробное описание настройки бэкапа с помощью rsync на примере скрипта инкрементного архива на системе Centos, Debian, Ubuntu, Windows.
Ускорение работы 1С с postgresql и диагностика проблем производительности
|
Здравствуйте, Вы встречались с проблемой когда служба постгреса не стартует после сбоя по питанию? Как быть в таких случаях?
С базой могло что-то случиться. Она не любит аварийные выключения. Нужно смотреть лог postgres на предмет ошибок и исправлять их. Чаще всего исправить получается, но могут быть и фатальные ошибки с повреждением какой-нибудь таблицы.
Я тестово развернул виртуалку на windows server 2019 в hyper-v после жесткого ресета не запускается служба ругаясь на блокировку postmaster.pid файл в журналах windows.
Лог сыпет.
LOG: database system was not properly shut down; automatic recovery in progress
LOG: redo starts at 7/91630030
LOG: invalid record length at 7/91902888: wanted 24, got 0
LOG: redo done at 7/91902860
LOG: last completed transaction was at log time 2020-02-15 04:27:31.864602+07
LOG: database system is ready to accept connections
LOG: database system was interrupted; last known up at 2020-02-15 04:33:47 +07
FATAL: the database system is starting up
FATAL: the database system is starting up
Для себя нашел решение
cd "C:\Program Files\PostgreSQL\11.5-12.1C\bin\"
pg_ctl.exe -D "D:\PostgreSQL_1C_Database" stop -s -m fast
После этого все стартует нормально. Но автоматизировать это не получилось да и кажется что это больше костыль чем решение правильное.
А зачем в Вашем конфиге два раза один и тот же параметр с разными значениями?
default_statistics_target = 100 # range 1-10000
default_statistics_target = 10
Ошибся, похоже, когда формировал полный конфиг.
https://postgrespro.ru/docs/postgrespro/9.6/config-one-c вот ещё небольшое дополнение по настройке.
Добрый день!
При выполнении данных действий
Устанавливаем PostgreSQL
# apt-get install postgresql-pro-1c-9.6
Выдает ошибку:
Пакеты, имеющие неудовлетворённые зависимости:
postgresql-pro-1c-9.6 : Зависит: postgresql-client-pro-1c-9.6 но он не будет установлен
Никак не пойму в чем причина.
Можете описать процесс установки сервеар 1с на Debian?
Всем доброго времени суток. Кто знает как перенести базу 1С в PostgreSQL на другой отдельный диск например на SSD ?
Первое, что приходит на ум - остановить службу, подмонтировать новый диск, перенести на него базу, сделать символьную ссылку с нового места на старое, запустить службу postgresql.
Вообще там служба стартует с ключом -d, в который прописывается путь до папки кластера.
где тогда живёт хасп-ключ, если на линуксе только postgres?
Там же, где 1С сервер. Ключ нужен серверу, а не БД.
Статья отличная. Пользуюсь написанной для себя инструкцией уже более 3-х лет. Читал и прям как у меня написано и оптимизация и всё прочее. И PostgresPRO всегда сборки устанавливаю.
Хотелось бы добавить ещё один параметр оптимизации. И чтобы его в статью внесли.
150 или более, подбирается опытным путем. У меня блокировки пропали на 250 (в базе около 150 человек работает)
max_locks_per_transaction = 250
Спасибо за статью !
Да, менял этот параметр тоже, когда оптимизировал. А у тебя есть опыт решения следующей проблемы. У меня в базе есть запросы, которые выполняются очень долго, по 10-15 секунд. В это время весь интерфейс 1С зависает. Я посмотрел на сами запросы, включив лог длинных запросов в базе. Это запросы типа select с огромным количеством параметров. Когда выполняется подобный запрос, одно ядро загружено на 100%, все остальные в простое. Я почитал информацию и понял, что это особенность архитектуры - один запрос может обрабатывать только одно ядро. В итоге, то, что у тебя высокопроизводительный сервер с кучей ядер тебе никак не помогает. Жирный запрос висит на одном ядре и тормозит.
Я понимаю, что проблема скорее всего в этом запросе, но его не поменять, это функционал 1С, она сама как-то формирует эти запросы. Не понятно, как решать такую проблему.
Настраивал на Debian 8.6 Сборка от PostgresPro - Полет нормальный на УТ 11.3
Возник один вопрос - Как изменить имя рабочего сервера после установки?
А в чем проблема изменения имени? Не предвижу никаких проблем.