Установка і настройка postgresql на debian 8 для роботи з 1С
Сьогодні хочу розповісти про установку і невеликий налаштування сервера бд postgresql для роботи з базами 1С. Завдання не складна, але є невеликі нюанси як по налаштуванню, так і за вибором дистрибутива. Існують кілька модифікацій postgresql для 1С. Я розповім про установку двох з них – одна від самої компанії 1С, друга від postgrespro.
Вступ
Розповім трохи про можливості роботи 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/postgrehttp://etersoft.ru/products/postgre
- Від Postgrespro – https://postgrespro.ru/products/1c_buildhttps://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 пакет для нашої системи.
Передаємо файл на сервер, наприклад через 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. Але є й інші відмінності. Закликаю не копіювати мій конфіг і вставляти до себе, а порівнювати мої параметри і ваш дефолтний конфіг і змінювати безпосередньо значення параметрів.
Висновок
У моєму випадку база 1С працювала приблизно однаково в обох випадках. У підсумку я вирішив зупинитися на складанні від postgrespro, так як там більш свіжа версія 9.6. У мене була база 10 гб. Працювала вона прийнятно, крім деяких операцій – коли йде читання по всій базі для побудови якихось списків. Тюнінг різних параметрів не привів до зменшення часу виконання подібних запитів. Так що це питання залишається відкрите. Простого рішення знайти не вдалося. Що точно потрібно змінити для прискорення роботи подібних запитів – не знаю. Розбір цієї ситуації описав в окремому матеріалі – Прискорення роботи 1С з postgresql і діагностика проблем продуктивності .
Помітив, що під час виконання запиту на 100% навантажено одне ядро процесора. Погуглити тему, стало ясно, що це особливість архітектури. Один запит обробляє одне ядро. Простих способів вирішення даної проблеми не існує. Більш докладно я не став розбиратися. На думку відразу спало встановити якийсь кеш, щоб зберігати важкі запити. Знайшов інформацію про pg_bouncer . Встановити не вийшло, він відразу з пакетів не встав з моєю версією від postgrespro, вилаявся на залежності. Треба розбиратися і збирати з початкових кодів. Немає впевненості, що це допоможе, не став заморочуватися, так як немає багато часу на вирішення цього завдання. Буду радий будь-яким підказкам і коментарям за темою.
Якщо ви вирішите використовувати описане рішення в продакшені, вам стане в нагоді матеріал на тему бекапа і відновлення баз postgresql .