Archive

Archive for January, 2011

Сжатие данных для стандартных протоколов

January 23rd, 2011 No comments

Что имеется: два сервера, соединенных сетью. Эти сервера обмениваются данными по стандартному протоколу, например SMTP/LMTP, сжатие в которых (в отличии от HTTP) не предусмотрено.

Что случилось: сеть между машинами перестает справляться.

Что сделали: прокинули между машинами тунель с помощью stunnel, который не только зашифровал наш трафик но еще и сжал его zlib’ом.

Что получили: все зависи от данных и протокола. В некоторых случаях – трафик уменьшается в 10 раз.

Tags:

Принудительная очистка системных кэшей – drop_caches

January 21st, 2011 No comments

Начиная с Linux ядра 2.6.16 появилась возможность принудительной очистки системных кэшей:

Чистим pagecache:

echo 1 > /proc/sys/vm/drop_caches

Чистим dentrie и inode кэши:

echo 2 > /proc/sys/vm/drop_caches

Чистим pagecache, dentrie и inode кэши:

echo 3 > /proc/sys/vm/drop_caches

После выполнения операции необходимо запустить команду sync

http://linux-mm.org/Drop_Caches
http://www.opennet.ru/tips/info/1455.shtml

Оригинал: http://linsovet.com/content/linux-flush-system-caches

Tags:

Keyspace

January 16th, 2011 No comments

About
Keyspace is a replicated key-value database, a product of Scalien, available at http://scalien.com.

Keyspace is set apart from other key-value database because it uses so-called consistent replication, which means that all nodes see the database going through the same states. In other words, no split-brain scenario can occur, where different nodes see different versions of the database.

Установка
Требует Berkeley DB >= 4.6.

$ wget http://scalien.com/releases/keyspace/keyspace-1.9.0.tgz
$ tar zxvf keyspace-1.9.0.tgz
$ cd keyspace-1.9.0
$ make

Генерация конфига

$ cd keyspace-1.9.0
$ keyspace-config
 
Спросит несколько вопросов, а потом нарисует схему репликации.
<pre lang="bash">client(s)                         client(s)                         client(s)
 
^                                 ^                                 ^
|                                 |                                 |
|            node 0               |            node 1               |            node 2
|     +-------------------+       |     +-------------------+       |     +-------------------+
|     +     127.0.0.1     |       |     +     127.0.0.1     |       |     +     127.0.0.1     |
|     |                   |       |     |                   |       |     |                   |
|     +  /tmp/keyspace/0  |       |     +  /tmp/keyspace/1  |       |     +  /tmp/keyspace/2  |
|     |                   |       |     |                   |       |     |                   |
|     |                   |       |     |                   |       |     |                   |
7080 --+ Keyspace          |      7081 --+ Keyspace          |      7082 --+ Keyspace          |
|     |                   |       |     |                   |       |     |                   |
8080 --+ HTTP              |      8081 --+ HTTP              |      8082 --+ HTTP              |
|                   |             |                   |             |                   |
|                   |             |                   |             |                   |
|                   |             |                   |             |                   |
10000 --+ Paxos             |     10010 --+ Paxos             |     10020 --+ Paxos             |
|     |                   |       |     |                   |       |     |                   |
10001 --+ PaxosLease        |     10011 --+ PaxosLease        |     10021 --+ PaxosLease        |
|     |                   |       |     |                   |       |     |                   |
10002 --+ Catchup           |     10012 --+ Catchup           |     10022 --+ Catchup           |
|     |                   |       |     |                   |       |     |                   |
|     +-------------------+       |     +-------------------+       |     +-------------------+
|                                 |                                 |
|                                 |                                 |
|                                 |                                 |
----+-------- [replication] ----------+-------- [replication] ----------+-------- [replication] ------

Запуск нод

Создаем каталоги для баз:

$ mkdir /tmp/keyspace/{0..2}

Запускаем демонов:

$ ./bin/keyspaced keyspace.0.conf &amp;
$ ./bin/keyspaced keyspace.1.conf &amp;
$ ./bin/keyspaced keyspace.2.conf &amp;

База данных

$ find /tmp/keyspace/0/
/tmp/keyspace/0/
/tmp/keyspace/0/log.0000000001
/tmp/keyspace/0/keyspace

HTTP интерфейс

Вывод инфомарции о ноде:

$ curl http://localhost:8080
Keyspace v1.9.0
 
Running in replicated mode with 3 nodes
 
I am node 0
 
Master is node 1
 
I am in replication round 2
 
Last replication round was 32 bytes, took 497264 msec, thruput was 1 KB/sec

Установка значения (на мастера)

$ curl 'http://localhost:8081/set?key=testkey&amp;value=testvalue'
OK

Чтение значения (с мастера)

$ curl 'http://localhost:8081/get?key=testkey'
testvalue

