NewSQL = NoSQL+ACID

NewSQL = NoSQL+ACID
То ба наздикӣ Одноклассники тақрибан 50 TB маълумотеро, ки дар вақти воқеӣ коркард шудааст, дар SQL Server нигоҳ медошт. Барои чунин ҳаҷм таъмин кардани дастрасии зуд ва боэътимод ва ҳатто ба нокомии маркази додаҳо бо истифода аз DBMS SQL қариб ғайриимкон аст. Одатан, дар чунин ҳолатҳо, яке аз анборҳои NoSQL истифода мешавад, аммо на ҳама чизро ба NoSQL интиқол додан мумкин аст: баъзе субъектҳо кафолати транзаксияҳои ACID-ро талаб мекунанд.

Ин моро ба истифодаи захираи NewSQL овард, яъне DBMS, ки таҳаммулпазирӣ, миқёспазирӣ ва иҷрои системаҳои NoSQL-ро таъмин мекунад, аммо дар айни замон нигоҳ доштани кафолатҳои ACID, ки ба системаҳои классикӣ шинос аст. Системахои саноатии ин синфи нав каманд, бинобар ин мо чунин системаро худамон чорй намуда, онро ба истифода додем.

Чӣ тавр он кор мекунад ва чӣ рӯй дод - дар зери бурида хонед.

Имрӯз аудиторияи моҳонаи Одноклассники беш аз 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-ро аз сабаби ҳама чизҳои дар боло зикршуда ва бисёр хондани тасодуфӣ аз диск истифода намебарем.
  • Берун аз транзаксия, мо сатҳи изолятсияи Read Uncommitted-ро барои коҳиш додани бунбаст истифода мебарем.
  • Мо танҳо амалиёти кӯтоҳро иҷро мекунем (ба ҳисоби миёна аз 100 мс кӯтоҳтар).
  • Мо аз сабаби шумораи зиёди бунбастҳо UPDATE ва DELETE-ро истифода намебарем - мо дар як вақт танҳо як сабтро нав мекунем.
  • Мо ҳамеша дархостҳоро танҳо аз рӯи индексҳо иҷро мекунем - дархост бо нақшаи пурраи сканкунии ҷадвал барои мо маънои аз ҳад зиёди базаи маълумотро дорад ва боиси нокомии он мегардад.

Ин қадамҳо ба мо имкон доданд, ки иҷрои қариб ҳадди аксарро аз серверҳои SQL ғунҷонем. Бо вучуди ин проблемахо торафт зиёд мешуданд. Биёед ба онҳо назар андозем.

Мушкилот бо SQL

  • Азбаски мо sharding-и худнависиро истифода мебурдем, илова кардани пораҳои нав аз ҷониби маъмурон дастӣ анҷом дода мешуд. Дар тӯли ин вақт, репликаҳои миқёспазири додаҳо ба дархостҳо хидмат намерасонданд.
  • Бо афзоиши шумораи сабтҳо дар ҷадвал, суръати воридкунӣ ва тағирдиҳӣ кам мешавад, ҳангоми илова кардани индексҳо ба ҷадвали мавҷуда, суръат як маротиба коҳиш меёбад; эҷод ва аз нав сохтани индексҳо бо вақти бекорӣ рух медиҳад.
  • Доштани миқдори ками Windows барои SQL Server дар истеҳсолот идоракунии инфрасохторро мушкил мекунад

Аммо проблемаи асосй дар он аст

таҳаммулпазирии хатогиҳо

Сервери классикии SQL таҳаммулпазирии камбизоат дорад. Фарз мекунем, ки шумо танҳо як сервери пойгоҳи додаҳо доред ва он дар се сол як маротиба ноком мешавад. Дар ин муддат сайт 20 дақиқа кор намекунад, ки қобили қабул аст. Агар шумо 64 сервер дошта бошед, пас сайт дар се ҳафта як маротиба қатъ мешавад. Ва агар шумо 200 сервер дошта бошед, пас сайт ҳар ҳафта кор намекунад. Ин мушкилот аст.

Барои беҳтар кардани таҳаммулпазирии хатогиҳои сервери SQL чӣ кор кардан мумкин аст? Википедиа моро ба сохтани он даъват мекунад кластери хеле дастрас: ки дар сурати аз кор баромадани яке аз ҷузъҳо нусхаи эҳтиётӣ мавҷуд аст.

