среда, 14 декабря 2011 г.

Репликация PostgreSQL с помощью repmrg

Как известно, начиная с версии 9.0 в PostgreSQL появилась поддержка streaming replication. В отличии от традиционной репликации на тригерах она дает значительно меньший оверхед на мастер и поэтому может быть использована не только для резервирования, но и для масштабирования.

четверг, 1 декабря 2011 г.

Адаптивный delay в exim

Одним из простых, но в то же время эффективных способов отсеивания спама является задержка приветствия при подключении клиента. Легитимный MTA в отличии от спам бота дождется получения приветсвия, спам боты же, как правило, либо шлют команды сразу вне зависимости от получения приветствия, либо не получив его в течение малого промежутка времени отключаются. Для них важна скорость.
На этом и основан метод. Теперь реализация

четверг, 17 ноября 2011 г.

Тюнинг zfs для использования на SATA дисках

Файловая система ZFS изначально разрабатывалась для серверного применения на мащинах с быстрыми SCSI(SAS) дисками на дорогих и высокопроизводительных RAID-контроллерах. Однако с минимальными усилиями ее можно приспособить и для десктопа c бюджетными SATA дисками.

воскресенье, 13 ноября 2011 г.

Использование nullfs во FreeBSD

nullfs это псевдо-файловая система, позволяющая смонтировать произвольную директорию в любом другом месте файловой системы. Наиболее часто применяется для монтирования дерева портов внутри jail или chroot, чтобы не копировать его целиком и не обновлять вручную.
Пример использования:
# mount_nullfs /usr/ports /home/jail1/usr/ports
Здесь предпологается, что корень jail это директория /home/jail1
Тоже самое в fstab:
/home/jail1/usr/ports /usr/ports nullfs rw 0 0
Конечно можно достичь того же результата с помощью символических сслыкок, однако при большом количестве джайлов использование nullfs удобнее.
Для работы nullfs ядро должно быть собрано с опцией PSEUDOFS (по умолчанию в GENERIC), кроме того, должен быть загружен модуль ядра:
# echo 'nullfs_load="YES"' >> /boot/loader.conf

вторник, 18 октября 2011 г.

FreeBSD syslog utf-8 и кириллица

Syslog во FreeBSD имеет одну очень неприятную особенность - портить строки в unicode. Например:
logger йцукенгшщ
Будет записаено в лог, как йM-^FM-^CкенгM-^HM-
Поэтому в случае, если планируется запись кириллицы через syslog, запускать его надо с флагом -8, т.е.
echo 'syslogd_flags="-s -8"' >> /etc/rc.conf
После чего перезапустить syslogd:
/etc/rc,.d/syslogd restart
Кириллица будет записываться штатно.

пятница, 14 октября 2011 г.

FreeBSD и обновление часовых поясов

Как известно, в России и ряде других стран в этом году был  отменен переход на зимнее время. Это означает, что в последнее воскресенье октября часы не будут переводится. К сожалению обновленные данные часовых поясов есть лишь в stable/8, stable/9 и head.
Для обновления есть два пути: взять новую версию из svn, либо установить порт /usr/ports/misc/zoneinfo, который перепишет определения в директории /usr/share/zoneinfo.
Следует иметь ввиду, что до тех пор, пока в /usr/src содержатся устаревшие данные, следует при пересборке мира указывать MK_ZONEINFO="no", в противном случае файлы, установленные из порта будут заменены содержащимися в дереве исходных кодов, т.е. устревшими.
После установки порта выполнить:
# tzsetup

среда, 12 октября 2011 г.

Экспорт данных NetFlow с помощью ipcad

Netflow является де факто стандартном для сбора и передачи данных о трафике, изначально протокол был разработан в Cisco для использования в маршрутизаторах и коммутаторах, позднее появились софтовые реализации, такие, как ipcad.

среда, 5 октября 2011 г.

exim и фильтрация писем по вложениям

Появилась задача заблокировать опеределенные типы вложений по расширениям. С помощью exim она решается достаточно просто.
Добавляем в конфиг:
acl_smtp_mime          = acl_check_mime
acl_check_mime:
        deny
                message         = We do not accept attachments like: $mime_filename
                condition       = ${if match{$mime_filename}{\N\.(doc|xls)$\N}}
        accept
Здесь мы сначала определяем acl для mime вложений, а затем запрещаем отдельные типы по регулярке.
Частично того же эффекта можно добиться с помощью инструкции demime:
acl_check_data:
        deny
                message         = Attachment: $found_extension
                demime          = doc:xls
        accept
Источник 

среда, 21 сентября 2011 г.

Сборка пакетов с помощью tinderbox

Tinderbox - набор скриптов для сборки пакетов во FreeBSD. Обычно его используют майинейнеры портов для тестирования перед обновлением, кроме того tinderbox можно применять для централизованной сборки пакетов для нескольких однотипных машин.