Чтение значения (с слейва)

$ curl 'http://localhost:8080/dirtyget?key=testkey'
testvalue
$ curl 'http://localhost:8082/dirtyget?key=testkey'
testvalue

Репликация

Писать можно только в мастер
Читать методом get можно только с мастера
Читать методом dirtyget можно со всех

Если остается одна нода из трех – с неё можно только читать, но мастером она не становится

Каждая нода пишет номер цикла репликации, сравнивая которые можно судить о синхронизации нод.

I am in replication round 29

Интерфейс на Си например сам ищет мастера, для http это надо делать самостоятельно.

Производительность

Скорость записи с sync после каждой операции: 30-35 операций записи в секунду

Проведенный тест db4 подтвердил низкую скорость записи. Псевдокод теста:

dba_open()
for($i=0;$i&lt;=100;$i++) {
dba_replace()
dba_sync()
}
db_close()

Отключение sync после записи приводит к увеличение скорости записи и возможности потери данных при востановлении БД.

Ошибки

При выходе демон подвис и ушел в бесконечный цикл. Strace ничего не показал. ltrace показал:

memcpy(0x7fffebd290ef, "\n", 2)                                                                  = 0x7fffebd290ef vsnprintf("", 4406034, "", 0x1f)                                                                 = 47 memcpy(0x7fffebd290ef, "\n", 2)                                                                  = 0x7fffebd290ef vsnprintf("", 4406034, "", 0x1f)                                                                 = 47 memcpy(0x7fffebd290ef, "\n", 2)                                                                  = 0x7fffebd290ef

Непонятки с базой данных:

$ ./bin/keyspaced keyspace.0.conf  Encountered zero length records while traversing backwards PANIC: DB_RUNRECOVERY: Fatal error, run database recovery PANIC: DB_RUNRECOVERY: Fatal error, run database recovery process-private: unable to find environment Cannot initialize database!

Опять ошибки с базой данных:

DB_LOGC-&gt;get: LSN: 39/9324792: short read
log file auto-remove: Input/output error

И еще:

PANIC: fatal region error detected; run recovery

И еще…:

$ ./bin/keyspaced keyspace.1.conf
Ignoring log file: /dev/shm/keyspace/1/log.0000000019: magic number 29, not 40988
Invalid log file: log.0000000019: Invalid argument
PANIC: Invalid argument
process-private: unable to find environment
Cannot initialize database!

Вывод

  • Отсутствие мастера до 7 секунд (база пребыват в режиме read only)
  • Много багов, продукт еще сырой
  • Быстрая, работающая репликация
  • Хорошая документация
  • Множество готовых интерфейсов, включая HTTP
Tags:

Tor, Polipo

January 15th, 2011 No comments

Задача: научить браузер выходить в Интернет через Tor.

Tor is free software and an open network that helps you defend against a form of network surveillance that threatens personal freedom and privacy, confidential business activities and relationships, and state security known as traffic analysis.

http://www.torproject.org/

Установка Tor:

$  wget http://www.torproject.org/dist/tor-0.2.1.28.tar.gz
$ tar zxvf tor-0.2.1.28.tar.gz 
$ cd tor-0.2.1.28
$ ./configure 
$ make

Запускаем:

$ ./src/or/tor

Проверяем netstat’ом что запустилось:

tcp        0      0 127.0.0.1:9050              0.0.0.0:*                   LISTEN      6212/tor

Теперь на порт 9050 у нас висит sock5 прокси, но т.к. Opera не умеет socks5, поставим еще одну софтинку – polipo:

Polipo is a lightweight caching web proxy that was designed as a personal cache. It is able to cache incomplete objects and will complete them using range requests. It will use HTTP/1.1 pipelining if supported by the remote
server.

Установка:

# yum install polipo

Настройка производится в файле /etc/polipo/config:

daemonise = true
pidFile = /var/run/polipo/polipo.pid
socksParentProxy = "localhost:9050"
socksProxyType = socks5

Запускаем:

# /etc/init.d/polipo start

Проверяем:

# netstat -nap|fgrep polipo
tcp        0      0 127.0.0.1:8123              0.0.0.0:*                   LISTEN      6333/polipo

Осталось указать браузеру использовать HTTP-proxy по адресу 127.0.0.1:8123.

Проверяем, что вышли в сеть через Tor на странице: https://check.torproject.org/

Tags: ,

KVM (Kernel Based Virtual Machine)

January 13th, 2011 No comments

KVM (for Kernel-based Virtual Machine) is a full virtualization solution for Linux on x86 hardware containing virtualization extensions (Intel VT or AMD-V). It consists of a loadable kernel module, kvm.ko, that provides the core virtualization infrastructure and a processor specific module, kvm-intel.ko or kvm-amd.ko. KVM also requires a modified QEMU although work is underway to get the required changes upstream.

