FastNetMon

Tuesday 29 October 2013

Build vzctl from source code on CentOS 6

Во-первых, сначала подключите openvz репозиторий, так как ploop-devel есть только там.

Собираем:
yum install -y automake libxml2-devel libtool ploop-devel libcgroup-devel git
cd /usr/src
git clone git://git.openvz.org/vzctl
cd vzctl
./autogen.sh
./configure --prefix=/opt/vzctl
make
make install
Вуаля:
/opt/vzctl/sbin/vzctl --version
vzctl version 4.5.1-55.git.0da90c7

Бесплатная версия Nginx Plus

Уверен, многие слышали про платную коммерческую версию Nginx Plus. И всецело уверен, что ее никто из читающих меня не купил и не купит по причине неадекватнейшей стоимости - несколько тысяч долларов в год.

Я, безусловно, уважаю автора данного ПО, оно используется мной и нашей компанией повсеместно. Спасибо!

Но я нифига не уважаю их новый состав коммерцизирующий данный продукт и все последствия данного процесса.

В открытой версии Nginx откровенно саботировался ряд фич (в том числе Игорем, к сожалению):

  • syslog логгирование
  • динамический модули
  • тестирование состояния бэкэндов
  • нормальное, а не ущербное отображения состония
  • многое-многое другое

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

В ответ на это я предлагаю отличнейшее решение от наших китайских друзей - Taobao, Tengine - это полностью бинарно совместимый с Nginx.org веб-сервер, но с кучей полезнейших фич (которые nginx.org саботирует от включения в опен сорц версию).

Вот часть из суперфич:
  • All features of nginx-1.2.9 are inherited, i.e., it is 100% compatible with nginx.
  • Dynamic module loading support. You don't need to recompile Tengine when adding new modules to it.
  • Sends unbuffered upload directly to HTTP and FastCGI backend servers, which saves disk I/Os.
  • More load balancing methods, e.g., consistent hashing, and session persistence.
  • Input body filter support. It's quite handy to write Web Application Firewalls using this mechanism.
  • Dynamic scripting language (Lua) support, which is very efficient and makes it easy to extend core functionalities.
  • Logging enhancements. Syslog (local and remote), pipe logging, and log sampling are supported.
  • Includes a mechanism to support standalone processes.
  • Protects the server in case system load or memory use goes too high.
  • Multiple CSS or JavaScript requests can be combined into one request to reduce download time.
  • Removes unnecessary white spaces and comments to reduce the size of a page.
  • Proactive health checks of upstream servers can be performed.
  • The number of worker processes and CPU affinities can be set automatically.
  • The limit_req module is enhanced with whitelist support and more conditions are allowed in a single location.
  • Enhanced diagnostic information makes it easier to troubleshoot errors.
  • More user-friendly command lines, e.g., showing all compiled-in modules and supported directives.
  • Expiration times can be specified for certain MIME types.
  • Error pages can be reset to 'default'.

Прошу: https://github.com/alibaba/tengine

Thursday 24 October 2013

Практический опыт с HDFS

Вот поставил на две ноды, радуюсь. И сломал через 25 минут после установки - появились corrupted nodes ( Corrupt blocks: 1),  забил, удалил файл и залил заново - все заработало.

Попробовал отключить один из серверов (на оставшемся были все реплики) и получил следующее:
sudo -u hdfs hadoop fs -get /mydir/1Gb.dat /tmp/asdasd
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fca186b3792, pid=13965, tid=140505678411520
#
# JRE version: Java(TM) SE Runtime Environment (7.0_45-b18) (build 1.7.0_45-b18)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x55b792]  PhaseCFG::schedule_node_into_block(Node*, Block*)+0xc2
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /tmp/hs_err_pid13965.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
[root@hadoop tmp]# cat /tmp/hs_err_pid13965.log
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fca186b3792, pid=13965, tid=140505678411520
#
# JRE version: Java(TM) SE Runtime Environment (7.0_45-b18) (build 1.7.0_45-b18)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x55b792]  PhaseCFG::schedule_node_into_block(Node*, Block*)+0xc2
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
Ну и после 3х минут чесания репы и понимания - сломать _самому_ кластерную супернадежную ФС - это уж слишком, тянусь к мемтестеру :)