среда, 31 августа 2011 г.

Получение списка файлов, не закрепленных ни за одним из установленных пакетов FreeBSD

При установке любого приложения из портов сохраняется список содержащихся в нем файлов (plist), делается это для того, чтобы пакет впоследствии можно было удалить. Но целому по ряду причин этот механизм не совершенен, поэтому при удалении или обновлении портов остаются не удаленные файлы. На самом деле никакой опасности они не представляют, но возникает вопрос, как их найти.

воскресенье, 14 августа 2011 г.

Изменение интервала обработки данных Munin

В случае большого количества хостов мунин может не успевать обработать все данные до следующего запуска и процессы будут накладываться друг на друга. Об этом говорят письма с таким текстом:

[FATAL ERROR] Lock already exists: /var/run/munin/munin-update.lock. Dying.
 at /usr/local/lib/perl5/site_perl/5.10.1/Munin/Master/Update.pm line 128

пятница, 5 августа 2011 г.

Манипуляции с unix timestamp

Традиционно время в юниксах измеряется в секундах от полуночи 1 января 1970 года.
Чтобы получить значение временной метки для определенной даты, проще всего использовать функцию mktime perl:
#/usr/bin/perl
USE POSIX;
my ( $sec, $min, $hour, $mday, $mon, $year ) = ( 1, 0, 0, 1, 10, 107 );
my $timestamp = mktime( $sec, $min, $hour, $mday, $mon, $year );
print $timestamp

А если нужно наоборот из временной метки получить дату в читаемом виде, достаточно воспользоваться стандартной утилитой date:
date -r 10000
четверг,  1 января 1970 г. 05:46:40 (MSK)

пятница, 15 июля 2011 г.

Мониторинг сервера PostgreSQL с помощью munin

Munin является системой мониторинга, написанную на перле и основенную на rrdtool и состоит из двух частей: на сервере нужно установить порт sysutils/munin-master, а на клиенте - sysutils/munin-node.

понедельник, 11 июля 2011 г.

Использование pgbouncer для пуллинга соединений к PostgreSQL

Как известно архитектура PostgreSQL такова, что на каждое подключение сервером порождается дочерний процесс. Поскольку это довольно ресурсозатратная процедура в целом ряде задач (чаще всего в веб-приложениях) на создание дочерних процессов тратится значительное количество времени. Использование постоянных соединений со стороны клиента лишь частично решает эту проблему, одновременно порождая новую - опасность исчерпания лимита соедиенений.

воскресенье, 26 июня 2011 г.

Ускорение репликации MySQL

Репликация MySQL не является многопоточной, поэтому при интенсивном изменении данных на мастере, слейв может не успевать выполнять запросы из бинарного лога.

вторник, 14 июня 2011 г.

freebsd installworld и ошибка btxld:No such file or directory

Иногда при installworld возникает такая ошибка
btxld -v -E 0x2000 -f bin -b /usr/obj/usr/src/sys/boot/i386/boot2/
../btx/btx/btx -l boot2.ldr  -o boot2.ld -P 1 boot2.bin
btxld:No such file or directory

понедельник, 13 июня 2011 г.

ZFS миграция single в mirror

Иногда возникает необходимость сделать первоначальную установку только на один из дисков, а уже потом создать зеркало.

среда, 8 июня 2011 г.

Управление кэшем bind с помошью rndc

Кэширование DNS является основным способом снижения нагрузки и трафика на авторитетные серверы зон с одной стороны и ускорения разрешения имен со стороны клиентов.
Сам кэш находится в оперативной памяти, поэтому его содержимое не сохраняется между перезагрузками, также есть команда rdnc flush, которая полностью очищает кэш. Возможно также выброчная его очистка с помощью команды rndc flushname, например rndc flushname ya.ru удалит все записи для ya.ru из кэша.
Другой полезной командой является rndc dumpdb -cache, которая сохраняет в текстовый файл /var/named/var/dump/named_dump.db содержимое кэша.

воскресенье, 5 июня 2011 г.

Static ARP во FreeBSD

Раньше для этого приходилось писать свои скрипты, но начиная с версии 8.2 в базовой системе есть скрипт /etc/rc.d/static_arp

среда, 1 июня 2011 г.

Решение проблемы клавиш со стрелками в ssh клиенте для Android

На днях стал счастливым обладателем HTC Desire Z, установил на него ConnetcBot из маркета и казалось бы вот оно счатье, но не тут-то было. На клавиатуре как на хардварной, так и на экранной нет клавиш со стрелками, а работать без них врядли возможно.

воскресенье, 29 мая 2011 г.

Сборка FreeBSD-9 с помощью Clang

Clang является фронэндом к LVM и призван заменить gcc в базовой системе. Сейчас же по умолчанию сборка как системы, так и портов ведется с помощью далеко не самой свежей версии gcc.

