76
Как мигрировать 50Пб в 32ПБ Андрей Сумин, CTO of Mail Services at Mail.ru Альберт Галимов, руководитель группы Mail.ru

Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

  • Upload
    ontico

  • View
    145

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Как мигрировать 50Пб в 32ПБАндрей Сумин, CTO of Mail Services at Mail.ruАльберт Галимов, руководитель группы Mail.ru

Page 2: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Из чего состоит почта

50ПБ

■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15% 85% файлы

Page 3: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Структура базы

Page 4: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDB

Page 5: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDBsha1 (от содержимого файла)

Page 6: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDBsha1counter

Page 7: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

Page 8: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

delete letter → | || delete file → |

crash

Page 9: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

delete letter → | || delete file → |

crash restore

| delete file → || ← ok |

delete letter

Page 10: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

delete letter → | || delete file → |

crash restore

| delete file → || ← ok |

delete letter

Page 11: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDBsha1countermagic

# в индексах писем лежит sha1 и magic

Page 12: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

counter = 1| |

magic = 345add letter → | |

| upload file (sha1, 123) → | 345 + 123 = 468 2

Page 13: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

counter = 1| |

magic = 345add letter → | |

| upload file (sha1, 123) → | 345 + 123 = 468 2

| |remove letter → | |

| delete file (sha1, 123) → | 468 – 123 = 345 1

Page 14: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

counter = 1| |

magic = 345add letter → | |

| upload file (sha1, 123) → | 345 + 123 = 468 2

| |remove letter → | |

| delete file (sha1, 123) → | 468 – 123 = 345 1

| delete file (sha1, 345) → | 345– 345 = 0 0

Page 15: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

counter = 1| |

magic = 345add letter → | |

| upload file (sha1, 123) → | 345 + 123 = 468 2

| |remove letter → | |

| delete file (sha1, 123) → | 468 – 123 = 345 1 | |

| delete file (sha1, 123) → | 345 – 123 = 222 0

Page 16: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

letters index store| |

counter = 1| |

magic = 345add letter → | |

| upload file (sha1, 123) → | 345 + 123 = 468 2

| |remove letter → | |

| delete file (sha1, 123) → | 468 – 123 = 345 1 | |

| delete file (sha1, 123) → | 345 – 123 = 222 0

| delete file (sha1, 345) → | 222 – 345 = -123 0

Page 17: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDBsha1countermagicflags

Page 18: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDBsha1countermagicflags

IP0 disk0 IP1 disk1

Page 19: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDBsha1countermagicflagspair_id IP0

disk0 IP1 disk1

Page 20: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

PairDBid

IP0 disk0 IP1 disk1

Page 21: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

PairDBid

IP0 disk0 IP1 disk1 flags

Page 22: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

PairDBid

IP0 disk0 IP1 disk1 flagsfree0free1

Page 23: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

FileDBsha1 20counter 4magic 4flags 4pair_id 4

Page 24: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

36 (данные)

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Page 25: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

36 + 5 (длина полей)

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Page 26: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

36 + 5 + 16 (заголовки)

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Page 27: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

36 + 5 + 16 = 57 байт

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Page 28: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

57 * 12 * 10^9 = 637 GB

■■■■■ ……………………… ■■■■■■■

Page 29: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

12 * 12 * 10^9 = 179GB

■■■■■ ……………………… ■■■■■■■

Page 30: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

637 GB179 GB

■■■■■■■■■■■■■■■■■■■■

Page 31: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

637 GB179 GB

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

1600 GB

Page 32: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

PairDB содержит 14000 записей

Page 33: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Loader API

Page 34: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

inc (sha1, magic)

Page 35: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

inc (sha1, magic)

upload (sha1, magic)

Page 36: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

inc (sha1, magic)

upload (sha1, magic)

dec (sha1, magic)

Page 37: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

inc (sha1, magic)

upload (sha1, magic)

dec (sha1, magic)

GET /sha1

Page 38: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

iproto

|sync cmd len|

Page 39: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

iproto

|sync cmd len|flags|origin-len|sha1|magic|

Page 40: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Выбираем пару для заливки файла

|---1---|----------2----------|-----3-----|--------4--------|

Page 41: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Проблема чистой пары

|--1--|-----------------------2-----------------------|--3--|--4--|

Page 42: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Проблема чистой пары

|--√1--|-------------√2-------------|--√3--|--√4--|

Page 43: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Пара выбрана

|--√1--|-------------√2-------------|--√3--|--√4--|

Page 44: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Пара выбрана

|--√1--|-------------√2-------------|--√3--|--√4--|

Отправляем небольшой файл на эти диски.

Page 45: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

|sync cmd len|flags|origin-len|sha1|magic|filecontent.................|