Ин парки таҷҳизоти гаронбаҳоро талаб мекунад: такрорҳои сершумор, нахи оптикӣ, нигаҳдории муштарак ва дохил кардани захира эътимоднок кор намекунад: тақрибан 10% коммутатсионӣ бо шикастани гиреҳи эҳтиётӣ ба мисли қатора дар паси гиреҳи асосӣ анҷом меёбад.

Аммо нуқсони асосии чунин кластери хеле дастрас ин мавҷудияти сифр аст, агар маркази маълумоте, ки дар он ҷойгир аст, ноком шавад. Одноклассники дорои чаҳор маркази маълумотӣ мебошад ва мо бояд дар сурати пурра аз кор баромадани яке аз онҳо корашро таъмин кунем.

Барои ин мо метавонем истифода барем Мулти-мастер такрорӣ дар SQL Server сохта шудааст. Ин ҳалли он аз ҳисоби арзиши нармафзор хеле гаронтар аст ва аз мушкилоти маъруфи такрорӣ азоб мекашад - таъхирҳои пешгӯинашавандаи транзаксия бо такрори синхронӣ ва таъхир дар татбиқи такрорӣ (ва дар натиҷа, тағиротҳои гумшуда) бо такрори асинхронӣ. Дар назар дошташуда ҳалли дастӣ низоъ ин вариантро барои мо комилан номувофиқ месозад.

Хамаи ин проблемахо халли катъиро талаб мекарданд ва мо ба тахлили муфассал шуруъ кардем. Дар ин ҷо мо бояд бо он шинос шавем, ки SQL Server асосан чӣ кор мекунад - транзаксияҳо.

Муомилоти оддӣ

Биёед соддатарин транзаксияро аз нуқтаи назари барномасози SQL истифода барем: илова кардани акс ба албом. Альбомхо ва суратхо дар лавхахои гуногун нигох дошта мешаванд. Дар альбом ҳисобкунаки аксҳои ҷамъиятӣ мавҷуд аст. Сипас чунин амалиёт ба марҳилаҳои зерин тақсим карда мешавад:

  1. Мо албомро бо калид қулф мекунем.
  2. Дар ҷадвали аксҳо сабт эҷод кунед.
  3. Агар акс мақоми ҷамъиятӣ дошта бошад, пас ба албом ҳисобкунаки аксҳои оммавӣ илова кунед, сабтро нав кунед ва транзаксияро анҷом диҳед.

Ё дар псевдокод:

TX.start("Albums", id);
Album album = albums.lock(id);
Photo photo = photos.create(…);

if (photo.status == PUBLIC ) {
    album.incPublicPhotosCount();
}
album.update();

TX.commit();

Мо мебинем, ки сенарияи маъмултарини амалиёти тиҷорӣ ин хондани маълумот аз пойгоҳи додаҳо ба хотираи сервери барномавӣ, тағир додани чизе ва захира кардани арзишҳои нав ба пойгоҳи додаҳо мебошад. Одатан, дар чунин транзаксия мо якчанд объектҳо, якчанд ҷадвалҳоро навсозӣ мекунем.

Ҳангоми анҷом додани транзаксия, тағир додани як маълумот аз системаи дигар метавонад рух диҳад. Масалан, Антиспам метавонад қарор кунад, ки корбар ягон навъ шубҳанок аст ва аз ин рӯ, ҳама аксҳои корбар набояд дигар оммавӣ бошанд, онҳо бояд барои модератсия фиристода шаванд, яъне тағир додани photo.status ба арзиши дигар ва хомӯш кардани ҳисобкунакҳои мувофиқ. Аён аст, ки агар ин амалиёт бидуни кафолати атомии татбиқ ва ҷудо кардани тағиротҳои рақобаткунанда сурат гирад, ба монанди Кислота, он гоҳ натиҷа он чизест, ки лозим нест - ё ҳисобкунаки аксҳо арзиши нодурустро нишон медиҳад ё на ҳама аксҳо барои модератсия фиристода мешаванд.

Дар тӯли тамоми мавҷудияти Одноклассники бисёр кодҳои шабеҳ, ки субъектҳои гуногуни тиҷоратро дар як транзаксия идора мекунанд, навишта шудаанд. Дар асоси таҷрибаи муҳоҷират ба NoSQL аз Мутобиқати ниҳоӣ Мо медонем, ки бузургтарин мушкилот (ва сармоягузории вақт) аз таҳияи код барои нигоҳ доштани мутобиқати додаҳо бармеояд. Аз ин рӯ, мо талаботи асосӣ барои нигаҳдории навро таъмини амалиёти воқеии ACID барои мантиқи барнома баррасӣ кардем.