Using KVM, one can run multiple virtual machines running unmodified Linux or Windows images. Each virtual machine has private virtualized hardware: a network card, disk, graphics adapter, etc.

The kernel component of KVM is included in mainline Linux, as of 2.6.20.

KVM is open source software.

Проверяем, поддерживает ли процессор аппаратную виртуализацию:

grep vmx /proc/cpuinfo

Устанавливаем пакеты:

# yum install bridge-utils qemu-kvm virt-manager libvirt

Проверяем что модули подгрузились:

# lsmod | fgrep kvm
kvm_intel              45674  0 
kvm                   291811  1 kvm_intel

Запускаем демона:

# /etc/init.d/libvirtd start

Поднимаем br0 интерфейс:

# ifconfig eth0 0.0.0.0
# brctl addbr br0
# brctl addif br0 eth0
# ifconfig br0 192.168.1.200/24

Как настроить бридж для KVM на Red Hat Enterprise Linux 5.4

Не забыть включить форвардинг пакетов:

sysctl net.ipv4.ip_forward=1

И поправить правила iptables:

$ iptables -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT 
$ iptables -t nat -A PREROUTING -d IP/32 -p tcp -m tcp --dport 222 -j DNAT --to-destination 192.168.122.2:22
$ iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j SNAT --to-source IP

Работаем:

# virt-manager
Tags:

IPVS

January 13th, 2011 No comments

IPVS (IP Virtual Server) implements transport-layer load balancing inside the Linux kernel, so called Layer-4 switching. IPVS running on a host acts as a load balancer at the front of a cluster of real servers, it can direct requests for TCP/UDP based services to the real servers, and makes services of the real servers to appear as a virtual service on a single IP address.

Tags:

Keepalived

January 13th, 2011 No comments

keepalived is used for monitoring real servers within a Linux Virtual Server (LVS) cluster. keepalived can be configured to remove real servers from the cluster pool if it stops responding, as well as send a notification email to make the admin aware of the service failure.

In addition, keepalived implements an independent Virtual Router Redundancy Protocol (VRRPv2; see rfc2338 for additional info) framework for director failover.

Tags:

HAProxy

January 13th, 2011 No comments

HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for web sites crawling under very high loads while needing persistence or Layer7 processing. Supporting tens of thousands of connections is clearly realistic with todays hardware.

http://haproxy.1wt.eu/

Tags:

ngx_http_secure_download

January 6th, 2011 No comments

Задача: обеспечить возможность скачивать контент с сервера. только посетителям вашего сайта.

Реализация: использование специальных ссылок, которые содержат ключ и дату протухания.

Модуль к nginx – ngx_http_secure_download

Сборка nginx:

$ cd nginx-0.8.53
$ ./configure --add-module=../ngx_http_secure_download/

Конфиг nginx:

        location /somefolder {
            secure_download on;
            secure_download_secret IAmSalt$remote_addr;
            secure_download_path_mode file;
 
            if ($secure_download = "-1") {
                rewrite /expired.html break;
            }
            if ($secure_download = "-2") {
                rewrite /bad_hash.html break;
            }
            if ($secure_download = "-3") {
                return 500;
            }
 
            rewrite ^(.*)/[0-9a-zA-Z]*/[0-9a-zA-Z]*$ $1 break; // crop all the /hash/time stuff off the url
        }

Генерация ссылки средствами php:

function secure_url($url)
{
  $ts = time() + 3600;
  $ts_in_hex = dechex($ts);
  $secret = 'IAmSalt' . $_SERVER['REMOTE_ADDR'];
  $hash = md5($url . '/' . $secret . '/' . $ts_in_hex);
  return  $url . '/' . $hash . '/' . $ts_in_hex;
}

Использованы материалы статьи: Видеохостинг своими руками

PS: Так же, есть модуль ngx_http_secure_link_module, но у него все ссылки перманентные.

Tags:

Router Advertisement Daemon (radvd)

January 5th, 2011 No comments

Собственно, если подключать IPv6 через tunnelbroker.net, то он выделяет по умолчанию две сети /64. Одну из которых мы задействуем для раздачи IPv6 адресов внутри сети.

Раздавать адреса будем через протокол Stateless Address Autoconfiguration.

Устанавливаем демон radvd и настраиваем его тут /etc/radvd.conf. В настройки надо как минимум прописать интерфейс внутренней сети и префикс ipv6 сети, который будем раздавать.

Сеть должна быть размером /64.

Конфиг:

interface eth0
{
	AdvSendAdvert on;
	MinRtrAdvInterval 30;
	MaxRtrAdvInterval 100;
	prefix 2001:719:1f09:f4::/64
	{
		AdvOnLink on;
		AdvAutonomous on;
		AdvRouterAddr on;
	};
 
};
Tags: ,