Linux

Довольно часто наши клиенты сталкиваются с необходимостью выгрузить информацию о звонках из раздела Call Detail Record к себе. Как вы уже знаете (даже если взять во внимание предыдущую запись в этом блоге, а именно Липкость звонка), вся историческая статистика хранится в базе elasticsearch. В документации вы так же могли увидеть пример получения данных с помощью нашего REST API. Но, что если звонков несколько сотен? Или несколько тысяч? Как правильно получить такой объем данных? Сегодня я расскажу как работать с большими объемами данных.

Scroll

Для получения большого количества данных, в elasticsearch предусмотрен функционал scroll, который мы повторили и в нашем REST API. Рассмотрим на примере:

Цього року вирішив запустити окремий блог українською мовою де описуватиму досвід використання OpenSource та воасні хобі. Цей блог залишиться лише із професійними матеріалами. Перший запис у новому блозі про встановлення Linux на USB «флешку» із зашифрованою файловою системою.

В предыдущей статье я рассказал, как я подготавливаю Linux сервер к работе. Открывая тему моего набора инструментов на сервере, я хочу начать с первых программ, с помощью которых осуществляется подключение и работа в удаленном терминале. Это mosh, zsh и tmux.

mosh (mobile shell)

Mosh — современная замена старого доброго SSH. Ладно, это не полная его замена, поскольку для работы mosh нужен все тот-же ssh, можем сказать, что это новое дыхание для ssh ;). После того, как произошло соединение, запускается mosh-server с использованием одного из UDP портов в диапазоне от 60000 до 60010. Дальнейшее взаимодействие между клиентом и сервером происходит по UDP.

“А что это за программа такая?” — часто приходиться слышать, работая на сервере в SSH терминале, от человека, который подошел и уставился в мой монитор. Сегодня, дорогой друг, стоящий за моей спиной, я познакомлю тебя с ПО, которое использую в ежедневной работе. Но, начать надо с того, как все это добро попадает на тот самый Linux сервер.

Виртуальные машины приходят и уходят, иногда, десятками за неделю. Каждый раз настраивать “под себя” утомительно… Я нашел для себя решение задачи и теперь готов поделиться. Это ansible — простой инструмент, который через стандартное SSH подключение выполняет рутинные операции по подготовке сервера к работе. Все инструкции, что делать, описаны в файле playbook.yml. В качестве хоста, который будет настраивать, должна быть Linux либо OSX машина. Я это всегда делаю со своего MacBook либо с тестового Linux сервера в офисе. Но, в основном с MacBook. Сам рецепт приготовления сервера, я выложил на github и сейчас расскажу, как им пользоваться.

Процесс настройки состоит из нескольких этапов:

  1. Установка всего необходимого мне ПО.
  2. Создание пользователей и настройка ключей авторизации для SSH. Отключение регистрации по паролю и отключение root через ssh.
  3. Настройка firewall — опционально.
  4. Установка docker — опционально.

А теперь о каждом пункте детальный.

В предыдущих статьях я рассказал о том, что такое Docker и как оно все работает. Так же, рассмотрели пример запуска простого Webitel-приложения в контейнере. Сегодня я покажу практический пример, как быстро запустить FreeSWITCH в контейнере.

Для Webitel мы уже давно используем Docker как основной инструмент управления приложением. Для FreeSWITCH я сделал базовый образ, на основание которого строится автоматически образ для Webitel. Недавно, я расширил его еще и под задачи установки vanilla конфигурации FreeSWITCH. Вы можете его использовать для быстрого разворачивания приложения. Как это сделать — опишу ниже.

После теории перейдем к практическим занятиям. Для этого нам понадобится Linux с установленным Docker либо Doot2Docker на Windows или OSX. Как это сделать, доступно написано на сайте разработчика. На тестовой машине у меня версия 1.3.2:

┌─[ ~/blog ]
└─[root@core (пт січ 09 04:02:32)] ·> docker info
Containers: 15
Images: 302
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 368
Execution Driver: native-0.2
Kernel Version: 3.13.0-43-generic
Operating System: Ubuntu 14.04.1 LTS