пятница, 27 мая 2011 г.

Обновление perl с 5.10 до 5.12 во FreeBSD

Не так давно версией перла по умолчанию в портах стала 5.12. Процесс обновления уже установленного порта подробно описан в файле UPDATING, тем не менее выкладываю пошаговую инструкцию:
  1. Первым делом нужно обновить дерево портов до актуальной версии (portsnap, cvsup, csup)
  2. Проверим pkgdb: pkgdb -Ff
  3. Установим новую версию: env DISABLE_CONFLICTS=1 portupgrade -o lang/perl5.12 -f perl-5.10.\*
  4. Пересоберем все порты, зависящие от перла (долго): portupgrade -fr perl

вторник, 24 мая 2011 г.

Использование mysqlbackup для автоматического бекапа баз mysql

Скрипт mysqlbackup позволяет легко автоматизировать резервное копирование баз mysql.  Сам скрипт написан на sh и не имеет никаких зависимостей. Во FreeBSD скрипт устанавливается из портов:

понедельник, 23 мая 2011 г.

vim конвертация dos в unix

Всем когда-то приходится сталкиваться с файлами, созданными в dos/win. Напомню, что файлы созданные в win имеют в конце каждой строки символ возврата каретки (символ ^M).
Есть два способа их удаления в редакторе vim:
:set ff=unix а затем :w файл будет сохранен без символов возврата каретки
либо можно воспользоваться комадой замены :%s/^V^M//. Здесь нажатие Ctrl+V необходимо для ввода символа ^M

четверг, 19 мая 2011 г.

MySQL удаление старых binlogs

В некоторой литературе встречается мненение, что бинарных логи можно удалять просто вызывая команду rm, однако это верно лишь для старых версий MySQL. Начиная с 5.0 этого делать нельзя. Для удаления устаревших логов нужно использовать либо команду PURGE BINARY LOGS, либо установить переменную expire_logs_days в my.cnf.

Использование APC для ускорения выполнения PHP скриптов

APC (Alternative PHP Cache) как и другие подобные продукты работает за счет кэширования скомпилированного байт-кода. Без акселератора процесс выполнения скрипта состоит из четырех этапов:
  • открытие файла
  • компиляция в байт код
  • выполнение байт-кода
  • отдача результата выполнения
Один из самых ресурсозатратных - это компиляция.

вторник, 17 мая 2011 г.

Безопасный способ изменения правил ipfw

Изменение правил фаервола на удаленной машине всегда рискованная операция, поскольку есть риск закрыть себе доступ. Во FreeBSD есть скрипт change_rules.sh, который частично решает данную пробему.

понедельник, 16 мая 2011 г.

Мониторинг состояния MySQL и InnoDB с помощью innotop

Незаменимый инструмент для мониторинга в реальном времения состояния MySQL - аналог утилиты top.
В режиме по умочанию показывает:
  • количество соединений (всего, активных и кэшированных потоков)
  • количество запросов в секунду
  • аптайм и версию сервера
  • количество slow query
  • распределение запросов по типам (select, insert, update, delete)
  • процент попадания в кэш запросов
  • трафик сервера
  • список выполняющихся запросов в формате похожем на show processlist;
Утилита представляет собой perl-скрипт. Лицензия на код GPL2 скачать можно отсюда

суббота, 14 мая 2011 г.

Skype во FreeBSD

Сегодня обновился порт skype для freebsd с полной поддержкой видео и аудио.
Правда сначала придется обновить систему до ревизии r221388 или старше. Звук лично у меня зарботал только через oss, видео не тестировал.

Уменьшение количества соединений в состоянии TIME_WAIT

Как я уже рассказывал в одной из предыдущих заметок, соединение может еще долгое время находится в состоянии TIME_WAIT, согласно RFC 1323 это время должно равнятся 2 минутам, двум msl (Maximum Segment Lifetime). MSL - это время, в течение которого сегмент может путешествовать по сети (RFC рекомендует 60 секунд). На загруженном сервере при таком значении msl число соединений time_wait расчет очень быстро, к тому же упомянутый rfc составлялся достаточно давно и пропускная способность каналов с тех пор возрасла многократно, поэтому многие уменьшают это значение.

пятница, 13 мая 2011 г.

Мониторинг процессов через snmpd

В пакете net-snmp предусмотрена возможность мониторинга запущенных процессов, для этого предназначена директива proc. На своих серверах я обычно включаю  в snmpd.conf сделедующие директивы:
proc ntpd
proc syslogd
proc sshd
proc cron
Остальное по вкусу, можно также указать максимальное/минимальное число процессов.

среда, 11 мая 2011 г.

nginx http_gzip_module

Согласно официальной документации модуль позволяет уменьшить объем передаваемых данных в два раза.

вторник, 10 мая 2011 г.

