Top Banner
Вы решили написать собственное хранилище данных Илья Космодемьянский
27

Вы решили написать собственное хранилище, Илья Космодемьянский

Dec 14, 2014

Download

Technology

Fuenteovejuna

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Вы решили написать собственное хранилище, Илья Космодемьянский

Вы  решили  написать  собственное  хранилище  данных  

Илья  Космодемьянский  

Page 2: Вы решили написать собственное хранилище, Илья Космодемьянский

Данные  

•     Традиционно  хранят  в  СУБД  •     Данные  нужно  хранить  надежно  •     С  данными  нужно  производить  действия:  CRUD  •     CR  –  «просто»,  UD  –  «сложно»  •     Хранилища  данных  имеют  специализацию  

Page 3: Вы решили написать собственное хранилище, Илья Космодемьянский

Зачем  писать  свое  хранилище?  Распростарненные  случаи  

•     «Делали  на  MySQL,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     Уперлись  в  мастер  •     Медленные  join’ы  

•   «И  вообще  все  криво»  •   «Хотим  искать  максимальную  клику  графа  и  чтоб  нам  за  это  ничего  не  было»  

Page 4: Вы решили написать собственное хранилище, Илья Космодемьянский

Зачем  писать  свое  хранилище?  Распростарненные  случаи  

•     «Делали  на  MySQL,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     «Делали  на  Postgres,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     «Не  репликация  а  черти  что»  •     «Не  смогли  научить  использовать  правильный  индекс»  •     «И  вообще  все  криво»  •     «Хотим  найти  все  циклы  в  произвольном  графе  и  чтобы              нам  за  это  ничего  не  было»  

Page 5: Вы решили написать собственное хранилище, Илья Космодемьянский

Зачем  писать  свое  хранилище?  Распростарненные  случаи  

•     «Делали  на  MySQL,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     «Делали  на  Postgres,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  •     «Делали  на  Oracle,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     «Хотим  мультимастер  в  две  стороны»  •     «Не  смогли  научить  использовать  правильный  индекс»  •     «Очень  сложно,  Concepts  читать  долго,  много  воды»  •     «Хотим  перемножать  матрицы  за  O(1)  и  чтоб  золотая              рыбка  была  у  меня  на  посылках»  

Page 6: Вы решили написать собственное хранилище, Илья Космодемьянский

Зачем  писать  свое  хранилище?  Распростарненные  случаи  

•     «Делали  на  MySQL,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     «Делали  на  Postgres,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  •     «Делали  на  Oracle,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  •     «Делали  на  DB2/MSSQL/Sybase  …  whatever»  

Page 7: Вы решили написать собственное хранилище, Илья Космодемьянский

Зачем  писать  свое  хранилище?  Распростарненные  случаи  

•     «Делали  на  MySQL,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     «Делали  на  Postgres,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  •     «Делали  на  Oracle,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  •     «Делали  на  DB2/MSSQL/Sybase  …  whatever»  

•     «А  давайте  запилим  что-­‐нибудь  высокотехнологичное  –  будем  как…»  

Page 8: Вы решили написать собственное хранилище, Илья Космодемьянский

Зачем  писать  свое  хранилище?  Распростарненные  случаи  

•     «Делали  на  MySQL,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  

•     «Делали  на  Postgres,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  •     «Делали  на  Oracle,  устали  –    теперь  хотим  чего-­‐либо  более  светлого»  •     «Делали  на  DB2/MSSQL/Sybase  …  whatever»  

•     «А  давайте  запилим  что-­‐нибудь  высокотехнологичное  –  будем  как…»  •     «Чтоб  разгрузить  БД,  нужно  простенькое  быстрое  хранилище»  !!!  

Page 9: Вы решили написать собственное хранилище, Илья Космодемьянский

Вобщем  решили  писать  с  нуля  

Ну  или  почти  с  нуля  –  не  суть  ;-­‐)  

Page 10: Вы решили написать собственное хранилище, Илья Космодемьянский

Надежность  хранилища  Mission  cri>cal?  

Перевод  денег  со  счета  на  счет  в  банке  

Порядок  постов  во  френдленте  

Где  граница?  

Page 11: Вы решили написать собственное хранилище, Илья Космодемьянский

Надежности  мешают  отказы  Хороший  термин  Failure,  переведем  его  как  Падение  

•     Падает  железо  •     Падает  ПО  •     Непродуманый  дизайн  ПО  ведет  к  падениям  •     Нерадивый  админ  нажал  не  на  ту  кнопку  и  все  упало  

Потенциальная    проблема  

Случившаяся  проблема  

Ошибка   Падение  (ошибка  которую    

нельзя  обработать)  

Page 12: Вы решили написать собственное хранилище, Илья Космодемьянский

Начинаем  с  простого  

D  

Page 13: Вы решили написать собственное хранилище, Илья Космодемьянский

Добавляем  надежность  

