50 32 , CTO of Mail Services at - - PowerPoint PPT Presentation

50 32
SMART_READER_LITE
LIVE PREVIEW

50 32 , CTO of Mail Services at - - PowerPoint PPT Presentation

50 32 , CTO of Mail Services at Mail.ru 50 85%


slide-1
SLIDE 1

Как мигрировать 50Пб в 32ПБ

Андрей Сумин, CTO of Mail Services at Mail.ru

slide-2
SLIDE 2

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

50ПБ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15% 85% файлы

slide-3
SLIDE 3

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

slide-4
SLIDE 4

FileDB

slide-5
SLIDE 5

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

slide-6
SLIDE 6

FileDB sha1 counter

slide-7
SLIDE 7

letters index store | |

slide-8
SLIDE 8

letters index store | | delete letter → | | | delete file → | crash

slide-9
SLIDE 9

letters index store | | delete letter → | | | delete file → | crash restore | delete file → | | ← ok | delete letter

slide-10
SLIDE 10

letters index store | | delete letter → | | | delete file → | crash restore | delete file → | | ← ok | delete letter

slide-11
SLIDE 11

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

slide-12
SLIDE 12

counter = 1 magic = 345

slide-13
SLIDE 13

counter = 1 magic = 345

slide-14
SLIDE 14

letters index store | | counter = 1 | | magic = 345 add letter → | | | |

slide-15
SLIDE 15

letters index store | | counter = 1 | | magic = 345 add letter → | | | upload file (sha1, 123) → |

slide-16
SLIDE 16

letters index store | | counter = 1 | | magic = 345 add letter → | | | upload file (sha1, 123) → | 345 + 123 = 468 2

slide-17
SLIDE 17

letters index store | | counter = 1 | | magic = 345 add letter → | | | upload file (sha1, 123) → | 345 + 123 = 468 2 | | remove letter → | | | delete file (sha1, 123) → | 468 – 123 = 345 1

slide-18
SLIDE 18

letters index store | | counter = 1 | | magic = 345 add 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

slide-19
SLIDE 19

letters index store | | counter = 1 | | magic = 345 add 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

slide-20
SLIDE 20

letters index store | | counter = 1 | | magic = 345 add 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

slide-21
SLIDE 21

letters index store | | counter = 1 | | magic = 345 add 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

slide-22
SLIDE 22

FileDB sha1 counter magic flags

slide-23
SLIDE 23

FileDB sha1 counter magic flags IP0 disk0 IP1 disk1

slide-24
SLIDE 24

FileDB sha1 counter magic flags pair_id → IP0 disk0 IP1 disk1

slide-25
SLIDE 25

PairDB id IP0 disk0 IP1 disk1

slide-26
SLIDE 26

PairDB id IP0 disk0 IP1 disk1 flags

slide-27
SLIDE 27

PairDB id IP0 disk0 IP1 disk1 flags free0 free1

slide-28
SLIDE 28

FileDB sha1 20 counter 4 magic 4 flags 4 pair_id 4

slide-29
SLIDE 29

36 (данные)

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

slide-30
SLIDE 30

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

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

slide-31
SLIDE 31

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

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

slide-32
SLIDE 32

36 + 5 + 16 = 57 байт

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

slide-33
SLIDE 33

57 * 12 * 10^9 = 637 GB

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

slide-34
SLIDE 34

12 * 12 * 10^9 = 179GB

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

slide-35
SLIDE 35

637 GB 179 GB

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

slide-36
SLIDE 36

637 GB 179 GB

■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■ 1600 GB

slide-37
SLIDE 37

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

slide-38
SLIDE 38

Loader API

slide-39
SLIDE 39

inc (sha1, magic)

slide-40
SLIDE 40

inc (sha1, magic) upload (sha1, magic)

slide-41
SLIDE 41

inc (sha1, magic) upload (sha1, magic) dec (sha1, magic)

slide-42
SLIDE 42

inc (sha1, magic) upload (sha1, magic) dec (sha1, magic) GET /sha1

slide-43
SLIDE 43

iproto

|sync cmd len|

slide-44
SLIDE 44

iproto

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

slide-45
SLIDE 45

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

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

slide-46
SLIDE 46

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

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

slide-47
SLIDE 47

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

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

slide-48
SLIDE 48

Пара выбрана

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

slide-49
SLIDE 49

Пара выбрана

|--√1--|-------------√2-------------|--√3--|--√4--| Отправляем небольшой файл на эти диски.

slide-50
SLIDE 50

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

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

slide-51
SLIDE 51

nginx + webdav

slide-52
SLIDE 52

loader store | | | PUT (sha1) → |

slide-53
SLIDE 53

loader store loader | | | | PUT (sha1) → | ←PUT (sha1) |

slide-54
SLIDE 54

loader store loader | | | | PUT (sha1) → | ←PUT (sha1) | /60/07/600710b0a5cfa...5a97b98ea355c.inprogress.random.ts | ← 201 | | |

slide-55
SLIDE 55