Получение исходных кодов FreeBSD с помощью cvsup

Несмотря на то, что все коммиты вносятся в репозиторий subversion, зеркала csvup по прежнему обновляются и их можно использовать для получения актуальной версии исходных кодов.

Репликация Redis

Мастер-Слейв репликация Redis позволяет иметь слейвам точную копию данных мастера.
Ключевые особенности репликации Redis:
  • Мастер может иметь несколько слейвов
  • Слейвы могут играть роль мастеров для другий серверов, создавая таким образом древовидную структуру
  • Репликация не приводит к блокировке на стороне мастера. Это означает, что мастер продолжает обрабатывать запросы во время первичной синхронизации данных слейвом.
  • Репликация может использоваться как для машстабирования чтения, так и для повышения доступности 

MySQL отличия Row-based и Statement-based репликации

Начиная с mysql 5.1 поддерживаются два вида репликации: Row-based и Statement-based, каждый имеет как достоинства, так и недостатки.

воскресенье, 8 мая 2011 г.

Мониторинг состояния nginx с помощью nagios

Для мониторинга количества запросов и подключений в секунду можно использовать плагин check_nginx, который представляет из себя простой sh скрипт

пятница, 6 мая 2011 г.

FreeBSD ZFS замена сбойного диска

Диски являются одной из самых частных причин сбоев на серверах, поэтому нужно быть готовым заменить диск в случае его сбоя

Правильная настройка sshd на сервере

На я серверах меняю ряд параметров в /etc/ssh/sshd_config, дефолтные значения которых считаю не оптимальными.

четверг, 5 мая 2011 г.

среда, 4 мая 2011 г.

Основы работы с subversion

Subversion - это одна из самых популярных систем контроля версий. В этой заметке я расскажу о самый основных приемах работы с ней

вторник, 3 мая 2011 г.

htop(1) - расширенная версия top(1)

htop - расширенная версия просмотрщика процессов, который показывает процессы в виде дерева.

Мой rc скрипт для запуска VirtualBox во FreeBSD

Текущий порт virtualbox идет без какого-либо rc скрипта, поэтому его приходится делать самим.

FreeBSD кастомный /etc/src.conf

Этот конфирурационный файл опеределяет параметры сборки основной системы, точнее - что собирать, а что нет.
Вот мой типовой конфиг:

WITHOUT_PROFILE=    yes # не собирать версии библиотек для профайлинга
WITHOUT_ATM=    yes         # не собирать ATM и все с ним связанное
WITHOUT_I4B=    yes           # не собирать ISDN - удалено в 9.0
WITHOUT_IPX= yes              # не собирать IPX
WITHOUT_CDDL=yes           # не собирать компоненты, импортированные из opensolaris - zfs, dtace
WITHOUT_FLOPPY="YES"   # не собирать поддержку floppy дисков
WITHOUT_INET6="YES"      # без поддержки ipv6
WITHOUT_NCP="YES"          # без поддержки NetWare
WITHOUT_NDIS="YES"        # без поддержки NDIS


другие параметры перечислены в man src.conf

postmaster@ abuse@ должны быть

Раз уж речь пошла об RFC, будет нелишним напомнить, что адреса abuse@ postmaster@ обязательно должны существовать, даже если в whois указаны другие контактные адреса.

понедельник, 2 мая 2011 г.

SMTP ограничение количества получателей

Многие администраторы устанавливают лимит количества получателей письма, кто-то ставит 25, кто-то даже 10. Так вот все это неправильно, поскольку согласно rfc-2821 сервер за  один раз должен принять не меньше 100 получателей. Почтовые серверы, не выполняющие это требование (чаще всего по незнанию rfc администраторами) грубо нарушают данный стандарт.

Terminator - удобный эмулятор терминала

Терминатор написан на питоне с использованием py-vte. От традиционных многовладочных терминалов его отличает возможность в одном онке открывать несколько сессий, при этом экран делиться либо вертикально, либо горизонтально. Вдобавок можно на лету менять кодировку, это очень удобно, если на локальной машине юникод, а на удаленной utf-8. Кроме того, есть функция объединения терминалов в группу. Т.е. команда вводиться один раз, а выполняется на всех серверах.
В общем мас-хев http://www.tenshu.net/terminator/

Проверка авторизации SMTP

После настройки авторизации нужно проверить, действительно ли она работает. Загвоздка заключается в том, что пароль передается не простым текстом, а в закодированном виде.

Простая защита от ddos средставами фаервола

Рано или поздно всем приходится сталкиваться с таким неприятным моментом, как ddos. Скажу сразу, что зашититься на 100% от ддос нельзя, но предусмотреть некоторые превентивные меры не только можно, но и нужно. Самый простой - способ блокировать хосты, проявляющие слишком большую активность.

воскресенье, 1 мая 2011 г.

