Linux + PostgreSQL + 1C
Установка Linux. Взял Ubuntu 16.04 LTS. AMD (x64).
Установка ssh: sudo apt install openssh-server
Активировал root: sudo chpasswd (passwd) root. Поставил: mc и sshd (обновил Putty)
Скачал и установил оптимизированный под 1С postgres с сайта: https://postgrespro.ru/products/1c_build
Подключение под debian 7/8, ubuntu 12.04/14.04/16.04:
sudo sh -c 'echo "deb http://1c.postgrespro.ru/deb/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/postgrespro-1c.list'
wget --quiet -O - http://1c.postgrespro.ru/keys/GPG-KEY-POSTGRESPRO-1C-92 | sudo apt-key add - && sudo apt-get update
sudo apt-get install postgresql-pro-1c-9.4
Не помню делал или не делал то что ниже:
ОБНОВЛЕНИЕ МИНОРНОЙ ВЕРСИИ DEB ПАКЕТОВ ДО ВЕРСИЙ
9.5.4, 9.4.9, 9.3.14, 9.2.18: Начиная с версий 9.5.4, 9.4.9, 9.3.14, 9.2.18 в нашу DEB сборку были внесены изменения. Пакет postgresql-pro-1c-[9.2|9.3|9.4|9.5] теперь является реальными именем пакета, а не виртуальным как раньше. Это было сделано, чтобы избежать некорректного разрешения зависимостей при установке наших пакетов, которое обусловлено наличием в APT механизма installation candidate, из-за которого становится невозможным гарантировать предсказуемое разрешение зависимостей. Минорное обновление до вышеуказанных версий осуществляется следующим образом:
apt-get update && apt-get install postgresql-pro-1c-[9.2|9.3|9.4|9.5]
Если у Вас при обновлении возникла ошибка неудовлетворенных зависимостей, необходимо предпринять следующие шаги:
(На примере версии 9.4.8)
1. Переименуйте директории с конфигами и данными:
mv /etc/postgresql/9.4 /etc/postgresql/9.4.upgrade
mv /var/lib/postgresql/9.4 /var/lib/postgresql/9.4.upgrade
2. Удалите установленные пакеты из стандартного репозитория:
apt-get purge postgresql*9.4 postgresql-client-common
3. Обновите мета-информацию о пакетах:
apt-get update
4. Установите пакет:
apt-get install postgresql-pro-1c-9.4
5. Переименуйте обратно директории из шага 1:
rm -rf /etc/postgresql/9.4 /var/lib/postgresql/9.4
mv /etc/postgresql/9.4.upgrade /etc/postgresql/9.4
mv /var/lib/postgresql/9.4.upgrade /var/lib/postgresql/9.4
6. Запустите postgresql
Далее команды:
service postgresql status
sudo locale-gen en_US
sudo locale-gen ru_RU
sudo update-locale LANG=ru_RU.UTF8
sudo dpkg-reconfigure locales
echo “kernel.shmmax = 134217728” >> /etc/sysctl.conf
Меняем права на каталог СУБД:
chown –R postgres:postgres /var/lib/pgsql
и перезагружаем сервер
Меняем пароль пользователю postgres:
passwd postgres
Теперь меняем пользователя:
su –l postgres
Входим в интерактивную терминальную программу PostgreSQL (psql), позволяющую нам управлять СУБД командами SQL:
psql
Меняем пароль внутреннему пользователю СУБД:
alter user postgres with password 'PASSWORD';
Выходим из psql:
\q
Настройка postgres.
Для настройки системы нам понадобятся 2 файла.
/var/lib/pgsql/data/postgresql.conf – отвечает за все основный настройки postgres
/var/lib/pgsql/data/pg_hba.conf - файл настроек доступа к СУБД
Мой файл /var/lib/pgsql/data/postgresql.conf (Intel Core i7, 8Gb RAM, 40 одновременно работающих пользователей):
max_connections = 150 (максимально большое количество одновременных соединений)
shared_buffers = 75MB (это не память для Postgres, а «размер разделяемой между процессами PostgreSQL памяти, которая нужна для выполнения активных операций»)
work_mem = 64MB («определяет максимальное количество оперативной памяти, которое может выделить одна операция сортировки, агрегации и др.» Исчисляется по хитрой формуле: (ОЗУ – память_для_всех_запущенных_приложений - shared_buffers) / максимальное_число_одновременных_запросов * число_операций_в_запросе. Сам не высчитывал, а взял из какой-то статьи.)
effective_cache_size = 4096MB (Самый большой объект в БД, который может быть размещен в кэше. Высчитывается как:
2/3 ОЗУ - память_для_всех_запущенных_приложений. Я просто поставил 50% ОЗУ)
autovacuum = on (Периодическая дефрагментация БД)
autoacuum_naptime = 5min
fsync on (Если не используете RAID с аварийным питанием. Данные пишутся сразу на диск)
maintenance_work_mem = 256MB (Параметр определяет объём памяти, выделяемый для таких операций, как VACUUM, CREATE INDEX, ALTER TABLE ADD FOREIGN KEY. Устанавливается в половину объема памяти самой большой таблицы. Рекомендуют не заморачиваться и ставить 32-256Мб)
В процессе работы было выявлено, что неимоверно растут логи из-за множества раз повторяющегося сообщения: “Warning: nonstandard use of \\ in a string literal… hint: Use the escape string sintax for backslashes, e.g. E”. Это возникает из-за особенностей совместимости postgresql с другими SQL-системами. Кроме того, возможно появление ошибки при создании базы из оснастки: "syntax error at or near second at character 227". Поэтому ставим:
backslash_quote = safe_encoding
escape_string_warning = off
standard_conforming_strings = off
З.Ы. «если вы комментируете какой-либо параметр в postgresql.conf, это совсем не значит, что он принимает первоначальное значение по умолчанию. PostgreSQL будет помнить значение его последней настройки»
/var/lib/pgsql/data/pg_hba.conf:
Идем в самый низ файла, находим строки:
TYPE DATABASE USER CIDR-ADDRESS METHOD
Дописываем:
host all all 127.0.0.1/32 md5
host all all 192.168.0.0/24 md5
Вместо 192.168.0.0/24 ставим свою сеть и ее разрядность.
Отредактировали конфиги – перегружаем СУБД:
#/etc/init.d/postgresql restart
Подключаем базу 1С. (Сервер 1С Предприятие у меня установлен на отдельную машину с Windows. В данной статье не рассматривается его установка на Linux) Есть разные способы. Если мы хотим создать новую базу 1С, то это необходимо делать из оснастки «Администрирование серверов 1С Предприятие» (поставить галочку «Создать, в случае отсутствия»). Этот способ необходим для создания «пустой» базы (например, для последующей загрузки *.dt – архива). Но этот способ не подойдет, если базу 1С будем восстанавливать из архива postgres (*.backup) Вы можете возразить, что архив средствами postgres нам и не нужен. Ниже я покажу, как можно очень удобно делать бэкап на лету средствами postgres, не выгоняя пользователей и без ущерба производительности. Так вот, чтобы восстановить архив 1С *.backup, сделанный средствами СУБД делаем следующее.
Есть очень удобное графическое средство для администрирования Postgresql из-под Windows – утилита pgadmin (http://www.pgadmin.org/download/windows.php) Качаем ее, устанавливаем. Затем пункт меню «Файл» - Добавить сервер – Заполняем поля Имя, Хост, Имя пользователя, пароль (Остальное не трогаем). Если сервер не подключился, то смотрим файл /var/lib/pgsql/data/pg_hba.conf, который, как мы помним, отвечает за настройки доступа к СУБД. Если сервер подключился, тогда правой кнопкой по ветке Базы – Новая база данных. Вводим имя базы, владелец postgres, кодировка должна сразу стоять по-умолчанию UTF8. Остальные поля не трогаем. После создания базы правой кнопкой мыши Восстановить… - указываем файлик my_archive_1c.backup. После восстановления базы ее нужно подключить к серверу 1С из оснастки «Администрирование серверов 1С Предприятие» (СНЯТЬ галочку «Создать, в случае отсутствия»). Имя вводим то же, что и при создании базы в pgadmin'e.
Хранение базы данных.
PostgreSQL как и почти любая СУБД критична к дисковой подсистеме.
Наиболее дешевым способом является создание массива типа RAID 0. Т.е. это два диска, объединенных в один массив, при котором скорость доступа к данным увеличивается в два раза (недостаток типа RAID 0 – это низкая надежность. При выходе из строя одного диска, данные теряются. Повысить надежность можно через создание частых бэкапов. См. ниже.). Можно использовать различные аппаратные RAID-контроллеры, но опять же, наиболее дешевым способом организации является программный метод. «Зачастую использование программного RAID более предпочтительно, особенно если в сервере установлен дешевый контроллер». Для построения RAID-массива я использовал утилиту mdadm. Отличная статья по теме: http://www.qdesnic.ru/page/soft-raid-v1.html Все делаем по статье, только ставим тип массива RAID 0 и перед непосредственным созданием RAID нужно сделать остановку массива: mdadm –S /dev/md0
Для повышения быстродействия СУБД я разместил систему postgres, логи и сами базы на разные диски. «Выделение для лога транзакций собственных дисковых ресурсов (массива или просто отдельного диска) дает как минимум 12% выигрыш для нагруженных систем.» Т.е. postgres работает на диске где и операционная система Linux, для логов подключаем еще один отдельный жесткий диск, а базы крутятся на тоже отдельном RAID-массиве. Делается это путем создания ссылок.
Перенос логов:
# /etc/init.d/postgresql stop
# mv /var/lib/pgsql/data/pg_xlog /mnt/hdd2
# ln -s /mnt/hdd2/pg_xlog /var/lib/pgsql/data/pg_xlog
# /etc/init.d/postgresql start
Тоже самое с папками /var/lib/pgsql/data/pg_clog и /var/lib/pgsql/data/pg_log
Так же переносим каталог с базами:
# /etc/init.d/postgresql stop
# mv /var/lib/pgsql/data/base /mnt/raid
# ln -s /mnt/raid/base /var/lib/pgsql/data/pg_xlog
# /etc/init.d/postgresql start
Резервное копирование средствами СУБД. Базы 1С архивируются утилитой в составе postgres – pg_dump. Копирование происходит «на-лету» каждый час с 9.00 до 20.00. Пользователи, естественно, спокойно работают. В процессе дампа базы тормозов вообще не ощущается (40 пользователей в торговый сезон). Хотя, если смотреть использование ресурсов утилитой top, то видно, что используется больше 100%! Прочитал на postgres.ru что это нормально и объясняется это особенностью внутренней архитектуры postgres-а. В вопросах резервного копирования каждый админ должен быть чуть-чуть параноиком поэтому архив складывается непосредственно на сервер и на отдельный локальный ftp-сервер.
pg_dump. Чтобы утилита работала через скрипт без запроса пароля, нужно в каталоге пользователя от имени которого он запускаются положить файл .pgpass: *:*:*:postgres:password
и изменить права на файл (для обеспечения уровня безопасности, требуемого postgres-ом нужно чтобы файл был только на выполнение):
#: chmod 0600 ~/.pgpass
Для соединения с ftp-сервером использую программу curlftpfs. Статья по теме: http://linux-bash.ru/mseti/27-connectftp.html Каждый час выполняется скрипт архивирования, который создает и скидывает архивы на диск сервера и ftp-сервера в отдельные папки (которые сам создает) по дням, а внутри них – по часам:
#!/bin/bash
BASE=base1c
DATEBACKUP=`date +%Y%m%d%H%M%S`.backup
PATHBACKUP=/var/lib/pgsql/backups/ base1c
PATHFTP=/opt/ftpm
FTPSTRING=ftp://name:password@host
DAY=`date +%Y%m%d`
HOUR=`date +%H`
#mkdir $PATHBACKUP/$DAY
#mkdir $PATHBACKUP/$DAY/$HOUR
#echo 'Create backup: '$DATEBACKUP' of base: '$BASE
#pg_dump -h localhost -U postgres -Fc -Z9 -c -f $PATHBACKUP/$DAY/$HOUR/$DATEBACKUP $BASE
#echo 'Connect to ftp...'
#cd $PATHFTP
#rm * -r -f
#curlftpfs -o allow_other $FTPSTRING $PATHFTP
#echo 'Create directories: '$DAY' and '$HOUR
#mkdir $PATHFTP/$DAY
#mkdir $PATHFTP/$DAY/$HOUR
#echo 'Copy file: '$NAMEBACKUP' to: '$HOUR
#cp $PATHBACKUP/$DAY/$HOUR/$DATEBACKUP $PATHFTP/$DAY/$HOUR
ping 127.0.0.1 -c 7
#umount $PATHFTP
Настраиваем расписание запуска скрипта. В файле /etc/crontab пишем:
0 9 *** root /root/scripts/backup1C
0 10 *** root /root/scripts/backup1C
…
0 20 *** root /root/scripts/backup1C
И на-последок внеклассное чтение:
http://wiki.etersoft.ru/PostgreSQL