Распределенное файловое хранилище (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 - 0...
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/... ->  pr...
Result?
2+2=4, 2+2=4, 2+2=4, … ! CPU Cache?
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: ...
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
Приоритеты выбора решения <ul><li>Надежность / избыточность хранения
Производительность чтения и записи
Возможность распределения нагрузки
Потенциальная масштабируемость
Стандартные аппаратные компоненты
Простота в настройке и обслуживании </li></ul>
Традиционная работа с диском Имя <=> объект (inode) объект <=> LBA тома LBA тома <=> LBA RAID LBA RAID <=> LBA диска Файло...
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 ( ...
Наше хранилище — 6TB / 2U mirror raidz1 raidz1 raidz1 stripe spare 2U:  2 x 500MB + 10 x 1TB, SATA-2
Upcoming SlideShare
Loading in...5
×

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

1,075

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,075
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Распределенное файловое хранилище (Nginx, Perl, ZFS) Mons Anderson Олег Мамонтов
  2. 2. NAS, SAN or custom? SAN: FC/iSCSI NAS: NFS/CIFS/... Custom: *
  3. 3. Что нам нужно? – отдавать данные – по протоколу HTTP
  4. 4. HTTP это nginx ;)
  5. 5. Что нам нужно? User -> nginx -> SAN ? User -> nginx -> NAS ? User -> nginx -> nginx ?
  6. 6. Стоимость решений Nginx: $ NAS: $$ SAN: $$$$$$$
  7. 7. Наше хранилище 8 U, 24Tb 4 x ( 2U, 6Tb ( 2+10 Tb raw ) 4 x redundancy for each file
  8. 8. Что нам нужно от хранилища? CRUD! ( C reate, R ead, U pdate, D elete )
  9. 9. Что нам нужно от хранилища? Read -> HTTP C, U, D -> ?
  10. 10. Что нам нужно от хранилища? Read -> HTTP C, U, D -> HTTP!
  11. 11. WebDAV – Простой – Прозрачный – Поддерживаемый в nginx* – Легко реализуемый
  12. 12. * WebDAV + ACL Patch: – X-ACL: 0644 – X-Time: 1234567890
  13. 13. Step by step: Front
  14. 14. Front
  15. 15. Front
  16. 16. Front
  17. 17. Storage N Tb = storage N/2 storage N/2
  18. 18. Storage N Tb hash storage storage
  19. 19. Storage N Tb hash storage storage
  20. 20. Storage hash storage storage storage storage
  21. 21. Storage hash storage storage storage storage
  22. 22. Resizer hash storage storage storage image_filter() storage image_filter()
  23. 23. Resizer hash Low CPU storage storage storage image_filter() storage image_filter()
  24. 24. Resizer storage storage storage storage Resize Resize Resize
  25. 25. Hashing ? Hash storage storage storage storage Resize Resize Resize
  26. 26. Hashing ScaleHash(time,id) storage storage storage storage Resize Resize Resize
  27. 27. Hashing URL: http://…/ObjectID ObjectID = (xxx)-(xxx)-… ID Time
  28. 28. Hashing Timeline past upgrade over future start a b d c 0x0010 0x00FF 0x02FF 0x0FFF e 0x0000
  29. 29. Hashing TimeHash(Time) { 0x0000 - 0x00FF -> [ a, b ] 0x00FF - 0x02FF -> [ a, c, d ] 0x02FF - 0x0FFF -> [ c, d ] 0x0FFF - 0xFFFF -> [ f ] } -> groups
  30. 30. Hashing IDHash(ID, groups) -> group
  31. 31. Hashing TimeHash(const Time) = const IDHash(const ID, groups) = const
  32. 32. Access Control DB Perl: - AnyEvent::HTTPD - AnyEvent::HTTP - AnyEvent::DBI storage storage group
  33. 33. Access Control: Public object -> GET /XXX Perl handler (check perms) ← 200 OK
  34. 34. 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
  35. 35. Result?
  36. 36. 2+2=4, 2+2=4, 2+2=4, … ! CPU Cache?
  37. 37. Cache…
  38. 38. Cache is a problem :(
  39. 39. /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
  40. 40. Combine? MEM CPU HDD
  41. 41. Combined! Money are saved :) Deployed on same hosts Full resource consumption
  42. 42. Combined, but scalable! Cache cluster Resize cluster Storage cluster + MEM + CPU + HDD
  43. 43. Create, Update, Delete? PUT DELETE OPTIONS GET GET storage storage
  44. 44. Temporary loss PUT DELETE OPTIONS GET GET storage storage
  45. 45. Flashing error GET GET storage storage
  46. 46. No file? Ask a friend! GET GET 404 fallback proxy_pass storage storage
  47. 47. 404 Fallback: avoiding recursion GET ask next… unless asked storage storage
  48. 48. 404 Fallback Just... proxy_next_upstream http_404 storage storage
  49. 49. Again about PUT PUT storage storage
  50. 50. How about single PUT? PUT DELETE OPTIONS ZFS «replication» storage storage
  51. 51. Приоритеты выбора решения <ul><li>Надежность / избыточность хранения
  52. 52. Производительность чтения и записи
  53. 53. Возможность распределения нагрузки
  54. 54. Потенциальная масштабируемость
  55. 55. Стандартные аппаратные компоненты
  56. 56. Простота в настройке и обслуживании </li></ul>
  57. 57. Традиционная работа с диском Имя <=> объект (inode) объект <=> LBA тома LBA тома <=> LBA RAID LBA RAID <=> LBA диска Файловая система Файловая система Менеджер томов RAID контроллер Дисковые устройства
  58. 58. Rampant layering violation ;) Файловая система (zfs) Модель агрегации (zpool) Дисковые устройства
  59. 59. stripe / mirror / raidz / ? stripe – быстро , дешево , ненадежно mirror – быстро , надежно , дорого raidz – относительно надежно , недорого , медленно :(
  60. 60. Универсального решения нет :( Конфигурация Объем, 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
  61. 61. Наше хранилище — 6TB / 2U mirror raidz1 raidz1 raidz1 stripe spare 2U: 2 x 500MB + 10 x 1TB, SATA-2
  62. 62. Будущее уже наступило! snapshot – мгновенный снимок ( cow - быстро, дешево ) rollback – откат файловой системы на заданный снимок clone – “альтернативная реальность” ( ветка из снимка ) send – дамп снимка ( полный или разностный) receive – воссоздание снимка из дампа
  63. 63. “ Почти” репликация <ul><li>Создание мгновенного снимка ( snapshot )
  64. 64. Получение инкрементального дампа ( send )
  65. 65. Пересылка дампа на целевую машину ( socketpipe )
  66. 66. Восстановление дампа на целевой машине ( receive )
  67. 67. Создание клона файловой системы ( clone )
  68. 68. Переустановка символической ссылки ( link -fhs )
  69. 69. sleep && goto п.1; </li></ul>
  70. 70. Неочевидные нюансы <ul><li>Зачем нужны клоны и символические ссылки?
  71. 71. Удаление старых снимков и клонов
  72. 72. Минимизация лага репликации
  73. 73. Мониторинг актуальности
  74. 74. Уникальные имена файлов при обновлениях
  75. 75. Двухуровневое кеширование </li></ul>
  76. 76. © 2011 Mons Anderson <mons@cpan.org> Олег Мамонтов <lonerr@cpan.org> Рамблер Интернет Холдинг
  77. 77. ?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×