Снапшуты zfs и бекап баз

В одной и предыдущих заметок я рассказывал о резервном копировании баз postgresql, но тот метод основан на применении pgdump и не всегда подходит. У него есть минимум два недостатка:
  • Большая длительность операций, особенно для крупных баз. Это касается как сохранения, так и восстановления.
  • Снятие дампа - это достаточно дорогая с точки зрения ввода-вывода операция и может негативно отразиться на состоянии сервера, если снимать дамп с боевой машины.

Восстановление рутового пароля к mysql

Восстановить пароль достаточно просто при условии, что есть рутовые права на самом сервере.

Для начала нужно добавить строку skip-grant-tables в секцию [mysqld] конфига mysql. Данная опция позволяет подключаться без пароля любому пользователю.
Для вступления в силу изменений необходимо перезапустить сервер базы. Далее подключаемся рутом:
$ mysql -u root mysql
Если в конфиге все прописано верно, то пароль не будет запрошен. Получив доступ к консоли меняем пароль:
> UPDATE mysql.user SET Password=PASSWORD('new password') WHERE User='root';
После этого снова перезапускаем сервер, предварительно убрав опцию skip-grant-tables из конфига

TCP TIME_WAIT

Такое состояние характерно для завершающей стадии соединия.
Рассмотрим пример:
FIN 1 => 2
ACK 1 <=2
FIN  1 <= 2
ACK 1 => 2
В первой строке хост 1 инициирует завершение соединение отправкой пакета с флагом FIN. Хост 2, получив такой пакет подтверждает его флагом ACK, после чего в свою очередь отправляет хосту 1 свой пакет с флагом FIN и закрывает соединение. Вот с момента получения этого пакета хостом 1, соединение переходит в состояние TIME_WAIT. Это время дается на случай, если последний ACK не дойдет до хоста 2, тогда он снова отправит FIN, на который хост 1 еще раз отошлет ACK.

Использование subversion для получения исходных кодов FreeBSD

В 2008 году проект FreeBSD осуществил переход от устаревшего CVS к subversion. Все новые комитты с тех пор вносятся в subversion, а лишь затем попадают в CVS, а уже от туда распространяются по зеркалам cvsup. Там образом в subversion всегда более свежая редакция исходных кодов, да и checkout из subversion быстрее cvsup.

суббота, 30 апреля 2011 г.

BIND, CNAME and other data

Такая ошибка появлятся, если для ресурса определить дополнительно к записи типа CNAME любую другую. Например, следующая схема работать не будет:

ns1  IN  A  4.4.4.4
www  IN CNAME ns1
www IN TXT "some text"

Нужно либо убрать запись TXT, либо заменить CNAME на A:

www  IN  A 4.4.4.4
www IN TXT "some text"

Простой бекап баз PostgreSQL

Порт postgresql устанавливает скрипт /usr/local/etc/periodic/daily/502.pgsql, который предназначен для локального резервного копирования баз через pg_dump.
По умолчанию бекапы не делаются, для их включения нужно прописать

daily_pgsql_backup_enable="YES"

в /etc/periodic.conf
Есть и другие параметры, полный список в самом скрипте.
От себя добавлю, что хранить дампы исключительно на локальной машине не очень хорошая идея. Желательно, чтобы эти дампы дублировались где-то еще, например с помощью rsync.

пятница, 29 апреля 2011 г.

Бесплатный secondary DNS

Как известно, для поддержки домена согласно RFC требуется минимум 2 неймсервера. Также желательно, чтобы они находились в разных сетях и имели независимое электропиние (читай: находились в разных зданиях). А что делать, если сервер всего один

четверг, 28 апреля 2011 г.

exim frozen messages

При возникновении фатальных ошибок при доставке сообщения помещаются в отдельную очередь - замораживаются. Последующих попыток доставки замороженных сообщений не предпринимается. Поэтому после устранения причины их необходимо "разморозить".
Делается это командой:
exim -Mt <идентификатор сообщения>
Идентификатор можно узнать из вывода mailq 

Автозавершение сеанса по таймауту

Иногда открываешь сессию по ssh и оставляешь ее открытой, а ведь враг может этим воспользоваться, если имеет физический доступ в вашей машине. Чтобы этого не допустить можно установить таймаут неактивности, скажем 30 мин, по истечении которого сессия будет автоматически завершаться.

java плагин для firefox

Как известно, для FreeBSD нет родных java пакетов, а порт java/jdk16 мало того, что старый и дырявый, так еще и не работает с firefox старше 3.5, но можно установить openjdk:

среда, 27 апреля 2011 г.

/etc/fstab во FreeBSD

За редким исключением я стараюсь не использовать дефолтный fstab. Ниже привожу конфиг с одного из боевых серверов:

Использование шаблонов skel для новых пользователей (FreeBSD)