Талаботи дигар, на камтар муҳимтар, инҳо буданд:

  • Агар маркази маълумот кор накунад, ҳам хондан ва ҳам навиштан ба анбори нав бояд дастрас бошад.
  • Нигоҳ доштани суръати ҳозираи рушд. Яъне, ҳангоми кор бо анбори нав ҳаҷми рамз бояд тақрибан якхела бошад, ба анбор чизе илова кардан, алгоритмҳои ҳалли низоъҳо, нигоҳ доштани нишондиҳандаҳои дуюмдараҷа ва ғайра лозим нест.
  • Суръати нигаҳдории нав ҳам ҳангоми хондани маълумот ва ҳам ҳангоми коркарди транзаксияҳо бояд хеле баланд бошад, ки ин маънои онро дошт, ки ҳалли аз ҷиҳати академикӣ сахтгир, универсалӣ, вале суст, масалан, қобили татбиқ нест. ӯҳдадориҳои ду марҳила.
  • Миқёси автоматӣ дар вақти парвоз.
  • Истифодаи серверҳои арзони муқаррарӣ, бидуни харидани сахтафзори экзотикӣ.
  • Имконияти таҳияи нигаҳдорӣ аз ҷониби таҳиягарони ширкат. Ба ибораи дигар, афзалият ба ҳалли хусусӣ ё кушодаасос, беҳтараш дар Java дода шуд.

Қарорҳо, қарорҳо

Таҳлили ҳалли имконпазир, мо ба ду интихоби имконпазири меъморӣ омадем:

Аввалан, гирифтани ҳама гуна сервери SQL ва татбиқи таҳаммулпазирии хатогиҳо, механизми миқёскунӣ, кластери хатогӣ, ҳалли низоъ ва транзаксияҳои тақсимшуда, боэътимод ва зуди ACID мебошад. Мо ин вариантро ҳамчун хеле ғайриоддӣ ва меҳнатталаб арзёбӣ кардем.

Варианти дуюм ин аст, ки анбори тайёри NoSQL бо миқёси амалӣ, кластери ивазкунӣ, ҳалли муноқишаҳо ва амалисозии транзаксияҳо ва SQL-и худ. Дар назари аввал, ҳатто вазифаи татбиқи SQL, на аз транзаксияҳои ACID, ба коре монанд аст, ки солҳо тӯл мекашад. Аммо баъд мо фаҳмидем, ки маҷмӯи хусусиятҳои SQL, ки мо дар амал истифода мебарем, аз ANSI SQL то ҳадде дур аст Кассандра CQL дур аз ANSI SQL. Бо дидани боз ҳам бодиққат ба CQL, мо фаҳмидем, ки он ба он чизе, ки ба мо лозим аст, хеле наздик аст.

Кассандра ва CQL

Пас, дар бораи Кассандра чӣ ҷолиб аст, он чӣ гуна қобилиятҳо дорад?

Аввалан, дар ин ҷо шумо метавонед ҷадвалҳое созед, ки намудҳои гуногуни маълумотро дастгирӣ мекунанд; шумо метавонед дар калиди асосӣ SELECT ё UPDATE иҷро кунед.

CREATE TABLE photos (id bigint KEY, owner bigint,…);
SELECT * FROM photos WHERE id=?;
UPDATE photos SET … WHERE id=?;

