1. Установка Linux. Можно долго спорить и выбирать дистрибутив. Это скорей вопрос личных предпочтений и «кто на чем привык работать». Я взял Debian из-за его высокой стабильности и устойчивости. К тому же в сети огромное количество статей по любому вопросу работы Debian. Не стану описывать процесс установки. Есть масса мануалов на тему. (Вот очень хороший: http://mydebianblog.blogspot.com/2006/08/in-true-debian-way.html)
Свои пять копеек:
1.1 Рекомендую взять диск netinstall – он гарантированно поставит только базовую систему и ничего лишнего. Сам использовал 64-битную версию: http://cdimage.debian.org/debian-cd/6.0.2.1/amd64/iso-cd/debian-6.0.2.1-amd64-netinst.iso
1.2 Я не долго думал над разбивкой диска на разделы. Всю систему поставил в один раздел. (Только СУБД Postgres разнес по разным дискам. Об этом далее)
2. Установка postgres.
2.1 Ставим следующие пакеты: aptitude –R libicu38 libxslt1.1 libxml2 libreadline5
2.2 Скачать СУБД postgres с официального сайта и использовать для работы 1С не выйдет. Нужна специальная, пропатченная система. Сборка от 1С у меня не пошла. Выходили ошибки, над которыми я не стал заморачиваться, а обратил свое внимание на сборки от Etersoft. Пробовал разные сборки. Ставились нормально, а при добавлении базы 1С или в процессе работы в 1С появлялись ошибки. Перебором версий остановился на версии 8.2.11 от Etersoft. Работают несколько разных баз разных конфигураций уже пол-года. Все стабильно. Скачиваем отсюда: ftp://ftp.etersoft.ru/pub/Etersoft/Postgre@Etersoft/8.2.11/Debian/4.0 и устанавливаем.
2.3 Ставим Обязательно патчи из каталога /extra (скачанные по ftp по ссылке выше)
2.4 Etersoft указывает, что для работы Postgres нужно установить параметр SHMMAX(shared memory) ядра Linux равным 128 Мб. Даем команду:
echo “kernel.shmmax = 134217728” >> /etc/sysctl.conf
2.5 Меняем права на каталог СУБД:
chown –R postgres:postgres /var/lib/pgsql
и перезагружаем сервер
2.6 Меняем пароль пользователю postgres:
passwd postgres
Теперь меняем пользователя:
su –l postgres
Входим в интерактивную терминальную программу PostgreSQL (psql), позволяющую нам управлять СУБД командами SQL:
psql
Меняем пароль внутреннему пользователю СУБД:
alter user postgres with password “PASSWORD”;
Выходим из psql:
\q
3. Настройка postgres.
3.1 Для настройки системы нам понадобятся 2 файла.
/var/lib/pgsql/data/postgresql.conf – отвечает за все основный настройки postgres
/var/lib/pgsql/data/pg_hba.conf - файл настроек доступа к СУБД
3.2 Мой файл /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 будет помнить значение его последней настройки»
3.3 /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 ставим свою сеть и ее разрядность.
3.4 Отредактировали конфиги – перегружаем СУБД:
#/etc/init.d/postgresql restart
4. Подключаем базу 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.
5. Хранение базы данных.
5.1 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
5.2 Для повышения быстродействия СУБД я разместил систему 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
6. Резервное копирование средствами СУБД. Базы 1С архивируются утилитой в составе postgres – pg_dump. Копирование происходит «на-лету» каждый час с 9.00 до 20.00. Пользователи, естественно, спокойно работают. В процессе дампа базы тормозов вообще не ощущается (40 пользователей в торговый сезон). Хотя, если смотреть использование ресурсов утилитой top, то видно, что используется больше 100%! Прочитал на postgres.ru что это нормально и объясняется это особенностью внутренней архитектуры postgres-а. В вопросах резервного копирования каждый админ должен быть чуть-чуть параноиком поэтому архив складывается непосредственно на сервер и на отдельный локальный ftp-сервер.
6.1 pg_dump. Чтобы утилита работала через скрипт без запроса пароля, нужно в каталоге пользователя от имени которого он запускаются положить файл .pgpass: *:*:*:postgres:password
и изменить права на файл (для обеспечения уровня безопасности, требуемого postgres-ом нужно чтобы файл был только на выполнение):
#: chmod 0600 ~/.pgpass
6.2 Для соединения с 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
6.3 Настраиваем расписание запуска скрипта. В файле /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
http://www.opennet.ru/base/sys/1c_debian.txt.html
http://postgresmen.ru/articles/view/38