После создания нового аккаунта часто приходится выполнять одни и те же действия по настройке. На самом деле достаточно сделать один раз для каждого сервера, нужно лишь внести изменение в шаблон.

вторник, 26 апреля 2011 г.

ssh, авторизация по ключам

Несмотря на то, что тема достаточно хорошо разжевана, не все используют ключи для авторизации. Ключ состоит из двух частей: открытой и закрытой. Открытый ключ (public) должен быть размещен на удаленном сервере, закрытый - на локальной машине.

Прибить запрос к PostgreSQL, залочивший базу

Столкнулся с ситуацией блокировки таблицы в боевой базе, все клиенты естественно отвалились. Пришлось прибивать процесс.
Сначала его нужно найти, для этого выполняем запрос:
SELECT procpid, current_query FROM pg_stat_activity;
Ищем в результатах запрос-вредитель (в моем случае это был CREATE INDEX), смотрим в первой колонке его PID, а дальше прибиваем процесс с помощью команды kill.

Обязательный комментарий при комитте в subversion

Комментарии к комиттам делают чтение исходников более понятным, но не все программисты пишут эти самые комментарии. Есть простой способ сделать их обязательными, основан он на pre-commit hook.

Пишем свой плагин для Nagios

Разработка плагинов для Nagios - дело нехитрое. Прочитав официальный мануал http://nagiosplug.sourceforge.net/developer-guidelines.html я переписал вчерашний скрипт для проверки состояния репликации для использования из под Nagios.

воскресенье, 24 апреля 2011 г.

Простой скрипт для проверки состояния репликации mysql


#!/usr/local/bin/perl -w
# usage is ./mysql_replication.pl --user user --password password
use strict;
use DBI;
use Getopt::Long;
my $user   = "";
my $password = "";
GetOptions ("user=s" => \$user,
            "password=s"   => \$password );

my $dsn="DBI:mysql:";
my $dbh=DBI->connect($dsn, $user, $password) or die ($!);
my ($sql_running, $io_running);
my $sth=$dbh->prepare("SHOW SLAVE STATUS") or die($!);
my %status = ();
$sth->execute() or die ($!);
while (my $ref = $sth->fetchrow_hashref()) {
    for (keys %{$ref}) {
        $status{$_}=$ref->{$_} || "n/a" if /Slave_IO_Running/;
        $status{$_}=$ref->{$_} || "n/a" if /Slave_SQL_Running/;
        $status{$_}=$ref->{$_} || "n/a" if /Seconds_Behind_Master/;
    }
}
$sth->finish;
$dbh->disconnect();
printf("%s: %s\n", "Slave_IO_Running", $status{"Slave_IO_Running"});
printf("%s: %s\n", "Slave_SQL_Running", $status{"Slave_SQL_Running"});
printf("%s: %s\n", "Seconds_Behind_Master", $status{"Seconds_Behind_Master"});

Состояние репликации MySQL

В предыдущей заметке я рассказывал о настройке репликации, теперь же более подробно расскажу о запросе > SHOW SLAVE STATUS\G. Наибольший интерес с точки зрения мониторинга представляют собой поля:

Slave_IO_Running - выполняется ли выгрузка двоичного лога с мастера. При нормальной работе должно быть Yes, значение No говорит о каких-либо проблемах на мастере, чаще всего отстуствие прав, сетевые проблемы или же отсутствие самих логов. Точная причина указана в поле Last_IO_Error.
Slave_SQL_Running - выполняются ли запросы выгруженные с мастера. Здесь все немного сложнее. Если в этом поле No, то нужно смотреть значение Last_SQL_Error.
Seconds_Behind_Master - отставание слейва от мастера в секундах. Чем меньше, тем лучше.

Master-Slave репликация в MySQL

Это самый простейший случай масштабирования: один ведущий сервер и один ведомый. В этом случае все обновления пишутся на ведущий (master) и реплицируются на ведомый (slave).
Репликация в mysql работает следущим образом: ведущий логирует все измения базы в двоичный лог, ведомый подключаясь в ведущему выгружает этот самый лог и затем выполняет его.
Настройка репликции в общем случае состоит из нескольких этапов

суббота, 23 апреля 2011 г.

SPF и с чем его едят

Изначально электронная почта не предусматривала какого-либо механизма проверки подлинности адреса отправителя и поэтому можно подставить любой домен и любой адрес, чем благополучно пользуются спамеры.
Одним из предложенных решений проблемы является SPF, описанный в документе RFC 4408. В нем предложено публиковать через запись типа TXT список хостов авторизованных отправлять почту с домена.
Пример записи:

IN TXT "v=spf1 ipv4:4.4.4. -all"

Данная запись говорит, что хост 4.4.4.4 может отправлять почту с домена, а все остальные - нет. Более подробно синтаксис описан на странице http://www.openspf.org/SPF_Record_Syntax.
В настоящее время все популярные MTA имеют в том или ином виде поддержку SPF, однако используется он лишь на 10% доменов.