Барои таъмини мутобиқати маълумоти нусхабардорӣ, Кассандра истифода мебарад муносибати кворум. Дар соддатарин ҳолат, ин маънои онро дорад, ки вақте се нусхаи як сатр дар гиреҳҳои гуногуни кластер ҷойгир карда мешаванд, навиштан муваффақ ҳисобида мешавад, агар аксарияти гиреҳҳо (яъне аз се ду) муваффақияти ин амалиёти навиштанро тасдиқ кунанд . Маълумоти сатр мувофиқ ҳисобида мешавад, агар ҳангоми хондан аксарияти гиреҳҳо пурсиш шуда, онҳоро тасдиқ кунанд. Ҳамин тариқ, бо се нусха, мутобиқати пурра ва фаврии додаҳо кафолат дода мешавад, агар як гиреҳ ноком шавад. Ин равиш ба мо имкон дод, ки схемаи боз ҳам боэътимодтарро амалӣ созем: ҳамеша ба ҳар се реплика дархостҳо фиристед ва мунтазири посухи ду нусхаи зудтарин бошад. Ҷавоби дер нусхаи сеюм дар ин ҳолат партофта мешавад. Гиреде, ки дер посух медиҳад, метавонад мушкилоти ҷиддӣ дошта бошад - тормозҳо, ҷамъоварии партовҳо дар JVM, барқароркунии мустақими хотира дар ядрои Linux, нокомии сахтафзор, ҷудошавӣ аз шабака. Аммо, ин ба амалиёт ё маълумоти муштарӣ ба ҳеҷ ваҷҳ таъсир намерасонад.

Равише, ки мо бо се гиреҳ тамос мегирем ва аз ду посух мегирем, ном дорад тахмин: дархост барои нусхаҳои иловагӣ ҳатто пеш аз он ки "афтад" фиристода мешавад.

Бартарии дигари Кассандра ин Batchlog аст, механизме, ки кафолат медиҳад, ки як қатор тағиротҳои шумо пурра истифода мешаванд ё тамоман истифода намешаванд. Ин ба мо имкон медиҳад, ки A-ро дар ACID - атомӣ берун аз қуттӣ ҳал кунем.

Наздиктарин чизе ба муомилот дар Кассандра ба ном "муомилоти сабук". Аммо онҳо аз транзаксияҳои "воқеии" ACID дуранд: дар асл, ин як имкон аст CAS дар бораи маълумот аз танҳо як сабт, бо истифода аз консенсус бо истифода аз протоколи Paxos вазнин. Аз ин рӯ, суръати чунин муомилот паст аст.

Он чизе ки мо дар Кассандра намерасидем

Ҳамин тавр, мо бояд амалиёти воқеии ACID-ро дар Кассандра амалӣ кунем. Бо истифода аз он, мо метавонем ду хусусияти дигари қулайи МДМ классикиро ба осонӣ амалӣ кунем: индексҳои пайвастаи зуд, ки ба мо имкон медиҳанд, ки интихоби маълумотро на танҳо бо калиди ибтидоӣ анҷом диҳем ва як генератори муқаррарии ID-ҳои якрангии худкор афзоишёбанда.

C* Яке

Ҳамин тариқ, DBMS нав таваллуд шуд C* Яке, ки аз се намуди гиреҳҳои сервер иборат аст:

  • Нигоҳдорӣ - (қариб) серверҳои стандартии Кассандра барои нигоҳ доштани маълумот дар дискҳои маҳаллӣ масъуланд. Вақте ки сарборӣ ва ҳаҷми маълумот афзоиш меёбад, миқдори онҳоро ба осонӣ ба даҳҳо ва садҳо миқёс кардан мумкин аст.
  • Ҳамоҳангсозони транзаксия - таъмини иҷрои муомилот.
  • Мизоҷон серверҳои барномавӣ мебошанд, ки амалиёти тиҷоратиро амалӣ мекунанд ва транзаксияҳоро оғоз мекунанд. Ин гуна мизоҷон метавонад ҳазорҳо бошад.

NewSQL = NoSQL+ACID

Серверҳои ҳама намудҳо як ҷузъи кластери умумӣ мебошанд, барои муошират бо ҳамдигар протоколи паёми дохилии Кассандраро истифода мебаранд. цайбат барои мубодилаи иттилооти кластер. Бо Heartbeat серверҳо дар бораи нокомиҳои мутақобила маълумот мегиранд, схемаи ягонаи додаҳоро нигоҳ медоранд - ҷадвалҳо, сохтор ва такрори онҳо; схемаи тақсимкунӣ, топологияи кластер ва ғайра.

Мизоҷон

NewSQL = NoSQL+ACID

