пятница, 13 февраля 2009 г.

Перенос дампа большой базы с MySQL на PostgreSQL


Перенести большую базу (размер дампа около 10 Гб) с MySQL на PostgreSQL просто удалением несовместимостей в дампе, созданном mysqldump, и накатыванием его на psql не получается - процесс заливки дампа занимает несколько суток. Далее приводится пошаговое руководство по сокращению этого времени до пары часов.
  1. создаем дамп без данных (mysqldump -d --skip-opt --compatible=postgresql);
  2. накатывам этот дамп на psql;
  3. дампим полученнную базу - и делим полученный файл дампа на две части - в первой - только операторы CREATE TABLE, а ALTER TABLE ... ADD CONSTRAINT и CREATE INDEX - во второй. В файле дампа они расположены строго последовательно. Смысл этой операции в том, чтобы заливать данные в базу без индексов, а только потом создать индексы - так получится в разы быстрее;
  4. создаем базу заново - и накатываем на нее схему без индексов;
  5. для дампа данных придется писать скрипт. Смысл его такой: выбираем все поля table_name в таблице information_schema.tables, где table_schema равна имени нашей переносящейся базы - и для каждой из этих таблиц запускам select * into outfile;
  6. заливаем эти файлы в psql с помощью оператора copy from;
  7. накатываем вторую часть схемы - индексы - и наша база перенесена.

понедельник, 2 февраля 2009 г.

строим netflow-proxy



Задача: принимать поток netflow и передавать дальше только пакеты, соответствующие определенным условиям. Возможно решение с помощью пакета nfdump
Нам интересны три утилиты из этого пакета. Первая и главная - nfcapd - демон который будет принимать netflow-поток и сохранять его в файлы.
Важные аргументы:
  • -l dirname - директория, где будем эти файлы хранить
  • -t - интервал ротации файлов в секундах (по умолчанию - 600)
  • -x команда (в кавычках), запускаемая после ротации каждого файла. Допустимы символы расширения. Практически важен %f - имя новосозданого файла.
  • -R host/port - адрес для пересылки сдублированного потока - сама по себе интересная возможность, но нам нужна более сложная конфигурация - и мы будем возиться с предыдущей опцией. Для ее полезного использования нам нужны еще две команды из пакета:
nfdump - очень похожа на всем знакомую tcpdump (только выражения фильтра нужно брать в кавычки). Необходимые аргументы:
  • -r - файл, из которого читаем (т.е. созданный nfcapd)
  • -w - файл, куда пишем netflow (- означает stdout). Если аргумент пропущен, получаем на выходе не netflow, а человеко-читаемый вывод. Полезно для тестирования.
  • -f filename - имя файла, содержащего выражение фильтра (может быть разбито на несколько строк)
И - последний штрих - команда nfreplay - посылает netflow из файла снова в сеть. Важные аргументы:
  • -H - адрес, куда будем слать netflow
  • -r filename - файл, содержащий пакеты для посылки (по умолчанию - stdin)
  • -v [59] - версия netflow
Теперь собираем все в кучу. Вызывам nfcapd с опицией -x '/path/to/myscript %f', а в этот скрипт помещаем что-то вроде:
nfdump -r $1 'src net my.ney.wo.rk/24' -w - | nfreplay -H my.nf.col.lector
rm $1

Перед тем, как подать на систему нагрузку, тестовые пакеты netflow можно создать с помощью ipcad