Отключение coredump во FreeBSD

Core файлы могут содержать конфеденциальную информацию (логины, пароли), поэтому в боевой среде имеет смылс их отключить. Делается это просто: в /etc/login.conf находим строчку :coredumpsize=unlimited:\ и заменяем ее на :coredumpsize=0:\.
Потом чтобы изменения вступили в силу выполняем
# cap_mkdb /etc/login.conf

VirtualBox и DHCP

В одной из предыдущих заметок я обещал рассказать про выдачу айпишников гостевым машинам из DHCP. Делается это достаточно просто:
1. Нужно назначить mac-адрес гостевой машине
2. Прописать его в конфиг dhcp.

Cyrus Database backends mismatch

После обновления сайруса тот стал ругаться на несоотвествие типов внутренней БД.
Решение нагуглилось очень быстро:

# cd /var/lib && cp -Rp cyrus cyrus.old
# ctl_mboxlist -d > /tmp/mailboxes.txt && rm mboxlist
# cvt_cyrusdb /tmp/mailboxes.txt flat /var/lib/cyrus/mailboxes.db skiplist
# rm /usr/lib/cyrus/cyrus-db-types.active
# chown cyrus:mail *
# dpkg-reconfigure cyrus-common-2.2


пятница, 22 апреля 2011 г.

Обновление PostgreSQL до нового минорного релиза

Как известно, в разных версиях двочный формат базы несовместим и поэтому при переходе на более новую (или старую) приходится делать дамп и релоад всех таблиц. Сделать это достаточно просто.
Для начала нужно отредактировать pg_hba.conf, таким образом, чтобы не дать обычным пользователям обращаться к базе, только после этого можно начинать делать дамп. Далее запускаем дамп:
# pg_dumpall > pg_dump.sql
следующим шагом останавливаем демон:
# /usr/local/etc/rc.d/postgesql stop
После этого можно перейти непосредственно к обновлению. Я предпочитаю portuupgrade
env DISABLE_CONFLICTS=YES portupgrade -o databases/postgresql90-server postgresql-server databases/postgresql90-client postgresql-client
Далее нужно проинициализировать каталог с данными, старый желательно сохранить на всякий поражный, поэтому удалять мы его не будем, а лишь переименуем в data.bak, создадим новый и поставим владельца pgsql:pgsql

# cd $DATADIR
# mv data data.old
# mkdir data
# chown pgsql:pgsql data
# /usr/local/etc/rc.d/postgesql initdb

Кластер проинициализирован, теперь скопируем файлы конфигурации (postgresql.conf, pg_hba.conf) из старого каталога в новый. Вносим необходимые изменения, для этого нужно заранее ознакомиться с информацией о релизе новой версии.

Когда с этим покончено запускаем новую версию и восстанавливаем дамп:

# /usr/local/etc/rc.d/postgresql start
# psql -U pgsql template1 -f  pg_dump.sql

Дамп восстановился, теперь можно открыть доступ клиентам в pg_hba.conf.
После этого желательно обновить и клиенсткие библиотеки, ну и удалить старый каталог данных.

nging как ssl фронтэнд

Nginx можно использовать в качестве https фронтэнда, на на бакедны передавать незафированный трафик. Конфиг достаточно простой:

    server {
        listen       443;
        ssl_session_timeout  5m;
        ssl             on;

        server_name *.domain.tld;

        ssl_certificate      domain.pem;
        ssl_certificate_key  domain.key;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;
        keepalive_timeout    60;
        location / {
            proxy_pass http://localhost:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_redirect     off;
        }

        location ~ /\.ht {
            deny  all;
        }
        location ~ /\.svn {
            deny  all;
        }

    }

Здесь бакенд слушает на локалхосте на порту 80. Нужно иметь ввиду, что в текущей версии на момент написания заметки (1.0.0) nginx не поддерживает keep-alive соединения с бакендами, поэтому данная схема не рассчитана на большую нагрузку.

Деплой django с uwsgi и nginx

В продолжение темы деплоя php-приложений делюсь опытом выкладки приложений django.

Нам понадобиться uwsgi, который без проблем устанавливается из портов
# make install clean -C /usr//ports/www/uwsgi
Следующий шаг - подготовка конфига nginx

        server_name  site.domain.tld;

        location / {                uwsgi_pass      unix:///tmp/uwsgi.sock;
                include         uwsgi_params;

                uwsgi_param     UWSGI_CHDIR             /usr/local/www/$host/deploy;
                uwsgi_param UWSGI_SCHEME $http_x_forwarded_proto;
                uwsgi_param     UWSGI_SCRIPT            uwsgi;
                uwsgi_intercept_errors on;
        }