sha1 считаем на лету

Page 46: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

nginx + webdav

Page 47: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store | | | PUT (sha1) |

Page 48: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store loader | | | | PUT (sha1) | PUT (sha1) |

Page 49: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store loader | | | | PUT (sha1) | PUT (sha1) |

/60/07/600710b0a5cfa...5a97b98ea355c.inprogress.random.ts | 201 | | |

Page 50: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store loader | | | | PUT (sha1) | PUT (sha1) |

/60/07/600710b0a5cfa...5a97b98ea355c.inprogress.random.ts | 201 | | | | MOVE |

/60/07/600710b0a5cfa...5a97b98ea355c

| 204 |

Page 51: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store FileDB | | (space0) | PUT (sha1) | |

| 201 | | | | | | MOVE | | | 204 | |

Page 52: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store FileDB | | (space0) | PUT (sha1) | |

| 201 | | | | | | MOVE | | | 204 | | | | | increment_or_upload (sha1, magic) |

Page 53: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store FileDB | | (space0) | PUT (sha1) | | | 201 | | | | | | MOVE | | | 204 | | | | | increment_or_upload (pair_id, sha1, magic) |

loader | increment_or_upload (pair_id, sha1, magic) |

Page 54: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Удаление файла• Гарантированно записать файл

• Быстро отдать файл

• Держать метаданные консистентными

Page 55: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Удаление файла• Гарантированно записать файл

• Быстро отдать файл

• Держать метаданные консистентными

Удалять можно в offline

Page 56: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Удаление файла• Гарантированно записать файл

• Быстро отдать файл

• Держать метаданные консистентными

Удалять можно в offlineПри удалении только уменьшаем счетчик

Page 57: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

decrement (sha1, magic)counter--current –= magic

Page 58: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

decrement (sha1, magic)counter --current –= magic

If (counter == 0 && magic == 0){move(sha1, space1)

}

Page 59: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie

Page 60: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie FileDB | | | | | get ( sha1, space1) | | found ( sha1 ) | | |

Page 61: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie FileDB loader | | set (sha1)

| | | | get ( sha1, space1) | | found ( sha1 ) | | |

Page 62: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie FileDB loader | | set (sha1)

| | | | get ( sha1, space1) | | found ( sha1 ) | | | | get ( sha1, space0) | | found ( sha1 ) |

Page 63: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie FileDB | | | | | get ( sha1, space1) | | found ( sha1 ) | | | | get ( sha1, space0) | | found ( sha1 ) |

rename sha1 sha1.deleted.ts (карантин)

Page 64: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie FileDBValkyrie

(disk0) | (disk1)

| | | | get ( sha1, space1) |

| | found ( sha1 ) |

| | | | | get ( sha1, space0) |

| | not found ( sha1 ) |

|

Page 65: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie FileDBValkyrie

(disk0) | (disk1)

| | | | get ( sha1, space1) |

| | found ( sha1 ) |

| | | | | get ( sha1, space0) |

| | found ( sha1 ) |

|

Когда удалять запись из space1?

Page 66: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Решим кто мастер

Page 67: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Решим кто мастер

600710b0a5cfa...5a97b98ea355c| || первый бит |0 1| |

disk0 disk1

Page 68: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Разнесем по времени

magic (space0) проверка консистентности

magic (space1) timestamp удаления

Page 69: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie FileDBValkyrie

(master) (space1) (slave)

| | | | | | | | | | | | | | | | | | | | | | | |

Page 70: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie находит на диске файл sha1:

1. Записи о нем нет в FileDB — на карантин через sha1.deleted.ts

Page 71: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

loader store FileDB | | (space0) | PUT (sha1) | | | 201 | | | | | | MOVE | | | 204 | | | | | increment_or_upload (pair_id, sha1, magic) |

loader | increment_or_upload (pair_id, sha1, magic) |

Page 72: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie находит на диске файл sha1:

1. Записи о нем нет в FileDB — на карантин через sha1.deleted.ts

2. Запись есть, но указывает на другую пару — проверить на другой паре и удалить

Page 73: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Valkyrie находит на диске файл sha1:

1. Записи о нем нет в FileDB — на карантин через sha1.deleted.ts

2. Запись есть, но указывает на другую пару — проверить на другой паре и удалить

3. В FileDB запись указывает на текущую пару — сходить HEAD на второй диск, на текущем диске проверить целостность.

Page 74: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Disk1 — оказался проблемным

Disk2 — readonly + размув

Page 75: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Из чего состоит почта

50ПБ

■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15% 85% файлы

Page 76: Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Mail.ru)

Из чего состоит почта

50ПБ

■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15% 85% файлы

32ПБ 18ПБ

■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 25% 75% файлы