Который через 4 секунды теста показывает серьезные повреждения:
memtester 12000
memtester version 4.2.1 (64-bit)
Copyright (C) 2010 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 12000MB (12582912000 bytes)
got  12000MB (12582912000 bytes), trying mlock ...locked.
Loop 1:
  Stuck Address       : testing   0FAILURE: possible bad address line at offset 0xd8ccd000.
Skipping to next test...
  Random Value       

P.S. НЕ ВЕРЬТЕ, что hadoop будет работать на _любом железе_. ECC/chipkill - must have.

Wednesday 23 October 2013

Установка HDFS на базе Cloudera Hadoop 4.4.0 для CentOS 6

Что есть HDFS?

HDFS - это распределенная файловая система. В данной инструкции мы поставим ее в тестовом режиме! Это небезопасно, в боевом режиме Вы обязательно должны настроить HA или копирование на NFS для метаданных.

Пару слов об аппаратной конфигурации - для начала, мы развертываем HDFS на одном сервере с двумя жесткими дисками (иначе вообще вся затея с распределенной ФС становится бессмысленной). В моем примере диски смонтированы как /data/disk1 и /data/disk2.

Конфигурируем hostname и /etc/hosts

В самом-самом начале пути нужно сделать следующее - открыть редактором /etc/sysconfig/network и в поле HOSTNAME вписать корректный хостнейм адрес машины в виде:
HOSTNAME=hadoop.fastvps.ru

Следом открыть файл hosts: /etc/hosts и там вписать/исправить следующее:
88.198.XX.XX  hadoop.fastvps.ru hadoop

Где 89.198.XX.XX - ВНЕШНИЙ IP адрес сервера, НЕ localhost/127.0.0.1.

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

Теперь проверяем, чтобы  хостнейм резолвился во внешний IP командой ping (запись в DNS в данный момент не нужна):
 ping -c 1 hadoop.fastvps.ru
PING hadoop.fastvps.ru (89.198.XX.XX) 56(84) bytes of data.
64 bytes from hadoop.fastvps.ru (89.198.XX.XX): icmp_seq=1 ttl=64 time=0.025 ms
--- hadoop.fastvps.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.025/0.025/0.025/0.000 ms

Все, это позволит избежать кучи проблем в будущем. Корректный хостнейм ОЧЕНЬ важен для Hadoop, кривые данные в нем могут привести к очень и очень плачевным последствиям.

Устанавливаем Java

Итак, для работы Cloudera нам нужна Java версии 1.7 (я использовал update 45), так что идем на сайт Oracle и стягиваем там "jre-7-linux-x64.rpm".

Водружаем ее:
yum install -y jre-7-linux-x64.rpm

Проверяем, что все встало корректно:
java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)
Устанавливаем Cloudera Hadoop

Стягиваем репо:
wget http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/cloudera-cdh4.repo -O/etc/yum.repos.d/cloudera-cdh4.repo

Ставим все, что нужно для работы Hadoop HDFS (почти 200 мегабайт пакетов):
yum install hadoop-hdfs-namenode hadoop-hdfs-datanode hadoop-client 
Копируем стандартный конфиг для правки:
cp -r /etc/hadoop/conf.dist /etc/hadoop/conf.my_cluster
alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
Теперь нужно настроить кластер, в файле /etc/hadoop/conf.my_cluster/core-site.xml 
В блок confguration вносим следующее (это имя нашего кластера):

<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.fastvps.ru/</value>
</property> 
<property><name>fs.trash.interval</name> <value>10080</value> </property>
Второй параметр отвечает за активацию корзины (и ее автоочистки через неделю после удаления файла). Обращаю внимание, что корзина работает только с hdfs shell, через API файлы сносятся сразу же.

