среда, 28 сентября 2016 г.

ZRAMRAID или как разогнать виртуальный том без потери данных


Данный проект является производной всех тех экспериментов с использованием виртуализации XEN\KVM, который мы начали еще в 2012г. Тогда нам очень не нравилась скорость работы дисковой подсистемы в режиме HVM для сервера WINDOWS 2003.

В процессе поиска решений вспомнили о модуле zram и первым делом сделали виртуальный раздел для swop. Безусловно определенно работать OS WINDOWS в «таком» окружении стала быстрее, точнее стала более «отзывчивее», но недостаточно для серверных задач. Вот тогда у нас и родилась идея сделать так называемый виртуальный RAID, который мы и назвали от производной zram —> ZRAMRAID. Идея собственно проста, создаем блочное устройство из области памяти с применением модуля ядра zram, по размеру одинаковое с образом диска для виртуальной машины, после чего объединяем оба носителя в RAID массив и уже готовый RAID (MD) отдаем виртуальной машине в XEN или KVM как носитель для работы с данными.
Схема построения RAID массива:
После этого уже в виртуальной машине форматируем и используем по назначению. Что в результате получается? Во первых — скорость общения с носителем практически равна скорости памяти, а это я вам скажу по круче SSD будет! Во вторых, что касается переживаний о сбоях, специально в процессе работы виртуальной машины проводили аварийное отключение системного блока и машина достойно выдерживала такие «сбои». Все таки программный RAID в системе LINUX достоин уважения! При всех наших экспериментах по экстремальным отключениям как частей ZRAMRAID, так и аварийных остановках, данные оставались целыми, что помогло нам решить многие производственные проблемы в процессе эксплуатации виртуальных машин. На данный момент есть у нас такой сервер который отработал 3года и несмотря на редкие сбои по питанию достойно выдержал тест на надежность. Безусловно наш скромный проект не может претендовать на промышленную эксплуатацию и является скорее нестандартным решением, но я думаю поможет в решении многих задач на серверах. В частности у меня например в таком «ZRAMRAID» прекрасно себя «чувствует» почтовая база данных. Кроме описания и функциональной схемы «ZRAMRAID», прилагаем код на языке BASH который является системным на OS LINUX для более простого использования данного решения. Программный код распространяется согласно лицензии GNU Public License.

Код на языке BASH состоит из 3х скриптов:
1. zramraid-install — инсталлятор, установщик скриптов поддерживает OS Debian
2. zramraid-config — скрипт по управлению конфигурацией zramraid носителей
3. zramraid-maker — скрипт управления запуском и остановкой zramraid носителей

При вызове любого из скриптов с ключом —help можно получить справку по использованию скриптов с примерами.
Скачать архивом можно тут
Зеркало: тут

четверг, 26 мая 2016 г.

bash - работаем без операторов условий (if / then / else)...

При работе в bash столкнулся с тем, что очень утомительно отслеживать в сложных или больших по обьему скриптах вложенные условия, часто где-то на 4..5 м вложении условия просто уже теряешь мысль - "зачем это делал исходя из предыдущих действий".

Пример типа:

#!/bin/bash
value_in="-1";

if  [[ $value_in < 0 ]]
   then
       if [[ $value_in != 0 ]]
         then
             if [[ $value_in > 0 ]]
               then
                 ...
              else
           fi
         else
         fi
       else
      fi
     .......

или

if [[ $value_in < 0 ]]
  then
  ...
fi

if [[ $value_in != 0 ]]
  then
  ...
fi

if [[ $value_in > 0 ]]
  then
  ...
fi

if [[ $value_in == 0 ]]
  then
  ...
fi

.....


В поиске "той самой" ошибки честно уже становится сложно понять собственно - "где"?..  Вот и решил я эту задачу несколько не стандартно, но очень хорошо читаемо и отслеживаемо.. :)

Пример ниже:

#!/bin/bash
## переменная которую мы проверяем...
value_in="-1";

## массив условий которые будут использованы
iFs=( "$value_in < 0 " "$value_in != 0 " "$value_in > 0 " "$value_in == 5 " );

## массив функций которые в соответсвии с условием обработают Then или Else
logic=( '"a0" "a1"' '"b0" "b1"' '"c0" "c1"' '"d0" "d1"' );

## собственно функции обработчики.
function a0() {
    echo "run - a0";
}

function a1() {
    echo "run - a1";
}

function b0() {
    echo "run - b0";
}

function b1() {
    echo "run - b1";
}

function c0() {
    echo "run - c0";
}

function c1() {
    echo "run - c1";
}

function d0() {
    echo "run - d0";
}

function d1() {
    echo "run - d1";
}

## *****************обработчик событий
function executor() {
if [[ ${#iFs[@]} -eq 0 ]]||[[ ${#iFs[@]} != ${#logic[@]} ]]
    then echo "exit";
         exit 0;
fi
echo "begin";
exfunc=();
for ((lg_index=0; lg_index != ${#iFs[@]}; lg_index++))
 do
    ## !! debug operation...
    echo "execution: function ${iFs[lg_index]}"
    lg=$(echo $((${iFs[$lg_index]})) );
    exfunc=( ${logic[$lg_index]} );
    runfunc=$(echo ${exfunc[$lg]}| sed 's/\"//g');
    $runfunc;
done
}

executor;


Здесь применена технология "мгновенного" перехода по индексу имен функций - которые должны выполнять событие согласно условий.
Проще говоря по результату полученному из бинарной операции - получаем индекс и соответсвенно имя исполняемой функции которая и обработает результат. Данная технология используется мной в разных языках программирования, и блестяще показывает быстродействие!
В некоторых языках программирования момент перехода к сожалению невозможно "перехватить" - поэтому приходится вставлять "сигнализатор" в обработчик события.
Пример на языке bash - просто показывает принцип работы. А вот использовать данную технологию можно практически везде. Всем кто читал спасибо. :)