распределенное файловое хранилище (Nginx, zfs, perl)....
-
Upload
rit2011 -
Category
Technology
-
view
1.927 -
download
4
description
Transcript of распределенное файловое хранилище (Nginx, zfs, perl)....
Распределенноефайловоехранилище(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 <[email protected]>
Олег Мамонтов <[email protected]> Рамблер Интернет Холдинг
Mons AndersonОлег Мамонтов
?