Далее открываем файл /etc/hadoop/conf.my_cluster/hdfs-site.xml и в блок configuration вносим:

<property> <name>dfs.permissions.superusergroup</name>
<value>hadoop</value></property>
<property> <name>dfs.namenode.name.dir</name>
<value>/data/disk1/dfs/namenode
</value> </property> 
<property>
 <name>dfs.datanode.data.dir</name>
 <value>/data/disk1/dfs/datanode,/data/disk2/dfs/datanode</value>
</property>
<property>
<name>dfs.datanode.failed.volumes.tolerated</name>
<value>1</value>
</property>
<property>
 <name>dfs.replication</name>
<value>2</value>
</property> 

Тут мы задаем пути до папок хранения данных namednode (тут будут метаданные) и datanode (тут будут сами данные). С предпоследним параметром интереснее - это предельное число data нод, которые могут отказать на данном сервере. А вот последний параметр задает стандартное число реплик для файлов. Стандартно стоит 3, но это неудобно для тестового стенда.

Создаем указанные папки (предполагаем, что диски 1 и 2 смонтированы в /data/disk1 и /data/disk2 соответственно):
mkdir -p /data/disk1/dfs/namenode
mkdir -p /data/disk1/dfs/datanode
mkdir -p /data/disk2/dfs/datanode

И конфигурируем их права:
chown -R hdfs:hdfs /data/disk1/dfs/namenode /data/disk1/dfs/datanode /data/disk2/dfs/datanode
chmod 700 /data/disk1/dfs/namenode

Теперь форматируем namenode:
sudo -u hdfs hadoop namenode -format

Запускаем namenode:
/etc/init.d/hadoop-hdfs-namenode start

Запускаем  data node:
/etc/init.d/hadoop-hdfs-datanode start

Создаем свою первую папку:
sudo -u hdfs hadoop fs -mkdir  /mydir
Тестируем работу HDFS

Смотрим листинг корневой директории:
sudo -u hdfs hadoop fs -ls /
Found 1 items
drwxr-xr-x   - hdfs hadoop          0 2013-10-24 00:26 /mydir
Кладем файл в HDFS (ВНИМАНИЕ! НЕ забываем, что мы работаем от имени пользователя hdfs, так что файл в локальной ФС должен быть доступен ему на чтение):
sudo -u hdfs hadoop fs -put /tmp/jre-7-linux-x64.rpm /mydir

Убеждаемся, что он лег:
sudo -u hdfs hadoop fs -ls  /mydir
Found 1 items
-rw-r--r--   3 hdfs hadoop   21203924 2013-10-24 00:36 /mydir/jre-7-linux-x64.rpm
Кстати говоря, большой тестовый файл можно взять вот здесь: http://proof.ovh.net/files/ 

Мониторинг HDFS

Его можно осуществлять посредством веб-скрипта: http://IP_адрес_вашей_namenode:50070/dfshealth.jsp

Настройка HDFS Fuse

Так как каждый раз пользоваться hadoop fs неудобно далеко не всегда, я рекомендую использовать Fuse модуль, чтобы смонтировать HDFS как обычную ФС (не забываем, HDFS - не Posix! Блокировки и правки файлов не поддерживаются).
yum install hadoop-hdfs-fuse
Монтируем:
 hadoop-fuse-dfs dfs://hadoop.fastvps.ru:8020 /mnt
Вуаля, тот же файлик доступен как обычная файловая система:
ls -al /mnt/mydir/
итого 11G
drwxr-xr-x 3 hdfs hadoop 4,0K Окт 24 03:30 .
drwxr-xr-x 3 hdfs hadoop 4,0K Окт 24 03:21 ..
-rw-r--r-- 1 hdfs hadoop  10G Окт 24 03:30 10Gio.dat
Отмонтировать его можно стандартно:
umount /mnt
Что дальше?

В следующей публикации я постараюсь поставить второй сервер как datanode, чтобы на практике протестировать функцию отказоустойчивости HDFS

Установка datanode на отдельном сервере

