ݺߣ

ݺߣShare a Scribd company logo
Распределенное файловое хранилище (Nginx, Perl, ZFS) Mons Anderson Олег Мамонтов
NAS, SAN or custom? SAN: FC/iSCSI NAS: NFS/CIFS/... Custom: *
Что нам нужно? –  отдавать данные –  по протоколу HTTP
HTTP это  nginx  ;)
Что нам нужно? User -> nginx -> SAN ? User -> nginx -> NAS ? User -> nginx -> nginx ?
Стоимость решений Nginx: $ NAS: $$ SAN: $$$$$$$
Наше хранилище 8 U, 24Tb 4 x ( 2U, 6Tb ( 2+10 Tb raw ) 4 x redundancy for each file
Что нам нужно от хранилища? CRUD! ( C reate,  R ead,  U pdate,  D elete )
Что нам нужно от хранилища? Read -> HTTP C, U, D -> ?
Что нам нужно от хранилища? Read -> HTTP C, U, D ->  HTTP!
WebDAV –  Простой –  Прозрачный –  Поддерживаемый в  nginx* –  Легко реализуемый
* WebDAV + ACL Patch: –  X-ACL: 0644 –  X-Time: 1234567890
Step by step: Front
Front
Front
Front
Storage N Tb =  storage N/2 storage N/2
Storage N Tb hash storage storage
Storage N Tb hash storage storage
Storage hash storage storage storage storage
Storage hash storage storage storage storage
Resizer hash storage storage storage image_filter() storage image_filter()
Resizer hash Low CPU storage storage storage image_filter() storage image_filter()
Resizer storage storage storage storage Resize Resize Resize
Hashing ? Hash storage storage storage storage Resize Resize Resize
Hashing ScaleHash(time,id) storage storage storage storage Resize Resize Resize
Hashing URL: http://…/ObjectID ObjectID = (xxx)-(xxx)-… ID Time
Hashing Timeline past upgrade over future start a b d c 0x0010 0x00FF 0x02FF 0x0FFF e 0x0000
Hashing TimeHash(Time) { 0x0000 - 0x00FF -> [ a, b ] 0x00FF - 0x02FF -> [ a, c, d ] 0x02FF - 0x0FFF -> [ c, d ] 0x0FFF - 0xFFFF -> [ f ] } -> groups
Hashing IDHash(ID, groups) -> group
Hashing TimeHash(const Time) = const IDHash(const ID, groups) = const
Access Control DB Perl: - AnyEvent::HTTPD - AnyEvent::HTTP - AnyEvent::DBI storage storage group
Access Control: Public object -> GET /XXX Perl handler (check perms) ← 200 OK
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
Result?
2+2=4, 2+2=4, 2+2=4, … ! CPU Cache?
䲹…
Cache is a problem :(
/cache proxy: //resize /source/ ?q=/i/AxB /i proxy://store resize() /internal 200 OK /i proxy: //storage /i/AxB /i proxy: //cache /i/AxB /source handler() XAccel: /cache/i/AxB+ (mtime:ctime:status) /i/AxB+ /source/ ?q=/i/AxB cache store 200 OK HIT /source handler() /source/ ?q=/i/AxB+ /source/ ?q=/i/AxB+ XAccel: /int 200 OK 200 OK 200 OK
Combine? MEM CPU HDD
Combined! Money are saved :) Deployed on same hosts Full resource consumption
Combined, but scalable! Cache cluster Resize cluster Storage cluster + MEM + CPU + HDD
Create, Update, Delete? PUT DELETE OPTIONS GET GET storage storage
Temporary loss PUT DELETE OPTIONS GET GET storage storage
Flashing error GET GET storage storage
No file? Ask a friend! GET GET 404 fallback  proxy_pass storage storage
404 Fallback: avoiding recursion GET ask  next… unless asked storage storage
404 Fallback Just... proxy_next_upstream  http_404 storage storage
Again about PUT PUT storage storage
How about single PUT? PUT DELETE OPTIONS ZFS «replication» storage storage
Приоритеты выбора решения Надежность / избыточность хранения
Производительность чтения и записи
Возможность распределения нагрузки
Потенциальная масштабируемость
Стандартные аппаратные компоненты
Простота в настройке и обслуживании
Традиционная работа с диском Имя <=> объект (inode) объект <=> LBA тома LBA тома <=> LBA RAID LBA RAID <=> LBA диска Файловая система Файловая система Менеджер томов RAID контроллер Дисковые устройства
Rampant layering violation  ;) Файловая система (zfs) Модель агрегации (zpool) Дисковые устройства
stripe / mirror / raidz / ? stripe  –  быстро ,  дешево ,  ненадежно mirror  –  быстро ,  надежно ,  дорого raidz  –  относительно  надежно ,  недорого ,  медленно :(
Универсального решения нет :( Конфигурация Объем, 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
Наше хранилище — 6TB / 2U mirror raidz1 raidz1 raidz1 stripe spare 2U:  2 x 500MB + 10 x 1TB, SATA-2

More Related Content

распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2