loader store loader | | | | PUT (sha1) → | ←PUT (sha1) | /60/07/600710b0a5cfa...5a97b98ea355c.inprogress.random.ts | ← 201 | | | | MOVE → | /60/07/600710b0a5cfa...5a97b98ea355c | ← 204 |

slide-56
SLIDE 56

loader store FileDB | | (space0) | PUT (sha1) → | | | ← 201 | | | | | | MOVE → | | | ← 204 | |

slide-57
SLIDE 57

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

slide-58
SLIDE 58

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

slide-59
SLIDE 59

Удаление файла

  • Гарантированно записать файл
  • Быстро отдать файл
  • Держать метаданные консистентными
slide-60
SLIDE 60

Удаление файла

  • Гарантированно записать файл
  • Быстро отдать файл
  • Держать метаданные консистентными

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

slide-61
SLIDE 61

Удаление файла

  • Гарантированно записать файл
  • Быстро отдать файл
  • Держать метаданные консистентными

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

slide-62
SLIDE 62

decrement (sha1, magic)

counter-- current_magic –= magic

slide-63
SLIDE 63

decrement (sha1, magic)

counter-- current_magic –= magic If (counter == 0 && current_magic== 0){ move(sha1, space1) }

slide-64
SLIDE 64

Valkyrie

slide-65
SLIDE 65

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

slide-66
SLIDE 66

Valkyrie FileDB loader | | ← set (sha1) | | | | get ( sha1, space1) → | | ← found ( sha1 ) | | |

slide-67
SLIDE 67

Valkyrie FileDB loader | | ← set (sha1) | | | | get ( sha1, space1) → | | ← found ( sha1 ) | | | | get ( sha1, space0) → | | ← found ( sha1 ) |

slide-68
SLIDE 68

Valkyrie FileDB | | | | | get ( sha1, space1) → | | ← found ( sha1 ) | | | | get ( sha1, space0) → | | ← found ( sha1 ) | rename sha1 → sha1.deleted.ts (карантин)

slide-69
SLIDE 69

Valkyrie FileDB Valkyrie (disk0) | (disk1) | | | | get ( sha1, space1) → | ← | | ← found ( sha1 ) | → | | | | | get ( sha1, space0) → | ← | | ← not found ( sha1 ) | → |

slide-70
SLIDE 70

Valkyrie FileDB Valkyrie (disk0) | (disk1) | | | | get ( sha1, space1) → | ← | | ← found ( sha1 ) | → | | | | | get ( sha1, space0) → | ← | | ← found ( sha1 ) | → | Когда удалять запись из space1?

slide-71
SLIDE 71

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

slide-72
SLIDE 72

Решим кто мастер 600710b0a5cfa...5a97b98ea355c | | | первый бит | 1 | | disk0 disk1

slide-73
SLIDE 73

Разнесем по времени magic (space0) → проверка консистентности magic (space1) → timestamp удаления

slide-74
SLIDE 74

Valkyrie FileDB Valkyrie (master) (space1) (slave) | | | | ← | | | | | | | | | | | | | | | | → | | | ← |

slide-75
SLIDE 75

Valkyrie находит на диске файл sha1: 1. Записи о нем нет в FileDB — на карантин через sha1.deleted.ts

slide-76
SLIDE 76

loader store loader | | | | PUT (sha1) → | ←PUT (sha1) |

slide-77
SLIDE 77

loader store1 store2 loader | | | | | PUT (sha1) → | | ←PUT (sha1) |

slide-78
SLIDE 78

loader store1 FileDB | | (space0) | PUT (sha1) → | | | MOVE → | | | | | increment_or_upload (pair_id1, sha1, magic)→ | loader store2 | PUT (sha1) → | | | MOVE → | | | | | | increment_or_upload (pair_id2, sha1, magic)→ |

slide-79
SLIDE 79

loader store1 FileDB | | (space0) | PUT (sha1) → | | | MOVE → | | | | | increment_or_upload (pair_id1, sha1, magic)→ | loader store2 | PUT (sha1) → | | | MOVE → | | | | | | increment_or_upload (pair_id2, sha1, magic)→ |

slide-80
SLIDE 80

Valkyrie находит на диске файл sha1: 1. Записи о нем нет в FileDB — на карантин через sha1.deleted.ts 2. Запись есть, но указывает на другую пару — проверить на другой паре и удалить

slide-81
SLIDE 81

Valkyrie находит на диске файл sha1: 1. Записи о нем нет в FileDB — на карантин через sha1.deleted.ts 2. Запись есть, но указывает на другую пару — проверить на другой паре и удалить 3. В FileDB запись указывает на текущую пару — сходить HEAD на второй диск, на текущем диске проверить целостность.

slide-82
SLIDE 82

Disk1 — оказался проблемным Disk2 — readonly + размув

slide-83
SLIDE 83

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

50ПБ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15% 85% файлы

slide-84
SLIDE 84

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

50ПБ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 15% 85% файлы 32ПБ 18ПБ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 25% 75% файлы