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

Csync2. Простая синхронизация файлов.

Иногда возникает необходимость иметь одинаковые конфиги на разных машинах. И не хочется постоянно копировать их туда-сюда по scp. При этом в случае изменения файла нужно, чтобы файлы обновился на всех машинах. Например фронт-энды на nginx с идентичными конфигами. Для этого можно писать свои скрипты, использовать rsync и т.д. Или использовать более мощные системы управления типа chef или puppet. Для небольших кластеров проще использовать csync2.

Инсталяция
Стандартно ставим пакет из репозитария
~$ sudo aptitude install csync2

Сертификаты
Затем стоит прочитать /usr/share/doc/csync2/README.Debian, где описано как создать ssl-сертификаты для взаимодействия серверов. Либо выполнить следующие команды:
~$ sudo openssl genrsa -out /etc/csync2_ssl_key.pem 1024 
~$ sudo openssl req -new -key /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.csr 
~$ sudo openssl x509 -req -days 600 -in /etc/csync2_ssl_cert.csr \
        -signkey /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.pem 

После создания сертификатов создаем уникальный ключ для кластера:
~$ sudo csync2 -k /etc/csync2.cluster.key

Конфигурация
Прописываем /etc/hosts адреса нод кластера:
192.168.101.101 nginx-101
192.168.101.102 nginx-102
192.168.101.103 nginx-103

Создаем каталог для логов:
~$ mkdir /var/log/csync2

Ротейтим будущие логи через logrotate для этого создаем файл /etc/logrotate.d/csync2:
/var/log/csync2/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
} 

Создаем конфиг /etc/csync2.cfg:
group nginx {
    host nginx-101 nginx-102 nginx-103;

    key /etc/csync2.cluster.key;

    auto younger;

    include /etc/hosts;
    include /etc/crontab;
    include /etc/csync2.cfg;
    include /etc/nginx;
    include /etc/logrotate.d/csync2;

    action {
        pattern /etc/nginx/*;
        exec "/etc/init.d/nginx reload";
        logfile /var/log/csync2/csync2-nginx.log;
        do-local;
    }

} 

Тестируем
Перед первым использованием необходимо забэкапить всё, что планируете синхронить. Т.к. выбрано правило обновления younger -- новые файлы заменяют старые.

Необходимо скопировать на все ноды кластера файлы /etc/csync2.*

Первый раз я сгенерировал ssl-сертификаты на каждой ноде отдельно и раскопировал только ключ кластера(csync2.cluster.key) и не мог понять почему у меня выдается ошибка при синхоронизации.

Выполняем тестовые синхронизацию на всех нодах, для проверки работоспособности:
~$ sudo csync2 -xvv
Чем больше букв v, тем выше уровень логирования.

Если есть проблемы, то стоит проверить подключение через telnet host 30865. Возможно блокирует фаерволл, либо не запущен inetd (необходимо, чтобы был установлен пакет openbsd-inetd по умолчанию притягивается из зависимостей).

Автоматизируем синхронизацию
И добавляем в /etc/crontab запуск csync2:
*/15 *  * * *   root    /usr/sbin/csync2 -xv >> /var/log/csync2/csync.log 2>&1
15 7 *  * * *   root    /usr/sbin/csync2 -Rv >> /var/log/csync2/csync.log 2>&1

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

четверг, 7 июля 2011 г.

RAMFS и TMPFS

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

Отличия:
  1. Первое отличие следует из определения с какой памятью работает RAMFS и TMFS. Напомню, что есть физическая память (physical memory) и виртуальная память (virtual memory). Соответственно RAMFS работает только с физической памятью, а TMPFS работает с виртуальной памятью;
  2. Второе отличие заключается в том, что RAMFS игнорирует ограничение на размер выделяемого "раздела" оперативной памяти и динамически увеличивается по мере необходимости. В связке с первым пунктом это может привести к фатальным последствиям. TMPFS не вылазит за пределы выделенного;
  3. Третье отличие -- возможность задать автоматическое монтирование ФС в /etc/fstab. RAMFS -- нельзя, TMPFS -- можно;

Пример записи в /etc/fstab:
none /srv tmpfs defaults,size=64m 1 2

Если прописать в /etc/fstab ramfs получаем следующую ошибку:
~$ sudo mount -a
mount: unknown filesystem type 'ramfs'

Примеры монтирование вручную:
~$ sudo mount -t tmpfs -o size=64m tmpfs /srv 
~$ sudo mount -t ramfs -o size=64m ramfs /srv 

Если вы работаете с контейнерами OpenVZ, то в контейнерах можно использовать TMPFS. Для этого достаточно прописать нужные парамерты в /etc/fstab контейнера. При старте контейнера будет произведено автоматическое монтирование.

Подсветка синтаксиса в blogger с помощью prettify (blogger prettify syntax highlighting)

Основываясь на следующих постах:
http://stackoverflow.com/questions/1852537/how-to-use-prettify-with-blogger-blogspot
и
http://lukabloga.blogspot.com/2008/10/to-test-new-highlighting.html

Используем подсветку синтаксиса prettify, т.к. поддерживает большинство языков/форматов.
  • Авторизуемся в blogger
  • Заходим в Design -> Egit HTML
  • В "Edit Template" делаем поиск  <head>
  • После тега добавляем следующий код:
<link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/>
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'></script>
  • Затем делаем поиск <body> и добавляем в конец открывающегося тега следующий код: onload='prettyPrint()'
    В моём темплейте это выглядит так:
<body expr:class='"loading" + data:blog.mobileClass' onload='prettyPrint()'>
У вас возможно в теге <body'> не будет ничего лишнего
  • Нажимаем "Save Template"
  • Готово

Теперь, чтобы использовать все эти радости создаем новый пост и редактируем в режиме HTML (Edit HTML), вместо Compose. Вставка кода осуществляется через открывающиеся и закрывающиеся теги <pre> или <code> -- разница между тегами только в отображении или не отображении рамки вокруг текста:

<pre class="prettyprint">...</pre>
<code class="prettyprint">...</code>

Для использования специфичной подсветки языка нужно добавить в class указание на язык вида lang-язык. Например lang-html будет выглядеть так: class="prettyprint lang-html".

Столкнулся с проблемой, когда в режиме "Edit HTML" вставляются html-теги, то парсер blogger'а ругается на используются недопустимых тегов. Обходится это заменой "<" на "&lt;" и ">"  на "&gt;" -- это можно сделать вручную, либо перейти в режим "Compose", вставить нужный текст и вернуться обратно в режим "Edit HTML".