Вначале были контейнеры

Контейнеры имеют очень длинную историю. В отличие от виртуализации, когда на одной физической машине мы можем запускать несколько независимых виртуальных машин, контейнеры существуют поверх операционной системы. Данный подход позволяет более гибко использовать ресурсы основной машины, но, в то же время, накладывает определенные ограничения. К примеру, мы можем легко запустить CentOS Linux поверх Ubuntu, но мы не сможем запустить Windows поверх Ubuntu.

Технология контейнеров существует уже очень давно и все больше становится похожей на изолированные виртуальные машины с собственной сетевой инфраструктурой, политикой групп либо с персональными файловыми хранилищами. Благодаря особенностям современного ядра Linux (таких как lxc) контейнеры завоевали большую популярность среди разработчиков программных продуктов.

Но, как управлять этими контейнерами? Как взаимодействовать между ними? Обычный подход виртуальных машин тут уже неуместен, необходимо что-то новое. И этим новым стал Docker.

Після певних подій, сайти УГКЦ підпали під потужний DDoS штурм. Важко було не те, що на сайт зайти, а й підключитися по SSH до консолі. Боротьба тривала кілька днів. Розповім, що саме мені допомогло подолати цю напасть.

Тюнінг iptables
На рівні мережевого екрану, я додав додаткові правила:

# DDoS
# Не відповідаємо на ping
iptables -A INPUT -p icmp -j DROP --icmp-type 8
# Блокуємо більше 2-х звернень на головну сторінку з одного IP за 10 сек.
iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "GET / HTTP" --algo kmp --to 1024 -m recent --set --name httpddos --rsource
iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "GET / HTTP" --algo kmp --to 1024 -m recent --update --seconds 10 --hitcount 2 --name httpddos --rsource -j DROP
# Блокуємо більше 32 конектів з 1 IP
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 32 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Це дозволило трохи розвантажити Apache.

Обновил один из серверов с Debian lenny до squeeze. Все прошло гладко, только вот на одном из старых сайтов (joomla 1.0) посыпалась куча deprecated функций PHP. Не хотел трогать код этого сайта, решил запустить для него отдельно PHP5.2 на том же сервере. Вот как это я реализовал.

Устанавливаем зависимости, скачиваем PHP5.2 и распаковываем архив:

aptitude install libxml2-dev libmysqlclient-dev libcurl4-gnutls-dev libpng12-dev libjpeg62-dev
cd /tmp
wget http://www.php.net/get/php-5.2.17.tar.gz/from/ru.php.net/mirror -O php-5.2.17.tar.gz
tar zxvf php-5.2.17.tar.gz
cd php-5.2.17

Из исходников собираем PHP5.2 и устанавливаем в /opt/php5.2:

./configure --prefix=/opt/php5.2 --with-config-file-path=/opt/php5.2 --with-mysqli --with-mysql --with-curl --with-gd --with-jpeg-dir --enable-cli --enable-fastcgi --enable-discard-path --enable-force-cgi-redirect
make
make install

Проверяем:

/opt/php5.2/bin/php -v
PHP 5.2.17 (cli) (built: Oct 22 2011 15:05:51)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies

Запускать для этого сайта PHP5.2 будем через fastcgi.

aptitude install libapache2-mod-fastcgi
a2enmod cgi fastcgi actions
invoke-rc.d apache2 restart

Создадим исполняемый файл /opt/php5.2/bin/php-cgi, который содержит:

#!/bin/sh
PHPRC="/opt/php5.2/"
export PHPRC
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /opt/php5.2/bin/php-cgi

В виртуальном хосте нужного сайта добавляем:


SetHandler application/x-httpd-php5

ScriptAlias /php52-cgi /usr/lib/cgi-bin/php52-cgi
Action application/x-httpd-php5 /php52-cgi
AddHandler application/x-httpd-php5 .php

Перезапустим Apache и проверяем что наш сайт уже использует PHP 5.2, когда все остальные 5.3

invoke-rc.d apache2 restart