Ба ҷои драйверҳои стандартӣ, режими Fat Client истифода мешавад. Чунин гиреҳ маълумотро нигоҳ намедорад, балки метавонад ҳамчун ҳамоҳангсоз барои иҷрои дархост амал кунад, яъне худи муштарӣ ҳамчун ҳамоҳангсози дархостҳои он амал мекунад: он нусхаҳои нигаҳдории худро дархост мекунад ва ихтилофҳоро ҳал мекунад. Ин на танҳо аз ронандаи стандартӣ боэътимодтар ва тезтар аст, ки алоқа бо координатори дурдастро талаб мекунад, балки инчунин ба шумо имкон медиҳад, ки интиқоли дархостҳоро назорат кунед. Берун аз муомилоти дар муштарӣ кушодашуда, дархостҳо ба анборҳо фиристода мешаванд. Агар муштарӣ транзаксия кушода бошад, пас ҳама дархостҳо дар доираи транзаксия ба ҳамоҳангсози транзаксия фиристода мешаванд.
NewSQL = NoSQL+ACID

C*One ҳамоҳангсози транзаксия

Ҳамоҳангсоз он чизест, ки мо барои C*One аз сифр амалӣ кардем. Он барои идоракунии транзаксияҳо, қулфҳо ва тартиби татбиқи транзаксияҳо масъул аст.

Барои ҳар як транзаксияи хидматрасонӣ, ҳамоҳангсоз тамғаи вақтро тавлид мекунад: ҳар як амалиёти минбаъда аз транзаксияи қаблӣ бузургтар аст. Азбаски системаи ҳалли низоъҳои Кассандра ба тамғаҳои вақт асос ёфтааст (аз ду сабти ба ҳам зид, яке бо тамғаи охирини вақт ҷорӣ ҳисобида мешавад), низоъ ҳамеша ба фоидаи муомилоти минбаъда ҳал карда мешавад. Хамин тавр мо амалй кардем Соат Лампорт - роҳи арзони ҳалли низоъҳо дар системаи тақсимшуда.

Гӯшаҳо

Барои таъмини ҷудошавӣ, мо тасмим гирифтем, ки усули соддатарин - қуфлҳои пессимистӣ дар асоси калиди ибтидоии сабтро истифода барем. Ба ибораи дигар, дар транзаксия, сабт аввал бояд баста шавад, танҳо баъд хонда, тағир додан ва захира кардан лозим аст. Танҳо пас аз иҷрои бомуваффақияти сабт метавонад кушода шавад, то транзаксияҳои рақобаткунанда онро истифода баранд.

Татбиқи чунин қулфкунӣ дар муҳити тақсимнашуда оддӣ аст. Дар системаи тақсимшуда, ду варианти асосӣ вуҷуд дорад: ё дар кластер қулфи тақсимшуда амалӣ кунед ё транзаксияҳоро тақсим кунед, то транзаксияҳо бо як сабт ҳамеша аз ҷониби як ҳамоҳангсоз хидмат расонанд.

Азбаски дар ҳолати мо маълумот аллакай дар байни гурӯҳҳои транзаксияҳои маҳаллӣ дар SQL тақсим карда шудааст, қарор дода шуд, ки гурӯҳҳои транзаксияҳои маҳаллӣ ба ҳамоҳангсозон таъин карда шаванд: як ҳамоҳангсоз тамоми транзаксияҳоро бо нишонаҳо аз 0 то 9 анҷом медиҳад, дуюм - бо нишонаҳо аз 10 то 19, ва ғайра. Дар натиҷа, ҳар як мисоли ҳамоҳангсоз устоди гурӯҳи транзаксия мегардад.

Он гоҳ қуфлҳоро дар шакли HashMap баналӣ дар хотираи ҳамоҳангсоз амалӣ кардан мумкин аст.

Нокомии ҳамоҳангсоз

Азбаски як ҳамоҳангсоз танҳо ба як гурӯҳи транзаксияҳо хидмат мерасонад, хеле муҳим аст, ки далели нокомии онро зуд муайян кунед, то кӯшиши дуюм барои анҷом додани транзаксия вақтро анҷом диҳад. Барои зуд ва боэътимод сохтани ин, мо як протоколи пурра пайвастшудаи кворумро истифода бурдем:

Ҳар як маркази додаҳо ҳадди аққал ду гиреҳи ҳамоҳангсозро дорад. Давра ба давра, ҳар як ҳамоҳангсоз ба дигар ҳамоҳангсозон паёми тапиши дил мефиристад ва онҳоро дар бораи фаъолияти он, инчунин кадом паёмҳои тапиши дилро, ки бори охир аз кадом координаторҳо дар кластер гирифтааст, огоҳ мекунад.

NewSQL = NoSQL+ACID

