OTRS: переезд на новый сервер
В наличии архивный сервер OTRS на который раз в несколько месяцев сливаются старые тикиты с промышленного сервера. На этом сервере не хватает места под хранение файлов на жестком диске. При этом сервер относительно современный (IBM eServer BladeCenter HS21) и его можно использовать под более нагруженные задачи, чем архивная копия OTRS. А OTRS в свою очередь можно перенести на менее мощный сервер у которого более объемные жесткие диски.
Используемая версия OTRS — 2.4.9.
Задача: перенести OTRS на новый сервер.
Устанавливаем ОС
В качестве ОС выступает centos 6.2.
Тип установки — минимальный (нам лишний хлам не нужен).
Настройка ОС
Отключаем SELinux
cat / selinux / enforce echo 0 > / selinux / enforce |
В файле /etc/sysconfig/selinux прописываем параметр
SELINUX=disabled |
Настройка дополнительных репозиториев
yum repolist Loaded plugins: fastestmirror, presto, priorities Loading mirror speeds from cached hostfile * base: ftp.tlk-l.net * epel: mirror.yandex.ru * extras: ftp.tlk-l.net * rpmforge: ftp-stud.fht-esslingen.de * updates: ftp.tlk-l.net 1346 packages excluded due to repository priority protections repo id repo name status base CentOS-6 - Base 4,764 epel Extra Packages for Enterprise Linux 6 - i386 4,790+969 extras CentOS-6 - Extras 4 rpmforge RHEL 6 - RPMforge.net - dag 4,287+2 updates CentOS-6 - Updates 1+375 repolist: 13,846 |
Устанавливаем пакет приоритетов:
yum install yum-plugin-priorities-1.1.30- 10 .el6.noarch |
Выставляем приоритеты, например:
[base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 priority=1 |
Вот какие приоритеты стоят у меня:
[base] — 1
[extras] — 10
[centosplus] — 20
[epel] — 40
[rpmforge] — 30
[utterramblings] — 50
Создаем LVM тома и разделы
Создаем LVM тома
Раздел c вложениями тикитов (вложения на изначальном сервере весят 86 Гб):
lvcreate -narticle -L130G vg00 |
Раздел opt (весит 2,5 Гб):
lvcreate -nopt -L5G vg00 |
Раздел с БД (объем БД 25 Гб):
lvcreate -nmysql -L50G vg00 |
Создаем необходимые разделы
mke2fs -L mysql -t ext4 -O dir_index -m 2 -J size = 400 -b 4096 -E stride = 16 / dev / mapper / vg00-mysql |
Опции:
-L — метка тома
-t – тип файловой системы
-O – дополнительный опции
dir_index — ускоряет поиск в больших каталогах
-m – процент зарезервированного места под суперпользователя. Позволяет избежать фрагментиции. По умолчанию 5%.
-J – создать большой журнал
-b – размер блока в байтах. По умолчанию 4К.
-E stride=16 – параметр зависит от размера блока в файловой системе и chunk size RAID контроллера. Пример — 4k blocks, 128k RAID stripes would set stride=32.
mke2fs -L opt -t ext4 -O dir_index -m 2 -J size = 400 -b 4096 -E stride = 16 / dev / mapper / vg00-opt |
mke2fs -L article -t ext4 -i 8192 -O dir_index -m 2 -J size = 400 -b 2048 -E stride = 32 / dev / mapper / vg00-article |
Опции:
-i — bytes/inode ratio – количество байт на айнод. Чем больше, тем меньше айнодов будет создано. Не должно быть меньше чем блок файловой системы. К выбору данного параметра необходимо подойти взвешенно, так как изменить количество айнодов после создания файловой системы уже не получится. Я так много создаю айнодов так как у меня очень много мелких файлов. Очень много — это действительно много:
df -h | egrep 'art|File' Filesystem Size Used Avail Use % Mounted on / dev / mapper / vg00-article 126G 60G 65G 48 % / opt / otrs / var / article |
cd / opt / otrs / var / article && ls -R -a -F 20 * | egrep -v '/|^$' | wc -l 4807232 |
То есть у меня на разделе где размещены файлы прикрепленные к тикитам количество этих файлов почти 5 млн., общий объем которых 60 Гб.
Опции:
-b 2048 — тут поставили значение в два раза меньше стандартного, так как подавляющее большинство файлов меньше 2Кб. При уменьшении блока немного падает производительность файловой системы, но при этом можно разместить больше файлов на разделе в случае если их размер менее 2Кб.
-E stride=32 — соответственно изменился и этот параметр, так как изменился параметр выше.
tmp раздел
Необходимо создать большой tmp раздел. В моем случае оказалось достаточно 20 Гб. Если этого не сделать, то большой дамп БД будет заливаться очень долго. Это связано с процессом восстановления таблиц при создании и сортировке индексов. Если места не хватает, то используется медленный тип сортировки. Если хватает, то нормальный. В первом случае можем наблюдать запрос в состоянии «Repair with keycache». При втором у запроса будет состояние «Repair by sorting». Второй в десятки раз быстрее.
Соответственно создаем LVM том и разлел:
lvcreate -ntmp -L20G vg00 && mke2fs -L tmp -t ext2 / dev / mapper / vg00-tmp |
Монтируем и выставляем права:
mount / dev / mapper / vg00-tmp / tmp && chmod 1777 / tmp |
Помимо большого временного раздела в конфиге my.cnf необходимо указать соответствующие опции:
myisam_max_sort_file_size = 20G myisam_max_extra_sort_file_size = 20G |
Опции myisam_max_sort_file_size и myisam_max_extra_sort_file_size должны быть больше размера максимального размера индекса.
Дополнительные пакеты
Некоторые из пакетов ниже следует установить на свое усмотрение. Это те пакеты которые могут пригодиться в случае минимальной установки CentOS.
crontabs screen mc htop iotop nload ncdu apachetop exim pwgen pv mytop lsof traceroute e4fsprogs bind-utils smartmontools procinfo (в репах не оказалось) yum-utils (package-cleanup) dmidecode sysstat (iostat) |
Apache
Устанавливаем:
yum install
httpd
|
Ставим в автозапуск при загрузке системы:
chkconfig httpd on |
Запускам:
service httpd start |
MySQL
Устанавливаем mysql:
yum install
mysql-server mysql
|
Копируем файл под большие нагрузки
cp / usr / share / doc / mysql-server-5.1.52 / my-huge.cnf / etc / my.cnf |
Выставляем количество тредов в зависимости от количества ядер
# Try number of CPU's*2 for thread_concurrency thread_concurrency = 4 |
Запускаем:
service mysqld start |
Запускаем скрипт начальной настройки:
/ usr / bin / mysql_secure_installation |
Прописываем в конфиг my.cfg:
log = / var / log / mysql.log # включаем журналирование skip-networking bind-address=127.0.0.1 # разрешаем слушать только localhost |
Запускаем mysql
/ etc.init.d / mysqld start |
Добавляем в автозапуск
chkconfig mysqld on |
Переносим БД mysql на раздел LVM
Останавливаем mysql
/ etc.init.d / mysqld stop |
Перемещаем файлы расположенные /var/lib/mysql куда-нибудь.
Монтируем раздел LVM:
mount -o rw,noexec,nosuid,noatime / dev / mapper / vg00-mysql / var / lib / mysql |
Перемещаем файлы обратно в каталог /var/lib/mysql.
Запускаем mysql
/ etc.init.d / mysqld start |
OTRS
Скачиваем OTRS в rpm пакете
http://ftp.otrs.org/pub/otrs/RPMS/fedora/4/ |
Устанавливаем
rpm
-ihv
otrs-2.4.9-01.noarch.rpm
|
С большой долей вероятности с первого раза OTRS установить не получиться так как будут некоторые зависимости которые предварительно необходимо решить. Это не составляет труда так как все зависимости есть в подключенных репозиториях.
Вообще сама установка OTRS хорошо описана
Проверяем установлены ли все необходимые модули:
/ opt / otrs / bin / otrs.checkModules |
Доустанавливаем перловые модули:
yum install perl-CGI yum install perl-TimeDate |
В итоге получаем следующуюю картину:
/ opt / otrs / bin / otrs.checkModules o CGI............................ok ( v3.51 ) o Date::Pcalc....................ok ( v1.2 ) o Date::Format...................ok ( v2.22 ) o DBI............................ok ( v1.609 ) o DBD::mysql.....................ok ( v4.013 ) o Digest::MD5....................ok ( v2.39 ) o Crypt::PasswdMD5...............ok ( v1.3 ) o LWP::UserAgent.................ok ( v5.833 ) o Encode::HanExtra...............Not installed ! ( Optional - Required to handle mails with several Chinese character sets. ) o IO::Scalar.....................ok ( v2.110 ) o IO::Wrap.......................ok ( v2.110 ) o MIME::Base64...................ok ( v3.08 ) o Mail::Internet.................ok ( v2.04 ) o MIME::Tools....................ok ( v5.427 ) o Net::DNS.......................ok ( v0.65 ) o Net::POP3......................ok ( v2.29 ) o Mail::POP3Client...............ok ( v2.18 ) o IO::Socket::SSL.............ok ( v1.31 ) o Net::IMAP::Simple..............ok ( v1.17 ) o Net::IMAP::Simple::SSL......ok ( v1.3 ) o Net::SMTP......................ok ( v2.31 ) o Authen::SASL................ok ( v2.12 ) o Net::SMTP::SSL..............ok ( v1.01 ) o Net::LDAP......................Not installed ! ( Optional - Required for directory authentication. ) o GD.............................Not installed ! ( Optional - for stats ) o GD::Text....................Not installed ! ( Optional - Required for stats. ) o GD::Graph...................Not installed ! ( Optional - Required for stats. ) o GD::Graph::lines............Not installed ! ( Optional - Required for stats. ) o GD::Text::Align.............Not installed ! ( Optional - Required for stats. ) o PDF::API2......................Not installed ! ( Optional - Required for PDF output. ) o Compress::Zlib..............ok ( v2.02 ) o SOAP::Lite.....................Not installed ! ( Optional - Required for the SOAP interface. ) o XML::Parser....................ok ( v2.36 ) |
Далее заходим по ссылке:
http://server_ip/otrs/installer.pl |
… и устанавливаем OTRS через web-интерферс.
После установки можем зайти под рутом:
http://server_ip/otrs/index.pl |
Данные для аутентификации
root
@
localhost
root
|
iptables
Добавляем правило для апача
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT |
Перезапускаем iptables
/ etc / init.d / iptables restart |
Проверяем корректность установки OTRS
Запускаем в OTRS следующую оснастку:
Admin - > [ Support Assessment ] |
Проверяем чтобы напротив всех перечисленных пунктов значение поля State было “ОК”.
Траблшутинг
Например мы получили значение параметра “Check if the configured FQDN is valid” “Failed”.
Для устранения данной ошибки достаточно в файле /opt/otrs/Kernel/Config.pm указать доменное имя.
Перенос вложений тикитов
Вложения у меня занимают очень много места:
df -h | grep arti 10.10.11.11: / otrs_data / article 99G 85G 14G 87 % / opt / otrs / var / article |
По своей сути это мелкие файлы от несколькиз килобайт, до нескольких мегабайт.
Поэтому переливаем вложения следующим способом:
# Удаленно копируем с удобным индикатором выполнения: dir = "2007" && tar cf - $dir | pv -s $ ( du -sb $dir | awk '{print $1}' ) | ssh root @ 10.10.10.10 tar xf - -C / opt / otrs / var / article |
Изначальный размер от того какой мы получим на новом сервере может отличаться. Поэтому проверяем все ли файлы скопировались запуская на старом и новом сервере такую команду:
ls -R -a -F $dir | egrep -v '/|^$' | wc -l |
Перенос БД
Сохраняем дамп БД со старого сервера сразу на новый:
mysqldump -uroot --opt otrs | gzip | ssh root @ 10.10.10.10 "cat > /var/lib/mysql/dump/otrs.sql.gz" |
Заливаем дамп
zcat otrs.sql.gz | mysql otrs -uotrs -p |
Конфигурационные файлы
fstab
# Created by anaconda on Fri Jan 13 15:06:04 2012 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID =5e8d2f80-1a39-4b86-a42c-21391afd6a2a / ext4 defaults 1 1 UUID =a06ea5ae-d52a-49f3-8a73-babdf88552dc / boot ext2 defaults 1 2 UUID =103fa6fb-0519-46eb-8bd9-3f1a9810a4fd swap swap defaults 0 0 # /tmp UUID =171744e0-2cdc-47e8-90fd-86efbe25c8d6 / tmp ext2 auto,noexec,rw,async,nouser,nosuid,noatime 0 0 # /srv/repo UUID =9e7fbca5-eb71-485e-87cf-159e590ec9ce / srv / repo ext2 auto,noexec,ro,async,nouser,nosuid,noatime 0 0 # /var/lib/mysql UUID =ba72179b-49b9-4be3-9e5d-4be1b994b455 / var / lib / mysql ext4 auto,noexec,rw,async,nouser,nosuid,noatime 0 0 # /opt UUID =c5c6fb42-0249-42b0-9cc2-a52505036dbb / opt ext4 auto,rw,async,nouser,nosuid,noatime 0 0 # /opt/otrs/var/article UUID =cfb0b907-72c9- 4120 -bb38-080cbd3253e7 / opt / otrs / var / article ext4 auto,noexec,rw,async,nouser,nosuid,noatime 0 0 tmpfs / dev / shm tmpfs defaults 0 0 devpts / dev / pts devpts gid = 5 , mode = 620 0 0 sysfs / sys sysfs defaults 0 0 proc / proc proc defaults 0 0 |
iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. * filter :INPUT ACCEPT [ 0 : 0 ] :FORWARD ACCEPT [ 0 : 0 ] :OUTPUT ACCEPT [ 0 : 0 ] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT # Апач -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # Лочим исходящие соединения на 110 порт, чтобы OTRS на этом сервере не забирал почту с почтового сервера pop3.example.com -A OUTPUT -m tcp -p tcp --dport 110 -j DROP # Лочим 25 порт на отправку, чтобы OTRS никому ничего не мог отправить (у нас не промышленый, а архивный сервер) -A OUTPUT -m tcp -p tcp --dport 25 -j DROP # Тут веб морда RAID контроллера -A INPUT -p tcp -m tcp --dport 81 -j ACCEPT -A INPUT -p tcp -m tcp --dport 82 -j ACCEPT -A INPUT -p tcp -m tcp --dport 83 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT |
my.cnf
mysql-server-5.1.52
[ client ] port = 3306 socket = / var / lib / mysql / mysql.sock [ mysqld ] port = 3306 socket = / var / lib / mysql / mysql.sock skip-locking key_buffer_size = 384M max_allowed_packet = 16M table_open_cache = 512 sort_buffer_size = 2M read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 48M thread_concurrency = 4 myisam_max_sort_file_size = 20G myisam_max_extra_sort_file_size = 20G [ mysqldump ] quick max_allowed_packet = 16M [ mysql ] no-auto-rehash [ myisamchk ] key_buffer_size = 256M sort_buffer_size = 256M read_buffer = 2M write_buffer = 2M [ mysqlhotcopy ] interactive-timeout |
Для сравнения my.cnf с промышленного сервера (mysql-server-5.0.77)
[mysqld] init_connect='SET collation_connection = utf8_general_ci' init_connect='SET NAMES utf8' default-character-set = utf8 character-set-server = utf8 collation-server = utf8_general_ci datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock skip-locking skip-innodb skip-bdb query_cache_size = 50M query_cache_type=1 query_cache_limit=1M query_cache_min_res_unit='3000' max_connections = 500 interactive_timeout=100 wait_timeout=15 connect_timeout=10 table_cache=512 tmp_table_size=256M max_heap_table_size=64M thread_cache=300 key_buffer=1024M thread_concurrency=12 log_slow_queries=/var/log/mysqld.slow.log long_query_time=2 user=mysql old_passwords=1 max_allowed_packet = 16M join_buffer_size=128K [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [mysqldump] quick max_allowed_packet = 256M [client] default-character-set = utf8 [mysql.server] user=mysql basedir=/var/lib [safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid open_files_limit=8192 [isamchk] key_buffer=512M sort_buffer=64M read_buffer=16M write_buffer=16M [myisamchk] key_buffer=512M sort_buffer=64M read_buffer=16M write_buffer=16M |
Ссылки