Параметр UWSGI_SCRIPT - указывает на точку входа в django приложение. Нужно иметь ввиду, что этот файл должен быть импортирован, поэтому не может иметь точки в названии. Сам файл должен находится в директории UWSGI_CHDIR
Теперь можно выкладывать проект в директорию /usr/local/www/$host. После этого создается файл uwsgi.py с обычно стандартным содержимым:

import os
import sys
import django.core.handlers.wsgi

DIR_PROJECT = os.path.dirname( os.path.dirname( os.path.realpath(__file__) ) )
sys.path.append( DIR_PROJECT )

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
application = django.core.handlers.wsgi.WSGIHandler()


Запускаем uwsgi:

# echo 'uwsgi_enable="YES"'  >> /etc/rc.conf
# echo 'uwsgi_flags="-L -M --vhost"' >> /etc/rc.conf
# service uwsgi start

И если все было сделано правильно, то nginx передаст запрос uwscgi, а тот вызовет uwsgi обработчик, который в свою очередь отдаст запрос на обработку в django.
Важно иметь ввиду, что для корректной работы пользователю, из под которого запускается uwsgi необходимы права на запись в директорию со скриптами, иначе интерпретатор не сможет записать скомпилированный байт-код (файлы *.pyc)

Мониторинг скриптовых процессов в Nagios

Мониторить скрипты через стандартный для snmp способ proc process_name
Не удается, поскольку имя процесса у них - это имя исполняемого файла интерпретатора. Но выход есть.
Нам понадобиться плагин check_snmp_extend
Конфигурирование nagios подробно описано на сайте проекта:

define command{
    command_name    check_snmp_extend
    command_line    $USER1$/check_snmp_extend.sh $HOSTADDRESS$ $ARG1$
    }

Далее на целевой машине создаем следующий скрипт и сохраним его в /root/check_script.sh

#!/bin/sh
. /etc/rc.subr
# $1 - script name
# $2 - pidfile
# $3 - interpreter
r=`check_pidfile $1 $2 $3`
if [ ! $r  ]; then
     echo "CRITICAL $1 is not running"
else
     echo "OK $1 is running as pid $r"
fi

Скрипт принимает три агрумента и отвечает OK/CRITICAL в зависимости от возвращаемого значениея функции check_pidfile.
Теперь самое главное: преположим есть скрипт /home/www/something.pl, который пишет пид в /tmp/somthing.pid, а путь к перлу - /usr/local/bin/perl. Тогда добавим в конфиг snmpd такую строку:
extend something /root/check_scrint.sh /home/www/something.pl /tmp/somthing.pid /usr/local/bin/perl
Перезапускаем snmpd и прописываем проверку в нагиос:
define service{
    use            generic-service
    host_name        remote.server
    service_description    SomeService status
    check_command        check_snmp_extend!something
}

четверг, 21 апреля 2011 г.

3g модем мегафон во FreeBSD

Понадобилось подключиться к инету через 3г модем. Выбрал мегафон, из-за лучшего покрытия в моем городе. Вот рабочий конфиг

default:
 set log Phase Chat LCP IPCP CCP tun command
 ident user-ppp VERSION (built COMPILATIONDATE)

megafon3g:
 set device /dev/ttyU0.0
 set speed 460800
 set dial "\"\" \
 AT OK \
 AT OK \
 ATS0=0 OK \
 AT OK \
 AT&FE0V1X1&D2&C1S0=0 OK \
 AT OK \
 AT+CGDCONT=1,\\\"IP\\\",\\\"internet\\\" OK \
 ATDT*99***1\# CONNECT"
 set login
 set authname "megafon"
 set authkey "megafon"
 disable ipv6cp
 disable pap
 disable chap
 enable dns
 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
 add default HISADDR


Сохраняем в /etc/ppp/ppp.conf и подключаемся
# ppp -ddial megafon3g

FreeBSD и VirtualBox bridged networking

Не нашел в сети внятного объяснения (не там искал?), как настроить bridged сеть в гостевой системе под FreeBSD и решил восполнить этот пробел.

Деплой большого количества сайтов на php и nginx

Когда количество сайтов на сервере переваливает за несколько десятков, начинаешь задумываться, как бы упростить себе жизнь. Я создал для себя простой шаблон, использующий переменную Host из запроса:

    server {
        listen       80;
        server_name  site1.domain.tld;

        server_name  site2.domain2.tld;

        root   /home/$host;
        location / {
           index  index.php index.html index.htm;
        }

        location ~ \.php$ {
            fastcgi_pass   localhost:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location ~ /\.ht {
            deny  all;
        }
        location ~ /\.svn {
            deny  all;
        }

    }

Тут предпологается, что php-fpm запущен на локалхосте на порту 9000.
Таким образом остается лишь выложить скрипты и статику в директорию /home/$host и добавить соответсвующую директиву server_name.