Ҳангоми гирифтани маълумоти шабеҳ аз дигарон ҳамчун як қисми паёмҳои набзи онҳо, ҳар як ҳамоҳангсоз худаш муайян мекунад, ки кадом гиреҳҳои кластерӣ кор мекунанд ва кадомашон не, бо назардошти принсипи кворум: агар гиреҳи X аз аксарияти гиреҳҳои кластер дар бораи ҳолати муқаррарӣ маълумот гирифта бошад. гирифтани паёмҳо аз гиреҳи Y, пас , Y кор мекунад. Ва баръакс, вақте ки аксарият дар бораи гум шудани паёмҳо аз гиреҳи Y хабар медиҳанд, Y рад мекунад. Аҷиб аст, ки агар кворум ба гиреҳи X хабар диҳад, ки вай дигар аз он паём намегирад, худи гиреҳи X худро ноком мешуморад.

Паёмҳои тапиши дил бо басомади баланд, тақрибан 20 маротиба дар як сония, бо давомнокии 50 мс фиристода мешаванд. Дар Java, кафолат додани вокуниши барнома дар давоми 50 мс душвор аст, зеро дарозии муқоисашавандаи таваққуфҳое, ки аз ҷониби коллектори ахлот ба вуҷуд омадааст. Мо тавонистем ин вақти вокунишро бо истифода аз коллектори партовҳои G1 ба даст орем, ки ба мо имкон медиҳад, ки ҳадафро барои давомнокии таваққуфҳои GC муайян кунем. Аммо, баъзан, хеле кам, танаффусҳои коллектор аз 50 мс зиёд мешавад, ки ин метавонад ба ошкор кардани хатогиҳои бардурӯғ оварда расонад. Барои пешгирии ин ҳодиса, координатор дар бораи нокомии гиреҳи дурдаст ҳангоми нопадид шудани паёми набзи дил аз он хабар намедиҳад, танҳо дар сурате, ки чанде аз онҳо пай дар пай нопадид шуда бошанд.. Ҳамин тавр мо тавонистем нокомии гиреҳи координаторро дар соли 200 ошкор кунем. Бону.

Аммо барои зуд фаҳмидани он ки кадом гиреҳ аз фаъолият бозмондааст, кофӣ нест. Мо бояд дар ин бора коре кунем.

Зан

Схемаи классикӣ дар сурати нокомии усто, оғоз кардани интихоботи нав бо истифода аз яке аз мӯд универсалӣ алгоритмҳо. Бо вуҷуди ин, чунин алгоритмҳо мушкилоти маълуми конвергенсияи вақт ва дарозии худи раванди интихобот доранд. Мо тавонистем бо истифода аз нақшаи иваз кардани ҳамоҳангсоз дар шабакаи пурра пайвастшуда аз чунин таъхирҳои иловагӣ пешгирӣ кунем:

NewSQL = NoSQL+ACID

Фарз мекунем, ки мо мехоҳем транзаксияро дар гурӯҳи 50 иҷро кунем. Пешакӣ схемаи ивазкуниро муайян кунем, яъне кадом гиреҳҳо дар ҳолати нокомии координатори асосӣ транзаксияҳоро дар гурӯҳи 50 иҷро мекунанд. Ҳадафи мо нигоҳ доштани фаъолияти система дар ҳолати нокомии маркази додаҳо мебошад. Муайян кунем, ки захираи якум гиреҳ аз маркази додаҳои дигар ва захираи дуюм гиреҳ аз сеюм хоҳад буд. Ин схема як маротиба интихоб карда мешавад ва то тагйир ёфтани топологияи кластер тагйир намеёбад, яъне то ворид шудани гиреххои нав ба он (ки хеле кам рух медихад). Тартиби интихоби устоди фаъоли нав, агар устои кӯҳна ноком шавад, ҳамеша чунин хоҳад буд: захираи якум устои фаъол ва агар аз фаъолият бозмонда бошад, захираи дуюм устоди фаъол мешавад.

Ин схема нисбат ба алгоритми универсалӣ боэътимодтар аст, зеро барои фаъол кардани устои нав, муайян кардани нокомии кӯҳна кифоя аст.