Устанавливаем Java по аналогии с предыдущим сервером, далее также конфигурируем hostname и /etc/hosts. Данный сервер назовем data1-hadoop.fastvps.ru. 

Подразумеваем, что на данном сервере у нас один жесткий диск и он смонтирован в /data/disk1.

Так как мы подошли к вопросу распределенной фермы, то мы должны адрес name node забить в DNS либо же на каждой data node создать следующую запись в hosts (обоих серверов!!! Также нужно добавить хостнейм клиента на name node, то есть они должны знать друг друга! Иначе ничего работать не будет! Лучше всего, сразу внесите записи в DNS до начала тестов, а также убедитесь, что дата ноды и name нода находятся в одном домене второго уровня):
88.198.xx.xx hadoop.fastvps.ru hadoop

Далее ставим hadoop data node:
yum install -y hadoop-hdfs-datanode
Копируем стандартный конфиг для правки:
cp -r /etc/hadoop/conf.dist /etc/hadoop/conf.my_cluster
alternatives --verbose --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my_cluster 50
alternatives --set hadoop-conf /etc/hadoop/conf.my_cluster
Теперь нужно настроить кластер, в файле /etc/hadoop/conf.my_cluster/core-site.xml 
В блок confguration вносим следующее (это имя нашего кластера):

<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.fastvps.ru/</value>
</property> 
<property><name>fs.trash.interval</name> <value>10080</value> </property>

Далее открываем файл /etc/hadoop/conf.my_cluster/hdfs-site.xml и в блок configuration вносим:

<property> <name>dfs.permissions.superusergroup</name>
<value>hadoop</value></property>
<property>
 <name>dfs.datanode.data.dir</name>
 <value>/data/disk1/dfs/datanode</value>
</property>
Создаем необходимую папку:
mkdir -p /data/disk1/dfs/datanode

Выставляем права:
chown -R hdfs:hdfs /data/disk1/dfs/datanode

Запускаем  data node:
/etc/init.d/hadoop-hdfs-datanode start

Теперь можно открыть статистику HDFS и смотреть, как блоки нашего 10 гигабайтного файла реплицируются на вновь добавленный сервер.

Как репликация закончится, можно смело отключать второй сервер (отключив сервер с name node Вы выведете кластер из строя, да) и продолжать работать с файловой системой как ни в чем ни бывало!

Ура!

Источник: http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.2.0/CDH4-Installation-Guide/cdh4ig_topic_11_2.html

Thursday 17 October 2013

Что есть load average в Linux?

Вот довольно подробное, но старое (Linux 2.4) объяснение данного вопроса: http://www.spinellis.gr/blog/20041125/

Сборка IPFIX на Debian Wheezy

Итак, собираем:
cd /usr/src
git clone git://git.code.sf.net/p/libipfix/code libipfix-code
cd libipfix-code/
./configure --prefix=/opt/libipfix
make
make install
Офсайт проекта: http://sourceforge.net/projects/libipfix/ 

Далее в режиме коллектора IPFIX его можно запустить вот так:
LD_LIBRARY_PATH=/opt/libipfix/lib /opt/libipfix/bin/ipfix_collector -u -p 9996 
При этом на экран будут выводиться информация обо всех проходящих пакетах.

Monday 14 October 2013

Сборка lib pcap из исходников на Debian Squeeze

Pcap - на удивление динамично развивается и очень много багов в нем исправлено в новых версиях, которых в Дебияне не имеется.
cd /usr/src
wget http://www.tcpdump.org/release/libpcap-1.4.0.tar.gz
tar -xf libpcap-1.4.0.tar.gz
cd libpcap-1.4.0
apt-get install -y flex bison
./configure --prefix=/opt/libpcap140
make
make install
А чтобы потом с ней залинковать нашу прогрумму:
g++ sniffer.cpp -lpcap -I/opt/libpcap140/include -L/opt/libpcap140/lib
g++ sniffer.cpp -Linclude
LD_LIBRARY_PATH=/opt/libpcap140/lib ./a.out