распределенное файловое хранилище (nginx, zfs, perl)....

Post on 04-Dec-2014

1.921 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Распределенноефайловоехранилище(Nginx, Perl, ZFS)

Mons AndersonОлег Мамонтов

Mons AndersonОлег Мамонтов

NAS, SAN or custom?

SAN: FC/iSCSINAS: NFS/CIFS/...Custom: *

Mons AndersonОлег Мамонтов

Что нам нужно?

– отдавать данные– по протоколу HTTP

Mons AndersonОлег Мамонтов

HTTP это nginx ;)

Mons AndersonОлег Мамонтов

Что нам нужно?

User → nginx → SAN ?User → nginx → NAS ?User → nginx → nginx ?

Mons AndersonОлег Мамонтов

Стоимость решений

Nginx: $NAS: $$SAN: $$$$$$$

Mons AndersonОлег Мамонтов

Наше хранилище

8 U, 24Tb4 x ( 2U, 6Tb ( 2+10 Tb raw )

4 x redundancyfor each file

Mons AndersonОлег Мамонтов

Что нам нужно от хранилища?

CRUD!(Create, Read, Update, Delete )

Mons AndersonОлег Мамонтов

Что нам нужно от хранилища?

Read → HTTPC, U, D → ?

Mons AndersonОлег Мамонтов

Что нам нужно от хранилища?

Read → HTTPC, U, D → HTTP!

Mons AndersonОлег Мамонтов

WebDAV

– Простой– Прозрачный– Поддерживаемый в nginx*– Легко реализуемый

Mons AndersonОлег Мамонтов

* WebDAV + ACL

Patch:– X-ACL: 0644– X-Time: 1234567890

Mons AndersonОлег Мамонтов

Step by step: Front

nginx

Mons AndersonОлег Мамонтов

nginx

Front

Mons AndersonОлег Мамонтов

Front

nginx

nginxC

AR

P

Mons AndersonОлег Мамонтов

Front

nginx

nginxC

AR

P

Mons AndersonОлег Мамонтов

Storage

storageN/2

storageN/2

N Tb =

Mons AndersonОлег Мамонтов

Storage

storage

storage

N Tb

Front hash

Mons AndersonОлег Мамонтов

Storage

storage

storage

N Tb

Front hash

Mons AndersonОлег Мамонтов

storage

storage

Storage

storage

storage

Front hash

Mons AndersonОлег Мамонтов

storage

storage

Storage

storage

storage

Front hash

Mons AndersonОлег Мамонтов

storage

storage

Resizer

storageimage_filter()

storageimage_filter()

Front hash

Mons AndersonОлег Мамонтов

storage

storage

Resizer

storageimage_filter()

storageimage_filter()

Front hashLowCPU

Mons AndersonОлег Мамонтов

storage

storage

Resizer

storage

storage

FrontResize

ResizeResize

Mons AndersonОлег Мамонтов

storage

storage

Hashing

storage

storage

Front HashResize

ResizeResize ?

Mons AndersonОлег Мамонтов

storage

storage

Hashing

storage

storage

ResizeResize

ResizeScaleHash(time,id)

Mons AndersonОлег Мамонтов

Hashing

URL: http://…/ObjectIDObjectID = (xxx)-(xxx)-…

ID Time

Mons AndersonОлег Мамонтов

Hashinga

bdc

0x00

10

0x00

FF

0x02

FF

0x0F

FF Timeline

e

past upgrade over futurestart

0x00

00

Mons AndersonОлег Мамонтов

Hashing

TimeHash(Time) {0x0000 - 0x00FF � [ a, b ]0x00FF - 0x02FF � [ a, c, d ]0x02FF - 0x0FFF � [ c, d ]0x0FFF - 0xFFFF � [ f ]

} � groups

Mons AndersonОлег Мамонтов

Hashing

IDHash(ID, groups) � group

Mons AndersonОлег Мамонтов

Hashing

TimeHash(const Time) = constIDHash(const ID, groups) = const

Mons AndersonОлег Мамонтов

Access Control

ACLDstorage

storagegroup ACLD

DB

ID

Perl:- AnyEvent::HTTPD- AnyEvent::HTTP- AnyEvent::DBI

Mons AndersonОлег Мамонтов

Access Control: Public object

→ GET /XXXPerl handler (check perms)

← 200 OK

Mons AndersonОлег Мамонтов

Access Control: Protected object� GET /XXX� Perl handler

� X-Accel-Redirect: /access/...� GET /access/...� proxy_pass http://ACLD � X-Accel-Redirect: /int/..� GET /int/..

� � 200 OK

Mons AndersonОлег Мамонтов

Front

Result?

Front Resize Storage ACL

Mons AndersonОлег Мамонтов

Front

2+2=4, 2+2=4, 2+2=4, …

Front Resize Storage ACL!CPU

Cache?

Mons AndersonОлег Мамонтов

Front

Cache…

Front Cache Resize Storage ACL

Mons AndersonОлег Мамонтов

Front

Cache is a problem :(

Front Cache Resize Storage ACL

Mons AndersonОлег Мамонтов

/cacheproxy://resize

/source/?q=/i/AxB

/iproxy://store

resize()

/internal200 OK

/iproxy:

//storage

/i/AxB

/iproxy://cache

/i/AxB /sourcehandler()

XAccel: /cache/i/AxB+(mtime:ctime:status)

/i/AxB+

/source/?q=/i/AxB

cachestore

200 OK HIT

/sourcehandler()

/source/?q=/i/AxB+

/source/?q=/i/AxB+

XAccel: /int

200 OK200 OK200 OK

Front Cache Resize Storage ACLD

Mons AndersonОлег Мамонтов

Front

Combine?

Front Cache Resize Storage ACL

MEM CPU HDD

Mons AndersonОлег Мамонтов

Front

Combined! Money are saved :)

Front Cache Resize Storage ACL

Deployed on same hosts

Full resource consumption

Mons AndersonОлег Мамонтов

Front

Combined, but scalable!

Front Cache Resize Storage ACL

Cachecluster

Cache Resize Storage+

MEM+

CPU+

HDD

Resizecluster

Storagecluster

Mons AndersonОлег Мамонтов

Create, Update, Delete?Storage group

storage

storage

PUTDELETEOPTIONS

GET

GET

Mons AndersonОлег Мамонтов

Temporary lossStorage group

storage

storage

PUTDELETEOPTIONS

GET

GET

Mons AndersonОлег Мамонтов

Flashing errorStorage group

storage

storage

GET

GET

Mons AndersonОлег Мамонтов

No file? Ask a friend!Storage group

storage

storage

GET

GET

404fallback proxy_pass

Mons AndersonОлег Мамонтов

404 Fallback: avoiding recursionStorage group

storage

storage

GET ask next…

unlessasked

Mons AndersonОлег Мамонтов

404 FallbackStorage group

storage

storage

Just...

proxy_next_upstream http_404

Mons AndersonОлег Мамонтов

Again about PUTStorage group

storage

storage

PUT

Mons AndersonОлег Мамонтов

How about single PUT?Storage group

storage

storage

PUTDELETEOPTIONS

ZFS«replication»

Mons AndersonОлег Мамонтов

Приоритеты выбора решения● Надежность / избыточность хранения

● Производительность чтения и записи

● Возможность распределения нагрузки

● Потенциальная масштабируемость

● Стандартные аппаратные компоненты

● Простота в настройке и обслуживании

Mons AndersonОлег Мамонтов

Традиционная работа с дискомФайловая система

Файловая система

Менеджер томов

RAID контроллер

Дисковые устройства

Имя <=> объект (inode)

объект <=> LBA тома

LBA тома <=> LBA RAID

LBA RAID <=> LBA диска

Mons AndersonОлег Мамонтов

Rampant layering violation ;)