Аммо муштариён чӣ гуна хоҳанд фаҳмид, ки кадом усто ҳоло кор мекунад? Дар тӯли 50 мс фиристодани маълумот ба ҳазорон муштариён ғайриимкон аст. Вазъият имконпазир аст, ки муштарӣ дархости кушодани транзаксияро мефиристад, то ҳол намедонад, ки ин усто дигар кор намекунад ва дархост ба охир мерасад. Барои пешгирӣ аз ин, муштариён ба таври тахминӣ дархост барои кушодани муомилот ба устоди гурӯҳ ва ҳарду захираи ӯ мефиристанд, аммо танҳо шахсе, ки дар айни замон устои фаъол аст, ба ин дархост посух медиҳад. Муштарӣ тамоми муоширати минбаъдаро дар доираи транзаксия танҳо бо устоди фаъол анҷом медиҳад.

Устодони эҳтиётӣ дархостҳои гирифташударо барои транзаксияҳое, ки аз они онҳо нестанд, дар навбати транзаксияҳои таваллуднашуда ҷойгир мекунанд, ки дар он муддате нигоҳ дошта мешаванд. Агар устои фаъол бимирад, устои нав дархости кушодани транзаксияҳоро аз навбати худ коркард мекунад ва ба муштарӣ посух медиҳад. Агар муштарӣ аллакай транзаксияро бо устои кӯҳна кушода бошад, пас ҷавоби дуюм сарфи назар карда мешавад (ва, албатта, чунин транзаксия анҷом намеёбад ва аз ҷониби муштарӣ такрор мешавад).

Чӣ тавр транзаксия кор мекунад

Фарз мекунем, ки муштарӣ ба координатор дархост фиристодааст, ки барои фалон субъект бо фалон калиди ибтидоӣ амалиёт кушояд. Ҳамоҳангсоз ин объектро қуфл мекунад ва онро дар ҷадвали қулф дар хотира ҷойгир мекунад. Дар ҳолати зарурӣ, ҳамоҳангсоз ин объектро аз нигаҳдорӣ мехонад ва маълумоти ҳосилшударо дар ҳолати транзаксия дар хотираи ҳамоҳангсоз нигоҳ медорад.

NewSQL = NoSQL+ACID

Вақте ки муштарӣ мехоҳад маълумотро дар транзаксия тағир диҳад, он ба ҳамоҳангсоз дархост мефиристад, ки объектро тағир диҳад ва ҳамоҳангсоз маълумоти навро дар ҷадвали ҳолати транзаксия дар хотира ҷойгир мекунад. Ин сабтро ба итмом мерасонад - ба анбор сабт карда намешавад.

NewSQL = NoSQL+ACID

Вақте ки муштарӣ маълумоти тағирёфтаи худро ҳамчун як ҷузъи амалиёти фаъол талаб мекунад, ҳамоҳангсоз ба таври зерин амал мекунад:

  • агар ID аллакай дар транзаксия бошад, пас маълумот аз хотира гирифта мешавад;
  • агар дар хотира ID мавҷуд набошад, он гоҳ маълумоти гумшуда аз гиреҳҳои нигоҳдорӣ хонда мешавад, ки бо онҳое, ки аллакай дар хотира ҳастанд, якҷоя карда мешаванд ва натиҷа ба муштарӣ дода мешавад.

Ҳамин тариқ, муштарӣ метавонад тағиротҳои худро бихонад, аммо муштариёни дигар ин тағиротро намебинанд, зеро онҳо танҳо дар хотираи координатор нигоҳ дошта мешаванд, онҳо ҳанӯз дар гиреҳҳои Кассандра нестанд.

NewSQL = NoSQL+ACID

Вақте ки муштарӣ ӯҳдадориро мефиристад, ҳолате, ки дар хотираи хадамот буд, аз ҷониби ҳамоҳангсоз дар як бастаи сабтшуда захира карда мешавад ва ҳамчун партияи сабтшуда ба анбори Кассандра фиристода мешавад. Дӯконҳо ҳама кори заруриро мекунанд, то ин баста ба таври атомӣ (комилан) татбиқ карда шавад ва ба ҳамоҳангсоз посух баргардонад, ки қуфлҳоро озод мекунад ва муваффақияти транзаксияро ба муштарӣ тасдиқ мекунад.

NewSQL = NoSQL+ACID

Ва барои баргардонидан, ҳамоҳангсоз танҳо бояд хотираи дар ҳолати транзаксия ишғолшударо озод кунад.

