Чӣ тавр он кор мекунад ва чӣ рӯй дод - дар зери бурида хонед.
Имрӯз аудиторияи моҳонаи Одноклассники беш аз 70 миллион нафар меҳмонони беназирро ташкил медиҳад. Мо Мо дар панҷгонаи беҳтарин ҳастем бузургтарин шабакаҳои иҷтимоӣ дар ҷаҳон ва дар байни бист сайте, ки корбарон бештар дар он вақт сарф мекунанд. Инфрасохтори OK борҳои хеле баландро идора мекунад: зиёда аз як миллион дархости HTTP дар як сония. Қисмҳои парки серверии беш аз 8000 адад ба ҳам наздик ҷойгир шудаанд - дар чор маркази додаҳои Маскав, ки имкон медиҳад, ки таъхири шабака дар байни онҳо камтар аз 1 мс бошад.
Мо Кассандраро аз соли 2010 аз версияи 0.6 истифода мебарем. Имрӯзҳо даҳҳо кластерҳо амал мекунанд. Кластери тезтарин дар як сония зиёда аз 4 миллион амалиётро коркард мекунад ва калонтарин кластер 260 ТБ захира мекунад.
Аммо, ин ҳама кластерҳои оддии NoSQL мебошанд, ки барои нигоҳдорӣ истифода мешаванд суст мутобик карда шудааст маълумот. Мо хостем, ки нигаҳдории асосии пайваста Microsoft SQL Server, ки аз замони таъсиси Одноклассники истифода мешавад, иваз кунем. Захира аз зиёда аз 300 мошини SQL Server Standard Edition иборат буд, ки дорои 50 TB маълумот - субъектҳои тиҷоратӣ буданд. Ин маълумот ҳамчун як қисми транзаксияҳои ACID тағир дода мешавад ва талаб мекунад мутобиқати баланд.
Барои паҳн кардани маълумот дар саросари гиреҳҳои SQL Server, мо ҳам амудӣ ва ҳам уфуқӣ истифода кардем тақсимкунӣ (пора кардан). Таърихан, мо як схемаи оддии мубодилаи маълумотро истифода мебурдем: ҳар як объект бо аломат алоқаманд буд - вазифаи ID-и объект. Объектҳои дорои як аломат дар ҳамон сервери SQL ҷойгир карда шуданд. Муносибати усто-тафсилот тавре амалӣ карда шуд, ки аломатҳои сабтҳои асосӣ ва кӯдакон ҳамеша мувофиқат кунанд ва дар як сервер ҷойгир бошанд. Дар шабакаи иҷтимоӣ қариб ҳама сабтҳо аз номи корбар тавлид мешаванд - ин маънои онро дорад, ки ҳама маълумоти корбар дар як зерсистемаи функсионалӣ дар як сервер нигоҳ дошта мешаванд. Яъне, амалиёти тиҷорӣ қариб ҳамеша ҷадвалҳоро аз як сервери SQL дар бар мегирад, ки ин имкон дод, ки мувофиқати маълумот бо истифода аз транзаксияҳои ACID-и маҳаллӣ бидуни зарурати истифода таъмин карда шавад. суст ва беэътимод амалиёти тақсимоти ACID.
Ба туфайли sharding ва суръат бахшидан ба SQL:
Мо маҳдудиятҳои калиди хориҷиро истифода намебарем, зеро ҳангоми тақсим кардани ID объект метавонад дар сервери дигар ҷойгир бошад.
Мо аз сабаби сарбории иловагӣ ба CPU DBMS расмиёти захирашуда ва триггерҳоро истифода намебарем.
Мо JOIN-ро аз сабаби ҳама чизҳои дар боло зикршуда ва бисёр хондани тасодуфӣ аз диск истифода намебарем.
Бо афзоиши шумораи сабтҳо дар ҷадвал, суръати воридкунӣ ва тағирдиҳӣ кам мешавад, ҳангоми илова кардани индексҳо ба ҷадвали мавҷуда, суръат як маротиба коҳиш меёбад; эҷод ва аз нав сохтани индексҳо бо вақти бекорӣ рух медиҳад.
Доштани миқдори ками Windows барои SQL Server дар истеҳсолот идоракунии инфрасохторро мушкил мекунад
Аммо проблемаи асосй дар он аст
таҳаммулпазирии хатогиҳо
Сервери классикии SQL таҳаммулпазирии камбизоат дорад. Фарз мекунем, ки шумо танҳо як сервери пойгоҳи додаҳо доред ва он дар се сол як маротиба ноком мешавад. Дар ин муддат сайт 20 дақиқа кор намекунад, ки қобили қабул аст. Агар шумо 64 сервер дошта бошед, пас сайт дар се ҳафта як маротиба қатъ мешавад. Ва агар шумо 200 сервер дошта бошед, пас сайт ҳар ҳафта кор намекунад. Ин мушкилот аст.
Барои беҳтар кардани таҳаммулпазирии хатогиҳои сервери SQL чӣ кор кардан мумкин аст? Википедиа моро ба сохтани он даъват мекунад кластери хеле дастрас: ки дар сурати аз кор баромадани яке аз ҷузъҳо нусхаи эҳтиётӣ мавҷуд аст.
Аммо нуқсони асосии чунин кластери хеле дастрас ин мавҷудияти сифр аст, агар маркази маълумоте, ки дар он ҷойгир аст, ноком шавад. Одноклассники дорои чаҳор маркази маълумотӣ мебошад ва мо бояд дар сурати пурра аз кор баромадани яке аз онҳо корашро таъмин кунем.
Барои ин мо метавонем истифода барем Мулти-мастер такрорӣ дар SQL Server сохта шудааст. Ин ҳалли он аз ҳисоби арзиши нармафзор хеле гаронтар аст ва аз мушкилоти маъруфи такрорӣ азоб мекашад - таъхирҳои пешгӯинашавандаи транзаксия бо такрори синхронӣ ва таъхир дар татбиқи такрорӣ (ва дар натиҷа, тағиротҳои гумшуда) бо такрори асинхронӣ. Дар назар дошташуда ҳалли дастӣ низоъ ин вариантро барои мо комилан номувофиқ месозад.
Хамаи ин проблемахо халли катъиро талаб мекарданд ва мо ба тахлили муфассал шуруъ кардем. Дар ин ҷо мо бояд бо он шинос шавем, ки SQL Server асосан чӣ кор мекунад - транзаксияҳо.
Муомилоти оддӣ
Биёед соддатарин транзаксияро аз нуқтаи назари барномасози SQL истифода барем: илова кардани акс ба албом. Альбомхо ва суратхо дар лавхахои гуногун нигох дошта мешаванд. Дар альбом ҳисобкунаки аксҳои ҷамъиятӣ мавҷуд аст. Сипас чунин амалиёт ба марҳилаҳои зерин тақсим карда мешавад:
Мо албомро бо калид қулф мекунем.
Дар ҷадвали аксҳо сабт эҷод кунед.
Агар акс мақоми ҷамъиятӣ дошта бошад, пас ба албом ҳисобкунаки аксҳои оммавӣ илова кунед, сабтро нав кунед ва транзаксияро анҷом диҳед.
Ё дар псевдокод:
TX.start("Albums", id);
Album album = albums.lock(id);
Photo photo = photos.create(…);
if (photo.status == PUBLIC ) {
album.incPublicPhotosCount();
}
album.update();
TX.commit();
CREATE TABLE photos (id bigint KEY, owner bigint,…);
SELECT * FROM photos WHERE id=?;
UPDATE photos SET … WHERE id=?;
Барои таъмини мутобиқати маълумоти нусхабардорӣ, Кассандра истифода мебарад муносибати кворум. Дар соддатарин ҳолат, ин маънои онро дорад, ки вақте се нусхаи як сатр дар гиреҳҳои гуногуни кластер ҷойгир карда мешаванд, навиштан муваффақ ҳисобида мешавад, агар аксарияти гиреҳҳо (яъне аз се ду) муваффақияти ин амалиёти навиштанро тасдиқ кунанд . Маълумоти сатр мувофиқ ҳисобида мешавад, агар ҳангоми хондан аксарияти гиреҳҳо пурсиш шуда, онҳоро тасдиқ кунанд. Ҳамин тариқ, бо се нусха, мутобиқати пурра ва фаврии додаҳо кафолат дода мешавад, агар як гиреҳ ноком шавад. Ин равиш ба мо имкон дод, ки схемаи боз ҳам боэътимодтарро амалӣ созем: ҳамеша ба ҳар се реплика дархостҳо фиристед ва мунтазири посухи ду нусхаи зудтарин бошад. Ҷавоби дер нусхаи сеюм дар ин ҳолат партофта мешавад. Гиреде, ки дер посух медиҳад, метавонад мушкилоти ҷиддӣ дошта бошад - тормозҳо, ҷамъоварии партовҳо дар JVM, барқароркунии мустақими хотира дар ядрои Linux, нокомии сахтафзор, ҷудошавӣ аз шабака. Аммо, ин ба амалиёт ё маълумоти муштарӣ ба ҳеҷ ваҷҳ таъсир намерасонад.
Равише, ки мо бо се гиреҳ тамос мегирем ва аз ду посух мегирем, ном дорад тахмин: дархост барои нусхаҳои иловагӣ ҳатто пеш аз он ки "афтад" фиристода мешавад.
Наздиктарин чизе ба муомилот дар Кассандра ба ном "муомилоти сабук". Аммо онҳо аз транзаксияҳои "воқеии" ACID дуранд: дар асл, ин як имкон аст CAS дар бораи маълумот аз танҳо як сабт, бо истифода аз консенсус бо истифода аз протоколи Paxos вазнин. Аз ин рӯ, суръати чунин муомилот паст аст.
Он чизе ки мо дар Кассандра намерасидем
Ҳамин тавр, мо бояд амалиёти воқеии ACID-ро дар Кассандра амалӣ кунем. Бо истифода аз он, мо метавонем ду хусусияти дигари қулайи МДМ классикиро ба осонӣ амалӣ кунем: индексҳои пайвастаи зуд, ки ба мо имкон медиҳанд, ки интихоби маълумотро на танҳо бо калиди ибтидоӣ анҷом диҳем ва як генератори муқаррарии ID-ҳои якрангии худкор афзоишёбанда.
C* Яке
Ҳамин тариқ, DBMS нав таваллуд шуд C* Яке, ки аз се намуди гиреҳҳои сервер иборат аст:
Азбаски як ҳамоҳангсоз танҳо ба як гурӯҳи транзаксияҳо хидмат мерасонад, хеле муҳим аст, ки далели нокомии онро зуд муайян кунед, то кӯшиши дуюм барои анҷом додани транзаксия вақтро анҷом диҳад. Барои зуд ва боэътимод сохтани ин, мо як протоколи пурра пайвастшудаи кворумро истифода бурдем:
Ҳар як маркази додаҳо ҳадди аққал ду гиреҳи ҳамоҳангсозро дорад. Давра ба давра, ҳар як ҳамоҳангсоз ба дигар ҳамоҳангсозон паёми тапиши дил мефиристад ва онҳоро дар бораи фаъолияти он, инчунин кадом паёмҳои тапиши дилро, ки бори охир аз кадом координаторҳо дар кластер гирифтааст, огоҳ мекунад.
Ҳангоми гирифтани маълумоти шабеҳ аз дигарон ҳамчун як қисми паёмҳои набзи онҳо, ҳар як ҳамоҳангсоз худаш муайян мекунад, ки кадом гиреҳҳои кластерӣ кор мекунанд ва кадомашон не, бо назардошти принсипи кворум: агар гиреҳи X аз аксарияти гиреҳҳои кластер дар бораи ҳолати муқаррарӣ маълумот гирифта бошад. гирифтани паёмҳо аз гиреҳи Y, пас , Y кор мекунад. Ва баръакс, вақте ки аксарият дар бораи гум шудани паёмҳо аз гиреҳи Y хабар медиҳанд, Y рад мекунад. Аҷиб аст, ки агар кворум ба гиреҳи X хабар диҳад, ки вай дигар аз он паём намегирад, худи гиреҳи X худро ноком мешуморад.
Мутобиқати. Ҳар як амалиёти муваффақ, тибқи таъриф, танҳо натиҷаҳои дурустро сабт мекунад. Агар пас аз кушодани транзаксия ва иҷрои як қисми амалиётҳо маълум шавад, ки натиҷа беэътибор аст, бозпас гирифта мешавад.
Ҷудогона будан. Ҳангоми анҷом додани транзаксия, амалиёти ҳамзамон набояд ба натиҷаи он таъсир расонад. Амалиётҳои рақобаткунанда бо истифода аз қуфлҳои пессимистӣ дар ҳамоҳангсоз ҷудо карда мешаванд. Барои хондани берун аз транзаксия, принсипи ҷудокунӣ дар сатҳи Хонда шуд.
Ҷадвали манбаъ бо аксҳо мавҷуд аст, ки дар он ID сабт калиди асосӣ мебошад.
Барои индекс, C*One ҷадвали наверо месозад, ки нусхаи аслии он аст. Калид бо ифодаи индекс якхела аст ва он инчунин калиди ибтидоии сабтро аз ҷадвали манбаъ дар бар мегирад:
Акнун дархости "соҳиби рӯзи охирин" метавонад ҳамчун интихоб аз ҷадвали дигар аз нав навишта шавад:
SELECT * FROM i1_test
WHERE owner=?
AND modified>?
Мутобиқати маълумот дар аксҳои ҷадвали манбаъ ва ҷадвали индекси i1 аз ҷониби ҳамоҳангсоз ба таври худкор нигоҳ дошта мешавад. Танҳо дар асоси схемаи додаҳо, вақте ки тағирот қабул карда мешавад, координатор тағиротро на танҳо дар ҷадвали асосӣ, балки дар нусхаҳо низ тавлид ва нигоҳ медорад. Дар ҷадвали индекс ягон амали иловагӣ иҷро карда намешавад, гузоришҳо хонда намешаванд ва қуфлҳо истифода намешаванд. Ин аст, ки илова кардани индексҳо қариб ҳеҷ гуна захираҳоро сарф намекунад ва ба суръати татбиқи тағирот амалан таъсир намерасонад.
Бо истифода аз ACID, мо тавонистем индексҳои ба SQL монандро татбиқ кунем. Онҳо пайваста, миқёспазир, зуд, таркибпазиранд ва дар забони дархости CQL сохта шудаанд. Барои дастгирии индексҳо ҳеҷ гуна тағирот ба коди барнома талаб карда намешавад. Ҳама чиз мисли SQL оддӣ аст. Ва муҳимтар аз ҳама, индексатсияҳо ба суръати иҷрои тағирот дар ҷадвали транзаксияҳои аслӣ таъсир намерасонанд.
Чӣ шуд
Мо C*One-ро се сол пеш аз ин тартиб дода, онро ба истифода дода будем.
Мо дар охир чӣ ба даст овардем? Биёед инро бо мисоли зерсистемаи коркард ва нигоҳдории аксҳо, яке аз муҳимтарин намудҳои додаҳо дар шабакаи иҷтимоӣ арзёбӣ кунем. Мо на дар бораи бадани худи суратхо, балки дар бораи хар гуна мета-форматика сухан меронем. Ҳоло дар Одноклассники тақрибан 20 миллиард чунин сабтҳо мавҷуданд, ки система дар як сония 80 ҳазор дархости хонданро коркард мекунад, то 8 ҳазор транзаксияҳои ACID дар як сония бо тағир додани маълумот алоқаманд аст.
Вақте ки мо SQL-ро бо омили такрорӣ = 1 истифода мебурдем (вале дар RAID 10), мета-маълумоти акс дар кластери дастраси 32 мошине, ки бо Microsoft SQL Server кор мекунанд (плюс 11 нусхаи эҳтиётӣ) нигоҳ дошта мешуд. 10 сервер низ барои нигоҳ доштани нусхаҳои эҳтиётӣ ҷудо карда шуд. Ҳамагӣ 50 мошини қиматбаҳо. Дар баробари ин система бо сарбории номиналӣ, бидуни захира кор мекард.
Пас аз гузаштан ба системаи нав, мо омили такрорӣ = 3 - нусха дар ҳар як маркази маълумот гирифтем. Система аз 63 гиреҳи нигаҳдории Кассандра ва 6 мошини ҳамоҳангсоз, барои ҳамагӣ 69 сервер иборат аст. Аммо ин мошинҳо хеле арзонтаранд, арзиши умумии онҳо тақрибан 30% арзиши системаи SQL-ро ташкил медиҳад. Дар айни замон, бор дар 30 фоиз нигоҳ дошта мешавад.