Сторадж отказоуйстойчивый создай ты!

Submitted by Iliya Sharov on Sun, 09/18/2011 - 16:24

Use the force, Luke!(c)

В этом кратком HOWTO описано, как быстро поднять маленький отказоустойчивый сервис на базе Elliptics.
Предположим, что у нас есть две машины, на которых мы хотим надежно хранить бесценные данные - фотографии маленького домашнего хомячка.
Они находятся в сети класса C и имеют ip-адреса 192.168.0.100, 192.168.0.101. Машинки доступны друг другу по сети и имеют доступ в интернет.
Попробуем реализовать такую схему на базе Elliptics.
Для этого нам понадобятся:
1) Не менее двух машинок с Ubuntu 10.04 (или любые другие, если вы готовы собирать библиотеки самостоятельно).
2) Пара подключенныp ppa-репозитариев.
3) Немного времени и желания.
Поехали!
Общие пакеты
Для начала нам надо подключить ppa-репозитарий с пакетами:

deb http://ppa.launchpad.net/eightn/elliptics/ubuntu lucid main
deb-src http://ppa.launchpad.net/eightn/elliptics/ubuntu lucid main
deb http://ppa.launchpad.net/berekuk/ubic/ubuntu lucid main
deb-src http://ppa.launchpad.net/berekuk/ubic/ubuntu lucid main

В качестве системы start/stop/watchdog скриптов будем использовать ubic - демон.
Для конфигурирования одной из нод elliptics-стораджа, ставим пакет config-elliptics-node - все остальное он притянет по зависимостям.

apt-get update; apt-get install config-elliptics-node

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

apt-get install snappy eblob elliptics-2.10 fastcgi-daemon2-init fastcgi-daemon2 libfastcgi-
daemon2 libfastcgi2-syslog libfastcgi2-statistics libfastcgi2-request-cache elliptics-fastcgi

Настройка стораджа
После установки пакета появляется папка /etc/elliptics. Создадим в ней файлик masters.id и group.id
Первый из них указывает несколько живых нод стораджа (в общем и целом - достаточно одной живой), через которые остальные ноды будут получать свои таблицы маршрутизации.
Плюс порт (1025 - если на одной машине запущена одна нода, дальше порты идут по возрастанию - 1026,1027...)

cat /etc/elliptics/masters.id
192.168.0.100:1025
192.168.0.101:1025

Количество групп по сути означает количество копий вашего файла (есть и другие варианты, но об этом - в следующей серии). В нашем случае пишем на первой машинке группу "1", на второй - группу "2"

cat /etc/elliptics/group.id
1

Файлы masters.id на обеих наших машинках идентичны.
Файлы groups.id на первой машине содержат циферку 1, на второй - циферку 2.
Создадим папку для первой ноды стораджа на первой машине и запустим elliptucs

mkdir -p /srv/storage/1/kdb

(если нужно несколько нод в рамках одной машины, то аналогичным образом делаем директории 2,3,...)
Проверим, что ubic увидел сконфигурированную ноду:

# ubic status
elliptics
elliptics.1 off

И запустим ноду:

# ubic start elliptics.1
Starting elliptics.1... started

Проверить состояние сервиса можно командой:

# ubic status
elliptics
elliptics.1 running
ubic
ubic.ping running (pid 798)
ubic.update running (pid 801)
ubic.watchdog running (pid 804)

Hint: Поменять root_path и другие параметры запуска стораджа можно в конфиге /etc/elliptics/elliptics.conf
Ура, сторадж настроен. Переходим к настройке http-прокси к elliptics (через которую мы будем читать и писать данные по http)
Установка http-прокси к elliptics
Устанавливаем метапакет с проксей:

apt-get install config-elliptics-proxy

Создаем в директории /etc/elliptics/ файл masters.id.xml
Его содержимое и назначение аналогично masters.id (и чуть позже мы избавимся от дублирования конфигурации).
Количество групп (1я и 2я) пока захардкожены в конфиге прокси - /etc/fastcgi2/available/elliptics.conf - можно поправить или подождать, когда этот файл тоже станет гибко конфигурируемым.
В нашем случае файл masters.id.xml должен выглядеть так (обратите вниманием, что после номера порта тут следует :2 - это признак ipv4 протокола)

192.168.0.100:1025:2
192.168.0.101:1025:2


Проверяем, что ubic увидел проксю:

# ubic status
elliptics
elliptics.1 running
fastcgi-daemon2
fastcgi-daemon2.elliptics off
ubic
ubic.ping running (pid 798)
ubic.update running (pid 801)
ubic.watchdog running (pid 804)