D3  D1   D2  

Dm  

Простое  и  логичное  решение!  

Page 14: Вы решили написать собственное хранилище, Илья Космодемьянский

Это  был  подход    «Чтобы  не  падало»  

Почему  плохо  

•     Сразу  две  проблемы  –  и  с  чтением  и  записью  •     Непроизводительно  

Page 15: Вы решили написать собственное хранилище, Илья Космодемьянский

Быстро  поднятое  не  считается  упавшим  

•     Исходим  из  того,  что  система  всё  равно  когда-­‐нибудь  может  упасть  •     Минимизируем  потери  

Page 16: Вы решили написать собственное хранилище, Илья Космодемьянский

Атомарность  

D1   D2  

Такая  последовательность  действий  восстановима  

Page 17: Вы решили написать собственное хранилище, Илья Космодемьянский

Конкурентный  доступ  S  =  1000RUR  

send_money(S,  B,  100  )      A1  

send_money(S,  B,  200  )      A2  

S  =  900RUR  ?    

S  =  800RUR  ?  

S  =  700RUR  !  

A1  

A1  

A2  

A2  

затем  

затем  или  

Page 18: Вы решили написать собственное хранилище, Илья Космодемьянский

Конкурентный  доступ  S  =  1000RUR  

send_money(S,  B,  100  )      A1  

send_money(S,  B,  200  )      A2  

S  =  900RUR  ?    

S  =  800RUR  ?  

S  =  700RUR  !  

A1  

A1  

A2  

A2  

затем  

затем  или  

Изоляция

Page 19: Вы решили написать собственное хранилище, Илья Космодемьянский

Конкурентный  доступ  S  =  1000RUR  

send_money(S,  B,  100  )      A1  

send_money(S,  B,  200  )      A2  

S  =  900RUR  ?    

S  =  800RUR  ?  

S  =  700RUR  !  

A1  

A1  

A2  

A2  

затем  

затем  или  

Изоляция

Восстановимость  +  изоляция  =  атомарность  

Page 20: Вы решили написать собственное хранилище, Илья Космодемьянский

Свойства  действий  с  блоками  данных  •     Атомарность  •     Целостность  –  набор  правил  для  данных  •     Долговечность    

Действие,  обладающее  такими  свойствами  есть  транзакция  

Page 21: Вы решили написать собственное хранилище, Илья Космодемьянский

Быстрая  восстановимость  

•     Версии  

D0   D1   VN  

А  если  упали  на  смене  VN?  Если  все  действие  прошло  успешно,  

 достигнут  Commit  point  

Page 22: Вы решили написать собственное хранилище, Илья Космодемьянский

Быстрая  восстановимость  

•     Версии  •     Пишем  лог  

 Изоляция/корректность  –  легко  без  производительности

Page 23: Вы решили написать собственное хранилище, Илья Космодемьянский

T1   T2  

r1[x]   w2[x]  

w2[y]  w1[y]  

w2[y]  w1[y]  r1[x]   w2[x]   -­‐  корректная  история  

Направление  стрелок  –    порядок  выполненения  конфликтующих  действий  

История  корректна  если    эквивалентна    последовательному    выполнению  транзакций  –    сериализуема  

T2  

T3  

T4  T1  

Граф  действий  /  граф  конфликтов  

Если  нет  циклов,  то  историю  на  которой  он  построенможно  сериализовать  

Некорректная  история  –    

падение  и  нарушение  целостности  

Page 24: Вы решили написать собственное хранилище, Илья Космодемьянский

2PL  •     с  конфликтами  борятся  блокировками  –  блокирующий  шедулер  •     двухфазное  блокирование  –  сначала  выставляем  все  блокировки,  ни  одна                блокировка  не  может  быть  снята  пока  не  выставлены  все    

•     С  помощью  2PL  мы  добиваемся  изоляции  при  сохранении          производительности  

Page 25: Вы решили написать собственное хранилище, Илья Космодемьянский

Мы  построили  хранилище  на  отдельно  взятой  машине  

•     Объективно  машина  не  справляется.  Что  дальше?  •     Scale  out  –  репликация  и  шардинг  •     Асинхронный  месседжинг  –  очереди  –  что  они  дают  •     Распределенные  транзакции  –  если  до  этого  было  еще  не  страшно  

Page 26: Вы решили написать собственное хранилище, Илья Космодемьянский

Нерассмотренные  важные  моменты  

•  Сеть и производительность •     Мониторинг  

•     capex/opex  

Page 27: Вы решили написать собственное хранилище, Илья Космодемьянский

Возвращаемся  к  постановке  задачи  

•  Данные не должны браться из ниоткуда и не должны пропадать •  Данные связаны между собой •   Устранены-­‐ли  проблемы  по  которым  нас  не  устраивала  СУБД  •   Сколько  мы  на  это  все  потратитли  и  сколько  еще  потратим?