Дар натиҷаи беҳбудиҳои дар боло зикршуда, мо принсипҳои ACID-ро амалӣ кардем:

  • Атомизм. Ин кафолати он аст, ки ягон транзаксия қисман дар система сабт карда намешавад; ё ҳамаи зерамалҳои он ба анҷом мерасанд ё ҳеҷ кадоме ба анҷом намерасанд. Мо ин принсипро тавассути партияи сабтшуда дар Кассандра риоя мекунем.
  • Мутобиқати. Ҳар як амалиёти муваффақ, тибқи таъриф, танҳо натиҷаҳои дурустро сабт мекунад. Агар пас аз кушодани транзаксия ва иҷрои як қисми амалиётҳо маълум шавад, ки натиҷа беэътибор аст, бозпас гирифта мешавад.
  • Ҷудогона будан. Ҳангоми анҷом додани транзаксия, амалиёти ҳамзамон набояд ба натиҷаи он таъсир расонад. Амалиётҳои рақобаткунанда бо истифода аз қуфлҳои пессимистӣ дар ҳамоҳангсоз ҷудо карда мешаванд. Барои хондани берун аз транзаксия, принсипи ҷудокунӣ дар сатҳи Хонда шуд.
  • Давомнокӣ. Новобаста аз мушкилот дар сатҳҳои поёнӣ - қатъшавии система, нокомии сахтафзор - тағиротҳое, ки тавассути транзаксияи бомуваффақият анҷом дода шудаанд, бояд ҳангоми аз сар гирифтани амалиёт нигоҳ дошта шаванд.

Хондан аз рӯи индексҳо

Биёед як ҷадвали оддиро гирем:

CREATE TABLE photos (
id bigint primary key,
owner bigint,
modified timestamp,
…)

Он дорои ID (калиди асосӣ), соҳиби ва санаи тағирот мебошад. Ба шумо лозим аст, ки дархости хеле содда кунед - маълумотро дар бораи соҳиб бо санаи тағирёбии "дар рӯзи охирин" интихоб кунед.

SELECT *
WHERE owner=?
AND modified>?

Барои он ки чунин дархост зуд коркард шавад, дар DBMS классикии SQL шумо бояд индексро аз рӯи сутунҳо созед (соҳиб, тағирёфта). Мо инро ба осонӣ иҷро карда метавонем, зеро мо ҳоло кафолати ACID дорем!

Индексҳо дар C*One

Ҷадвали манбаъ бо аксҳо мавҷуд аст, ки дар он ID сабт калиди асосӣ мебошад.

NewSQL = NoSQL+ACID

Барои индекс, C*One ҷадвали наверо месозад, ки нусхаи аслии он аст. Калид бо ифодаи индекс якхела аст ва он инчунин калиди ибтидоии сабтро аз ҷадвали манбаъ дар бар мегирад:

NewSQL = NoSQL+ACID

Акнун дархости "соҳиби рӯзи охирин" метавонад ҳамчун интихоб аз ҷадвали дигар аз нав навишта шавад:

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 фоиз нигоҳ дошта мешавад.

Бо ҷорӣ шудани C*One, таъхир низ коҳиш ёфт: дар SQL, амалиёти навиштан тақрибан 4,5 мс тӯл кашид. Дар C*One - тақрибан 1,6 мс. Давомнокии транзаксия ба ҳисоби миёна камтар аз 40 мс аст, ӯҳдадорӣ дар 2 мс анҷом мешавад, давомнокии хондан ва навиштан ба ҳисоби миёна 2 мс аст. Фоизи 99-ум - ҳамагӣ 3-3,1 мс, шумораи танаффусҳо 100 маротиба кам шудааст - ҳама аз сабаби истифодаи васеъи тахминҳо.

Дар айни замон, аксари гиреҳҳои SQL Server аз кор бароварда шудаанд; маҳсулоти нав танҳо бо истифода аз C*One таҳия карда мешаванд. Мо C*One-ро ба кор дар абри худ мутобиқ кардем як-абр, ки имкон дод, ки суръати ҷобаҷогузории кластерҳои нав суръат бахшад, конфигуратсия содда карда шавад ва амалиёт автоматӣ карда шавад. Бе рамзи манбаъ, иҷрои ин кор хеле душвортар ва душвортар хоҳад буд.

Ҳоло мо барои интиқоли дигар анборҳои нигоҳдории худ ба абр кор карда истодаем - аммо ин як ҳикояи тамоман дигар аст.

Манбаъ: will.com

Илова Эзоҳ