И запускаем ее:

# ubic start fastcgi-daemon2.elliptics
Starting fastcgi-daemon2.elliptics... [Sat Sep 17 17:35:14 2011] starting fastcgi daemon elliptics
started

Проверяем, что все хорошо:

# ubic status
elliptics
elliptics.1 running
fastcgi-daemon2
fastcgi-daemon2.elliptics running
ubic
ubic.ping running (pid 798)
ubic.update running (pid 801)
ubic.watchdog running (pid 804)

Nginx у нас уже стартовал (в postinst-скрипте из метапакета config-elliptics-proxy). Если он не стартовал, то fastcgi-прокся, хоть и запустится, будет возвращать "broken" на проверку ubic status. Ее работоспособность проверяется убиком посредством http запроса /ping на http://localhost:81/ping
Тем не менее убедимся, что все работает:

# curl -v http://localhost:81/ping
* About to connect() to localhost port 81 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 81 (#0)
> GET /ping HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: localhost:81
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/0.7.65
< Date: Sat, 17 Sep 2011 13:37:37 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
* Connection #0 to host localhost left intact
* Closing connection #0

Все хорошо.
Теперь попробуем залить файлы, предварительно их создав:

echo "file01" >file1.txt
echo "file02" >file2.txt
echo "file03" >file3.txt

Чтение и запись у нас разнесено по разным портам: для чтения используется порт 80, для записи - 8080.
Запишем файл под именем "testfile1", в качестве записываемой информации используем данные из file1.txt.

wget -O - -S --post-file file1.txt http://localhost:8080/upload/testfile1
--2011-09-17 17:40:04-- http://localhost:8080/upload/testfile1
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:8080... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Server: nginx/0.7.65
Date: Sat, 17 Sep 2011 13:40:04 GMT
Connection: close
Length: unspecified
Saving to: `STDOUT'

[<=> ] 0 --.-K/s <?xml version="1.0" encoding="utf-8"?>

2
[ <=> ] 552 --.-K/s in 0s

2011-09-17 17:40:04 (122 MB/s) - written to stdout [552]

Теперь считаем этот файл:

curl http://localhost:80/get/testfile1
file01

Кроме получения данных по имени, можно воспользоваться ручкой download-info, которая покажет, где лежит файл:

curl http://localhost:80/download-info/testfile1
<?xml version="1.0" encoding="utf-8"?>test/1/71fe/71fed21f9d7c1874fb73c85271cede18561263459cd8709fb93427a7fcb83e92b14ed35804335d75563ebf16de926dd73f3f8ec9bff2bca7e0ac8abf309c43eb4e74a3d699bb20649fc5b8284bef3d1125b527e2

Полученный вывод показывает, что файл лежит по определенному пути. Сейчас нам эта информация не нужна, ибо актуальна только для файлового бекенда, а мы используем - blob-овый.
Еще можно удалить файл:

curl http://localhost:8080/delete/testfile1


curl -v http://localhost:80/get/testfile1
* About to connect() to localhost port 80 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /get/testfile1 HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: localhost
> Accept: */*
>
< HTTP/1.1 404 Not found
< Server: nginx/0.7.65
< Date: Sat, 17 Sep 2011 13:46:03 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
* Connection #0 to host localhost left intact
* Closing connection #0

В том случае, поднят прокси на 192.168.0.101 - мы можем попробовать выключить машинку 192.168.0.100 и забрать файл со второй машины.
Вот так наша фотография любимого хомячка закачивается и скачивается.
Ну, во всяком случае, должна. ;-)
В последующих статьях мы узнаем:
1) Как восстанавливать файлы, если одна из копий погибла безвозвратно
2) Как добавлять новые машины в группу и какие подводные камни нас ожидают.
3) Как оптимально сконфигурировать сторадж под конкретную задачу.
4) Какие способы хранения данных имеет сторадж.
5) Yet another way для настройки elliptics-proxy-fastcgi.
... и многое другое
Оставайтесь с нами на волнах elliptics.ru! ;)

Добрый день! А как бы

Добрый день!
А как бы получить обещанные в статье следующие пункты?

1) Как восстанавливать файлы, если одна из копий погибла безвозвратно
2) Как добавлять новые машины в группу и какие подводные камни нас ожидают.
3) Как оптимально сконфигурировать сторадж под конкретную задачу.

Небольшая поправка:

Небольшая поправка: пожалуйста, не называйте ubic "демоном".
Его можно называть service manager'ом, хотя я не знаю, как это некоряво перевести на русский.