Файловая система (zfs)

Модель агрегации (zpool)

Дисковые устройства

Mons AndersonОлег Мамонтов

stripe / mirror / raidz / ?

stripe – быстро, дешево, ненадежно

mirror – быстро, надежно, дорого

raidz – относительно надежно, недорого, медленно :(

Mons AndersonОлег Мамонтов

Универсального решения нет :(

Конфигурация Объем, GB IOPS

stripe 1 x 100 10000 20000

mirror 2 x 50 5000 20000

raidz 1 x ( 99 + 1 ) 9900 200

raidz 5 x ( 19 + 1 ) 9500 1000

raidz 33 x ( 2 + 1 ) 6600 6600

Дано: 100 дисков по 100GB, 200 IOPS

Mons AndersonОлег Мамонтов

Наше хранилище — 6TB / 2U2U: 2 x 500MB + 10 x 1TB, SATA-2

mirror raidz1 raidz1 raidz1

stripe

spare

Mons AndersonОлег Мамонтов

Будущее уже наступило!

snapshot

мгновенный снимок

(cow - быстро, дешево)

Mons AndersonОлег Мамонтов

Будущее уже наступило!

rollback

откат файловой системы

на заданный снимок

Mons AndersonОлег Мамонтов

Будущее уже наступило!

clone

“альтернативная реальность”

(ветка из снимка)

Mons AndersonОлег Мамонтов

Будущее уже наступило!

send

дамп снимка

(полный или разностный)

Mons AndersonОлег Мамонтов

Будущее уже наступило!

receive

воссоздание

снимка из дампа

Mons AndersonОлег Мамонтов

“Почти” репликация1. Создание мгновенного снимка (snapshot)2. Получение инкрементального дампа (send)3. Пересылка дампа на целевую машину (socketpipe)4. Восстановление дампа на целевой машине (receive)5. Создание клона файловой системы (clone)6. Переустановка символической ссылки (link -fhs)7. sleep && goto п.1;

Mons AndersonОлег Мамонтов

Неочевидные нюансы

Зачем нужны клоны и символические ссылки?

Mons AndersonОлег Мамонтов

Неочевидные нюансы

Удаление старыхснимков и клонов

Mons AndersonОлег Мамонтов

Неочевидные нюансы

● Минимизация лага репликации

● Мониторинг актуальности

● Уникальные имена файлов при обновлениях

● Двухуровневое кеширование

Mons AndersonОлег Мамонтов

© 2011Mons Anderson <mons@cpan.org>

Олег Мамонтов <lonerr@cpan.org> Рамблер Интернет Холдинг

Mons AndersonОлег Мамонтов

?

top related