diff --git a/docs/cluster_group.svg b/docs/cluster_group.svg new file mode 100644 index 0000000000000000000000000000000000000000..00260c54cbcbeaf872454104e59a5c74008f1fe8 Binary files /dev/null and b/docs/cluster_group.svg differ diff --git a/docs/glossary.md b/docs/glossary.md index 3343d9519d5f5da113e069d3159fe86cd5f943f7..f26b56d36fbd6e0d9633c5b754bd9933afe56c88 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -1,37 +1,248 @@ # ГлоÑÑарий ## Общие ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ -Данный документ Ñодержит ÑпиÑок терминов и их определений Ð´Ð»Ñ Ð¾Ñновных программных компонентов и понÑтий, которые иÑпользуютÑÑ Ð² Picodata. У глоÑÑÐ°Ñ€Ð¸Ñ Ð´Ð²Ðµ проÑтые цели: +Данный раздел Ñодержит опиÑание оÑновных терминов, иÑпользуемых в Picodata. -- Дать точное и непротиворечивое определение каждому термину применительно к его иÑпользованию в Picodata. -- ОбеÑпечить единообразие терминологии во внутренних документах (комментарии в коде, readme и прочие Markdown-документы в наших репозиториÑÑ…). +## ПодÑиÑтемы +### Raft +**Raft** ÑвлÑетÑÑ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð¾Ð¼ раÑпределенного конÑенÑуÑа, который нужен, чтобы неÑколько учаÑтников могли ÑовмеÑтно решить, произошло ли Ñобытие или нет, и что за чем Ñледовало. Raft иÑпользуетÑÑ Ð² Picodata Ð´Ð»Ñ ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ узлов и Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½ÑиÑтентноÑти в клаÑтере. ÐšÐ¾Ð½Ñ†ÐµÐ¿Ñ†Ð¸Ñ Ñ€Ð°Ñпределенного конÑенÑуÑа предполагает, что в клаÑтере вÑегда еÑÑ‚ÑŒ только один лидер и некоторое количеÑтво голоÑующих узлов. Ðти узлы в нормальном ÑоÑтоÑнии подтверждают легитимноÑÑ‚ÑŒ лидера, а при отказе текущего лидера организуют выборы нового. +См. [подробнее](https://raft.github.io/raft.pdf). -СпиÑок ниже будет дополнÑÑ‚ÑŒÑÑ Ð¸ иÑправлÑÑ‚ÑŒÑÑ Ð² течение времени. +### Терм (term) +Период между выборами лидера в raft-группе называетÑÑ **термом** (term). Каждый терм начинаетÑÑ Ð² момент объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð¾Ð² нового лидера. Обычно Ñто проиÑходит поÑле потери ÑвÑзи Ñ Ð¿Ñ€ÐµÐ¶Ð½Ð¸Ð¼ лидером. Терм ÑоÑтоит из двух чаÑтей: выборов и периода нормальной работы raft-группы. ИÑключением Ñлужат термы, в течение которых не удалоÑÑŒ выбрать лидера группы: у таких термов еÑÑ‚ÑŒ только Ð¿ÐµÑ€Ð²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ (выборы). +Важно помнить, что в одном терме не может ÑущеÑтвовать более одного лидера raft-группы. -## СпиÑок терминов и определений -**ИнÑтанÑ** — программный узел, входÑщий в ÑоÑтав клаÑтера. Каждый инÑÑ‚Ð°Ð½Ñ ÑвлÑетÑÑ ÑкземплÑром Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Picodata, а также репликой в ÑоÑтаве репликаÑета. Среда Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть как виртуальной, так и физичеÑкой. +### СоÑтоÑÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð² в Raft-группе <a name="raft-group"></a> +Ð’ raft-группе любой узел может быть в одном из трех ÑоÑтоÑний: -**КлаÑтер** — набор программных узлов, ÑоÑтавлÑющих отдельную группу. +**ПаÑÑивный узел (follower)** — ÑоÑтоÑние по умолчанию Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ инÑтанÑа поÑле запуÑка. Follower — обычный голоÑующий узел, который лишь отвечает на запроÑÑ‹, но не генерирует их. -**Raft** — алгоритм Ñинхронной репликации, обеÑпечивающий целоÑтноÑÑ‚ÑŒ клаÑтера (raft-группы). Raft отвечает за автоматичеÑкий выбор лидера raft-группы (лидер может менÑÑ‚ÑŒÑÑ). Ð’ raft-группе еÑÑ‚ÑŒ лидер, а оÑтальные узлы называютÑÑ follower’ами. +**Кандидат в лидеры (candidate)** — ÑоÑтоÑние инÑтанÑа во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð¾Ð² лидера. Когда начинаетÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ терм, инÑтанÑÑ‹ в ÑтатуÑе follower увеличивают значение терма и переходÑÑ‚ в ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ‚Ð¾Ð², голоÑуют Ñами за ÑÐµÐ±Ñ Ð¸ затем ждут результатов выбора. Выходов из Ñтого ÑоÑтоÑÐ½Ð¸Ñ Ñ‚Ñ€Ð¸: -**ОтказоуÑтойчивоÑÑ‚ÑŒ** — повышение надежноÑти данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ репликации. +- Кандидат побеждает в выборах и ÑтановитÑÑ Ð»Ð¸Ð´ÐµÑ€Ð¾Ð¼. +- Кандидат возвращаетÑÑ Ð² ÑÑ‚Ð°Ñ‚ÑƒÑ follower, так как другой инÑÑ‚Ð°Ð½Ñ ÑтановитÑÑ Ð»Ð¸Ð´ÐµÑ€Ð¾Ð¼. +- Кандидат оÑтаетÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ‚Ð¾Ð¼, так как не удаетÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ лидера. Raft увеличивает терм еще раз и организует повторные выборы. -**РепликациÑ** — Ñоздание и поддержание в актуальном ÑоÑтоÑнии резервных копий инÑтанÑов. +**Лидер raft-группы (leader)** — избранный узел, который отвечает за обработку запроÑов и репликацию raft-журнала. -**Фактор репликации** — чиÑло инÑтанÑов в репликаÑете. +### Raft-лидер +**Лидер в raft-группе** — Ñто один из узлов, который неÑет ответÑтвенноÑÑ‚ÑŒ за репликацию raft-журнала. Лидер избираетÑÑ Ð½Ð° голоÑовании и признаетÑÑ Ñ‚Ð°ÐºÐ¾Ð²Ñ‹Ð¼ вÑеми учаÑтниками голоÑованиÑ. Задача лидера ÑоÑтоит в приеме Ñообщений от клиентов клаÑтера и отправке Ñообщений на узлы клаÑтера таким образом, чтобы в любой момент времени вÑе узлы имели конÑиÑтентную, непротиворечивую верÑию raft-журнала. ЛидерÑтво в Raft предполагает, что вÑе оÑтальные узлы признают приоритет верÑии журнала, предлагаемую лидером. -**РепликаÑет** — буквально «набор реплик», ÑкземплÑров приложений, в которых хранитÑÑ Ð¾Ð´Ð¸Ð½ и тот же набор реплицированных данных. Ð’ завиÑимоÑти от роли реплик, в Picodata еÑÑ‚ÑŒ реплики _active (RW)_ и _standby (RO)_. +ЕÑли лидер ÑтановитÑÑ Ð½ÐµÐ´Ð¾Ñтупным, то алгоритм Raft организует выборы нового лидера Ñреди оÑтавшихÑÑ ÑƒÑ‡Ð°Ñтников. ЕÑли поÑле Ñтих выборов прежний лидер Ñнова приÑоединитÑÑ Ðº клаÑтеру, он уже будет иметь права обычного голоÑующего узла (но не лидера). -**Failure domain** — букв. _"домен отказа"_. Термин обозначает зону доÑтупноÑти инÑтанÑа Picodata, Ñ‚.е. признак физичеÑкого Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñервера, на котором запущен инÑÑ‚Ð°Ð½Ñ (географичеÑкий регион, датацентр, Ñтойка и Ñ‚.д.). Зона доÑтупноÑти иÑпользуетÑÑ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы в один репликаÑет по возможноÑти попадали инÑтанÑÑ‹ Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼ размещением, Ð¿Ð¾Ð²Ñ‹ÑˆÐ°Ñ Ñ‚Ð°ÐºÐ¸Ð¼ образом отказоуÑтойчивоÑÑ‚ÑŒ как отдельного репликаÑета, так и клаÑтера в целом. +### Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ raft-журнала +**Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ raft-журнала** нужна Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы на каждом узле клаÑтера (raft-группы) была Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð°Ñ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´. Когда лидеру группы нужно добавить в журнал новую команду, он Ñначала отправлÑет ее вÑем узлам, ждет Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи (commit), и лишь затем добавлÑет Ñту команду в ÑобÑтвенный журнал. Ð’ Ñлучае, еÑли журнал обычного узла отличаетÑÑ Ð¾Ñ‚ журнала лидера, то лидер наÑтаивает на приоритете Ñвоего журнала и перезапиÑывает журнал обычного узла, ÑÑ‡Ð¸Ñ‚Ð°Ñ ÐµÐ³Ð¾ уÑтаревшим. +Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ алгоритм Raft придерживаетÑÑ Ð´Ð²ÑƒÑ… правил при Ñравнении журналов разных узлов: -**Bucket** (бакет) — Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð½ÐµÐ´ÐµÐ»Ð¸Ð¼Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…, обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾ÑÑ‚ÑŒ данных (Ñ‚. е. их нахождение на каком-то одном репликаÑете). +- ЕÑли запиÑи имеют одинаковые индекÑÑ‹ и термы, то они Ñодержат одинаковые команды. +- ЕÑли запиÑи имеют одинаковые индекÑÑ‹ и термы, то ÑчитаетÑÑ, что вÑе предыдущие запиÑи ÑоответÑтвующих журналов одинаковы. -**Горизонтальное маÑштабирование** — шардинг, Ñ‚.е. раÑпределение bucket'ов между различными репликаÑетами, находÑщихÑÑ Ð½Ð° разных Ñерверах. Каждый такое репликаÑет называетÑÑ ÑˆÐ°Ñ€Ð´Ð¾Ð¼. +Так как а) запиÑи в журнале не могут менÑÑ‚ÑŒ порÑдок и б) каждой запиÑи ÑоответÑтвует только один Ð¸Ð½Ð´ÐµÐºÑ Ð¸ терм, то указанные выше правила гарантирует конÑиÑтентноÑÑ‚ÑŒ журнала. -**Discovery** — алгоритм взаимного Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¸Ð½ÑтанÑами друг друга во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² клаÑтер. -**Space** (ÑпейÑ) — проÑтранÑтво Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… в СУБД. Ð’ резидентных СУБД ÑÐ¿ÐµÐ¹Ñ ÑвлÑетÑÑ Ñинонимом _таблицы_ из релÑционных СУБД. -**Grade** (грейд) — Ñпецифичный Ð´Ð»Ñ Picodata ÑпоÑоб Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑоÑтоÑÐ½Ð¸Ñ Ð¸Ð½ÑтанÑа. Грейд отражает то, как инÑÑ‚Ð°Ð½Ñ Ñконфигурирован его ÑоÑедÑми. СущеÑтвуют _текущий_ (current) и _целевой_ (target) типы грейдов. За приведение первого ко второму отвечает _governor_ (губернатор). +### Web UI +**Веб-конÑоль** — Ñто вариант графичеÑкого интерфейÑа к функциÑм Picodata. Ð”Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´ÑиÑтема находитÑÑ Ð² разработке и будет предÑтавлена в Ñледующем релизе Picodata. Веб-конÑоль в наглÑдном виде отображает и позволÑет менÑÑ‚ÑŒ конфигурацию и ÑоÑтав клаÑтера, параметры отдельных узлов, Ñхему данных и Ñ‚.д. Веб-конÑоль ÑвлÑетÑÑ ÑƒÐ´Ð¾Ð±Ð½Ñ‹Ð¼ инÑтрументов локального и удаленного админиÑÑ‚Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Picodata. + +### CLI (Command-line interface) +**CLI** — Ñто Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñтроки Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ðº отдельными инÑтанÑами, так и вÑем клаÑтером Picodata. + +### ДиÑкавери (discovery) +**Discovery** — алгоритм, по которому инÑтанÑÑ‹ обнаруживают друг друга. Ðтот шаг необходим на Ñтарте каждого инÑтанÑа Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы клаÑтера. + +### Vshard +**Vshard** — библиотека из ÑкоÑиÑтемы СУБД Tarantool, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð² Picodata Ð´Ð»Ñ Ð³Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ â€” ÑÐµÐ³Ð¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… по неÑкольким узлам в клаÑтере. Ðто ÑтановитÑÑ Ð²Ð°Ð¶Ð½Ñ‹Ð¼ по мере ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐ¼Ð° хранимых данных, ввода в Ñтрой новых узлов — Ñ‚.е. роÑта клаÑтера. +Библиотека Vshard вÑтроена в Picodata и ÑвлÑетÑÑ Ð½ÐµÐ¾Ñ‚ÑŠÐµÐ¼Ð»ÐµÐ¼Ð¾Ð¹ ее чаÑтью. +Ð’ клиентÑких интерфейÑах Vshard желательно прÑтать за фаÑадом, но при оÑтрой необходимоÑти ничто не помешает им воÑпользоватьÑÑ. + +## СущноÑти +Ð’ начале идет общее обозначение термина, затем в Ñкобках указан предпочтительный вариант ÑƒÐ¿Ð¾Ñ‚Ñ€ÐµÐ±Ð»ÐµÐ½Ð¸Ñ Ð² коде (без пробелов в “змеином региÑтреâ€). + +### ИнÑÑ‚Ð°Ð½Ñ (instance) <a name="instance"></a> +**Обозначение единицы клаÑтера СУБД и Ñервера приложений** +При опиÑании клаÑтера мы различаем программный и логичеÑкий уровни. + +Ðа программном уровне единицей клаÑтера ÑвлÑетÑÑ ÑкземплÑÑ€ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Picodata, также на техничеÑком жаргоне называемый инÑтанÑом. Среда Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть как виртуальной, так и физичеÑкой. Ð’ разрезе операционных ÑиÑтем каждый инÑÑ‚Ð°Ð½Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð´Ð°ÐµÑ‚ два процеÑÑа: ÑобÑтвенно ÑкземплÑÑ€ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ вÑпомогательный процеÑÑ (supervisor), управлÑющий жизненным циклом первого. + +Ðа логичеÑком уровне единицей клаÑтера ÑвлÑетÑÑ ÑƒÐ·ÐµÐ». Под узлом, в завиÑимоÑти от контекÑта, может пониматьÑÑ ÐºÐ°Ðº Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñ‡Ð¸ÑÐ»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð°, Ð¾Ð±Ð»Ð°Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¿ÑƒÐ»Ð¾Ð¼ реÑурÑов (физичеÑкий Ñервер, Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð°, контейнер), так и программный ÑкземплÑÑ€ Picodata, уже входÑщий в ÑоÑтав клаÑтера. + +Также инÑÑ‚Ð°Ð½Ñ ÑвлÑетÑÑ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ¾Ð¹ в ÑоÑтаве репликаÑета и может входить в указанную при его запуÑке группу инÑтанÑов. + +### КлаÑтер (cluster) <a name="cluster"></a> +**КлаÑтер** — набор логичеÑких и программных узлов, ÑоÑтавлÑющих отдельную централизованно управлÑемую группу Ñ Ð¾Ð±Ñ‰Ð¸Ð¼ проÑтранÑтвом хранениÑ. + +**КлаÑтер** ÑвлÑетÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ крупной ÑущноÑтью в ÑиÑтеме хранениÑ, в некотором ÑмыÑле он и еÑÑ‚ÑŒ ÑиÑтема хранениÑ. Внутри клаÑтера находÑÑ‚ÑÑ Ð¸Ð½ÑтанÑÑ‹, объединенные в репликаÑеты (Ñм. ниже). Дополнительно, в Picodata иÑпользуетÑÑ Ð¿Ð¾Ð½Ñтие групп инÑтанÑов — отдельного ÑпоÑоба более гибко управлÑÑ‚ÑŒ большим чиÑлом инÑтанÑов в завиÑимоÑти от их ролей, характера нагрузки и топологии Ñети. + +Схематичное предÑтавление клаÑтера, в ÑоÑтаве которого еÑÑ‚ÑŒ некоторое чиÑло инÑтанÑов, репликаÑетов и групп инÑтанÑов, показано ниже.<a name="cluster_group"></a> + + + +### РепликаÑет (replicaset) <a name="replicaset"></a> +**РепликаÑет** — буквально «набор реплик», ÑкземплÑров приложений, в которых хранитÑÑ Ð¾Ð´Ð¸Ð½ и тот же набор данных. Реплика в ÑоÑтаве репликаÑета может быть в одном из двух ÑоÑтоÑний: + +- Ð°ÐºÑ‚Ð¸Ð²Ð½Ð°Ñ (active) — доÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð½Ð° запиÑÑŒ, иногда ее называют маÑтером или лидером репликаÑета. +- Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ (standby) — доÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на чтение, read-only. +Ð’ нормальных уÑловиÑÑ… в репликаÑете активной ÑвлÑетÑÑ Ñ€Ð¾Ð²Ð½Ð¾ одна реплика, но в отдельных ÑлучаÑÑ… их может быть неÑколько или не быть вообще. + +### Лидер (leader) +<p name="leader">Ð’ Picodata еÑÑ‚ÑŒ две разновидноÑти лидеров:</p> + +- “raft-лидер†— лидер raft-группы, +- и “репликаÑет-лидер†— лидер репликаÑета. + +Термин _лидер_ чаÑто путают Ñ _маÑтером_ применительно к репликации Tarantool. Ð’ Picodata они хоть и близки, но вÑе же отличаютÑÑ Ð¿Ð¾ ÑмыÑлу. Под _маÑтером_ Ñледует понимать инÑтанÑ, который выполнÑет пользовательÑкие DML-операции (insert / update / delete). Ðа практике чаще вÑего такой инÑÑ‚Ð°Ð½Ñ Ð¾Ð´Ð¸Ð½, и в таком Ñлучае оба термина опиÑывают один и тот же инÑÑ‚Ð°Ð½Ñ (отÑюда и путаница), но в Tarantool архитектурно заложена возможноÑÑ‚ÑŒ веÑти запиÑÑŒ на неÑкольких узлах репликаÑета одновременно — Ñ‚.н. режим мультимаÑтера (multi-master). Даже в таком режиме операции DDL (`create_space` и Ñ‚.д.) должен выполнÑÑ‚ÑŒ лишь один инÑÑ‚Ð°Ð½Ñ Ð¸Ð· вÑех, и здеÑÑŒ ÑтановитÑÑ Ð²Ð°Ð¶Ð½Ð¾ отличать _лидера_ от _маÑтера_. ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что в Picodata режим мультимаÑтера пока не реализован, Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸ код должны иÑпользовать Ñти термины корректно. + +### Группа инÑтанÑов (instance_group) +**Группа инÑтанÑов** — Ñто логичеÑкое объединение инÑтанÑов Ñ Ð¾Ð±Ñ‰Ð¸Ð¼ фактором репликации и ролÑми. ÐšÐ°Ð¶Ð´Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° шардируетÑÑ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ð¾. + +ÐšÐ¾Ð½Ñ†ÐµÐ¿Ñ†Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿ ÑвлÑетÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¾Ð¼ [vshard_group](https://www.tarantool.io/ru/doc/latest/book/cartridge/cartridge_cli/commands/replicasets/#list-vshard-groups) из Cartridge, но дополнительно позволÑет назначать роли группам (в Cartridge роли наÑтраивалиÑÑŒ индивидуально Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ репликаÑета). + +**Группа инÑтанÑов** ÑвлÑетÑÑ Ð±Ð¾Ð»ÐµÐµ крупным образованием, чем репликаÑет. См поÑÑнительную [картинку](glossary.md#cluster_group). + +Каждый шардированный ÑÐ¿ÐµÐ¹Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ одной конкретной инÑтанÑ-группе. Ðа инÑтанÑах из других групп ÑÐ¿ÐµÐ¹Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑки не ÑоздаетÑÑ. Ðо Ñ‚.к. Ñхема данных ÑвлÑетÑÑ Ð¾Ð±Ñ‰ÐµÐ¹ на веÑÑŒ клаÑтер, Ñоздавать два ÑпейÑа Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ именем в разных группах не разрешаетÑÑ. ПринадлежноÑÑ‚ÑŒ инÑтанÑ-группе определÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÑˆÐ°Ñ€Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… ÑпейÑов, глобальные ÑпейÑÑ‹ ÑоздаютÑÑ Ð¿Ð¾Ð²Ñюду. + +### Домен отказа (failure_domain) +**Домен отказа** ÑвлÑетÑÑ Ð¿Ñ€Ð¸Ð·Ð½Ð°ÐºÐ¾Ð¼ физичеÑкого раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñервера, на котором запущен инÑтанÑ. Указание домена отказа позволÑет обозначить наличие единой точки отказа у двух инÑтанÑов. СмыÑл данного параметра ÑоÑтоит в том, чтобы в один репликаÑет попадали инÑтанÑÑ‹ из разных физичеÑких локаций, что повышает отказоуÑтойчивоÑÑ‚ÑŒ клаÑтера. + +**Домен отказа** предÑтавлÑет Ñобой набор пар “ключ=значениеâ€, которые ÑоответÑтвуют отдельным зонам (географичеÑкий регион, датацентр, Ñтойка и Ñ‚.д.). Зоны задаютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼ иÑÑ…Ð¾Ð´Ñ Ð¸Ð· фактичеÑкой конфигурации оборудованиÑ, будь то виртуальные машины в облаке (`“region=euâ€`) или физичеÑкие Ñервера (`“dc=mskâ€`). Домен отказа может включать неÑколько зон (`“dc=msk,srv=msk-1â€`). + +Можно иÑпользовать любые ключи и значениÑ. Picodata не делает предположений об иерархии зон или их физичеÑком ÑмыÑле и проÑто Ñравнивает Ñтроки. Тем не менее, чтобы избежать человечеÑких ошибок, Picodata требует, чтобы набор зон (ключей) на вÑех инÑтанÑах был одинаковым. + +ЕÑли домены отказа двух инÑтанÑов имеют Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну общую зону (и ключ, и значение), то допуÑкаетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ одновременной потери ÑвÑзи Ñ Ð¾Ð±Ð¾Ð¸Ð¼Ð¸. ПоÑтому инÑтанÑÑ‹, делÑщие общую зону, не будут объединены в репликаÑет. Picodata также ÑтремитÑÑ Ñ€Ð°Ñпределить голоÑующие raft-узлы таким образом, чтобы их домены отказа имели по минимуму общих зон. + +### Фактор репликации (replication_factor) +**Фактор репликации** — чиÑло инÑтанÑов в репликаÑете. ЗадаетÑÑ Ð¾Ð±Ñ‰Ð¸Ð¼ на группу инÑтанÑов (так же как и набор ролей). Отредактировать фактор репликации, Ñохраненный в конфигурации клаÑтера, можно командой `picodata set-replication-factor`. Редактирование конфигурации ÑказываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на вновь добавлÑемых инÑтанÑах, но не затрагивает уже работающие. + + +### Бакет (bucket) <a name="bucket"></a> +**Bucket (бакет)** — Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð½ÐµÐ´ÐµÐ»Ð¸Ð¼Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…, обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¸Ñ… локальноÑÑ‚ÑŒ (Ñ‚. е. нахождение на каком-то одном репликаÑете). + +### Ð¡Ð¿ÐµÐ¹Ñ (space) +**Space (ÑпейÑ)** — проÑтранÑтво Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…. Ð’ резидентных СУБД ÑÐ¿ÐµÐ¹Ñ ÑвлÑетÑÑ Ñинонимом таблицы из релÑционных СУБД. Ð’ Picodata еÑÑ‚ÑŒ Ñледующие виды ÑпейÑов: + +1. Глобальные (_global_) — их Ñодержимое реплицируетÑÑ Ð½Ð° веÑÑŒ клаÑтер. +2. Шардированные (_sharded_) — каждый репликаÑет хранит лишь чаÑÑ‚ÑŒ общего + набора данных. Данные реплицируютÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ репликаÑета. + +Метаданные вÑех ÑпейÑов Picodata приÑутÑтвуют на вÑех узлах клаÑтера. +ФактичеÑки Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ ÑущеÑтвует понÑÑ‚Ð¸Ñ â€œÐ½Ðµ клаÑтерных†+ÑпейÑов, он лишь выбирает между ÑтратегиÑми ÑˆÐ°Ñ€Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ репликации +тех ÑпейÑов, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ он работает. + +### Ð˜Ð½Ð´ÐµÐºÑ (index) +**ИндекÑ** — Ñто ÑÐ¿ÐµÑ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ñтруктура данных, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ группу ключевых значений и указателей. Ð˜Ð½Ð´ÐµÐºÑ ÑтроитÑÑ Ð¿Ð¾ какому-либо одному Ñтолбцу таблицы и иÑпользуетÑÑ Ð´Ð»Ñ Ñффективного поиÑка значений Ñтого Ñтолбца. У каждого ÑпейÑа обÑзательно должен быть первичный Ð¸Ð½Ð´ÐµÐºÑ Ð¸ опционально некоторое чиÑло вторичных индекÑов. + +### LSN (log sequence number) +Термин **LSN** (log sequence number) отноÑитÑÑ Ðº архитектурным оÑобенноÑÑ‚Ñм Tarantool, в котором вÑе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð‘Ð” фикÑируютÑÑ Ð² журнале упреждающей запиÑи (WAL, write-ahead log) в виде отдельных запиÑей. ÐšÐ°Ð¶Ð´Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ предÑтавлÑет Ñобой Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° изменение данных (`insert` | `update` | `delete`) и маркируетÑÑ Ð¼Ð¾Ð½Ð¾Ñ‚Ð¾Ð½Ð½Ð¾ возраÑтающим номером LSN. Ðаибольший номер обозначает номер наиболее Ñвежей запиÑи, находÑщейÑÑ Ð² конце журнала WAL. + +### Vclock (vector clock) +Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² Tarantool предполагает обмен запиÑÑми между репликами в репликаÑете. Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ñтому обмену, на каждой отдельной реплике имеетÑÑ Ñпециальный набор запиÑей, полученный от разных реплик Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ LSN — Ñто и еÑÑ‚ÑŒ **Vclock** (vector clock, векторные чаÑÑ‹). Vclock опиÑывает ÑоÑтоÑние БД Ð´Ð»Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ инÑтанÑа в репликаÑете. + +Vclock репликаÑет-лидера играет важную роль в поддержании конÑиÑтентноÑти при переключении лидера (consistent switchover). Ð’ Ñлучае аварийного Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (фейловера, failover), когда конÑиÑтентноÑÑ‚ÑŒ Ñохранить невозможно и она жертвуетÑÑ Ð² угоду доÑтупноÑти, отÑлеживание vclock позволÑет Ñтроить метрики точек воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (RPO, recovery point objective). + +### Сетевой Ð°Ð´Ñ€ÐµÑ (address) <a name="address"></a> +**Сетевой адреÑ** — Ñто ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ `host:port`, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ ÑвÑзи инÑтанÑов друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼ по Ñети. Другие Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑвÑзки `host:port` (например URL, URI) мы ÑтараемÑÑ Ð¸Ñкоренить. РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ `user:pass@host:port` вÑе равно определÑетÑÑ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð¾Ð¼ _адреÑ_. + +### Грейд (grade) +**Grade (грейд)** — Ñпецифичный Ð´Ð»Ñ Picodata ÑпоÑоб Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑоÑтоÑÐ½Ð¸Ñ Ð¸Ð½ÑтанÑа. Грейд отражает то, как инÑÑ‚Ð°Ð½Ñ Ñконфигурирован его ÑоÑедÑми. СущеÑтвуют текущий (`current`) и целевой (`target`) типы грейдов. За приведение первого ко второму отвечает governor (губернатор). + +### Губернатор (governor) +**Governor (губернатор)** — внутреннÑÑ Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑущноÑÑ‚ÑŒ, управлÑÑŽÑ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñми и жизненными циклами инÑтанÑов в ÑоответÑтвие Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми их грейдов. "Губернатор" выполнÑетÑÑ Ð½Ð° лидере raft-группы. + +### Крейт (crate) +**Крейт** (буквально “Ñщикâ€) — Ð½Ð°Ð¸Ð¼ÐµÐ½ÑŒÑˆÐ°Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑÐºÐ°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° проекта, напиÑанного на Rust. С точки Ð·Ñ€ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ñтора rustc, любой отдельный фрагмент кода ÑвлÑетÑÑ ÐºÑ€ÐµÐ¹Ñ‚Ð¾Ð¼. Из одного крейта может быть Ñкомпилирован бинарный иÑполнÑемый файл, либо разделÑÐµÐ¼Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ°. ÐеÑколько крейтов могут вмеÑте ÑоÑтавлÑÑ‚ÑŒ пакет (package). Пакет может ÑоÑтоÑÑ‚ÑŒ также и из одного крейта. ЕÑли крейтов в пакете неÑколько, то из них только один может предоÑтавлÑÑ‚ÑŒ разделÑемую библиотеку. + +### Снапшот (snapshot) <a name="snapshot"></a> +**Снапшот**, в Ñамом широком ÑмыÑле Ñтого Ñлова — Ñто Ñнимок ÑоÑтоÑÐ½Ð¸Ñ Ñ€Ð°Ñпределенного конечного автомата. Ð’ контекÑте Picodata можно говорить о двух незавиÑимых (почти) раÑпределенных конечных автоматах, и, ÑоответÑтвенно, о двух видах Ñнапшотов — Tarantool и Raft. + +Picodata прилагает вÑе уÑилиÑ, чтобы Ñти ÑоÑтоÑÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ одинаковыми на каждом узле клаÑтера, но Ñ‚.к. Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° нодах проиÑходÑÑ‚ через применение команд из журнала (WAL или raft), то даже в штатном режиме ÑлучаютÑÑ Ð½Ðµ одновременно. + +Более детально, ÑоÑтоÑние инÑтанÑа включает в ÑÐµÐ±Ñ Ð´Ð²Ðµ чаÑти: + +- перÑиÑтентные данные, которые можно Ñериализовать и Ñохранить на диÑк; +- транзиторное (transient) ÑоÑтоÑние — вÑе Ñтруктуры, которые Tarantool Ñтроит в оперативной памÑти Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ DML-запроÑов. + +См. также: + +- [RFC — Storage schema — Raft snapshot](https://docs.google.com/document/d/1MEpGnpKKj6WezLKytvvonZzbpy1tlWtAK5ccxaeAOrE/edit#heading=h.687c3wywf9ub) +- [Tarantool — Persistence](https://www.tarantool.io/en/doc/latest/concepts/data_model/persistence/) + + +## ПроцеÑÑÑ‹ и алгоритмы +### ÐšÐ¾Ð¼Ð¿Ð°ÐºÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ raft-журнала (raft log compaction) +**КомпактизациÑ** — процеÑÑ, не допуÑкающий беÑконтрольного роÑта журнала запиÑей Raft. ÐšÐ¾Ð¼Ð¿Ð°ÐºÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ Ð² удалении чаÑти журнала, отноÑÑщейÑÑ Ðº Ñделанному ранее Ñнапшоту. + +### Создание Ñнапшотов (snapshotting) +**Создание Ñнапшотов** — процеÑÑ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑкого ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑоÑтоÑÐ½Ð¸Ñ Ð¸Ð½ÑтанÑа на жеÑткий диÑк. Ðаличие Ñнапшотов (Ñ‚.е. Ñнимков ÑоÑтоÑниÑ) позволÑÑŽÑ‚ воÑÑтановить инÑÑ‚Ð°Ð½Ñ Ð² прежнем виде поÑле его перезапуÑка. + +### ФенÑинг (fencing) +**ФенÑинг** — Ñто подпиÑÑŒ вÑех запроÑов в клаÑтере номером Ñпохи или терма, и отказ обÑлуживать запроÑÑ‹ Ñ ÑƒÑтаревшей Ñпохой. Данный инÑтрумент иÑпользуетÑÑ Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы раÑпределенной блокировки, Ñ‚.е. Ñитуации, когда из неÑкольких узлов нужно гарантированно выбрать один Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа. + +### CaS (compare and swap) <a name="cas"></a> +**Compare and swap** — оÑобый алгоритм в ÑоÑтаве Picodata. Он обеÑпечивает уровень изолÑции транзакций [serializable](glossary.md#isolation), тем Ñамым не допуÑÐºÐ°Ñ Ñлучаев неÑоглаÑованноÑти данных в результате Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑƒÑ€Ð¸Ñ€ÑƒÑŽÑ‰Ð¸Ñ… запроÑов/транзакций. Таким Ñлучаем, например, может быть ÑитуациÑ, когда одна Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð·Ð°Ñ‚Ð¸Ñ€Ð°ÐµÑ‚ результат дейÑÑ‚Ð²Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹, выполнÑющейÑÑ Ð² тоже времÑ. _Compare and swap_ решает Ñту проблему Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ проверки предиката, Ñ‚.е. менÑет данные какого-либо параметра клаÑтера только в том Ñлучае, еÑли иÑходное ожидаемое значение Ñтого параметра ÑоответÑтвует иÑходному фактичеÑкому. +ТехничеÑки данный алгоритм реализован в виде хранимой процедуры `proc_cas()`. + +### БутÑтрап (bootstrap) <a name="bootstrap"></a> +**Bootstrap** — процеÑÑ Ð¿ÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ñ€Ð¾Ð·Ð½ÐµÐ½Ð½Ñ‹Ñ… инÑтанÑов в единый клаÑтер. Ð’ контекÑте Picodata речь обычно идет о бутÑтрапе инÑтанÑа, когда инÑÑ‚Ð°Ð½Ñ Ð·Ð°Ð¿ÑƒÑкаетÑÑ Ð² чиÑтой директории без Ñнапшотов. При необходимоÑти можно уточнить, бутÑтрапитÑÑ _лидер реплиаÑета_ или _read-only-реплика_ — алгоритмы Ð´Ð»Ñ Ð½Ð¸Ñ… отличаютÑÑ. + +Случай, когда инÑÑ‚Ð°Ð½Ñ Ð·Ð°Ð¿ÑƒÑкаетÑÑ Ð½Ð° ÑущеÑтвующих Ñнапшотах, называетÑÑ _воÑÑтановлением из Ñнапшота_ (recovery from a snapshot). Ðтот процеÑÑ ÑопутÑтвует перезапуÑку инÑтанÑа. + +Другой ÑкÑплуатационный Ñценарий, когда при перезапуÑке удалÑÑŽÑ‚ÑÑ Ð²Ñе данные инÑтанÑа, называют _ребутÑтрапом_ (rebootstrap), Ñ‚.е. повторным запуÑком. РебутÑтрап вÑегда ÑопровождаетÑÑ Ñменой `raft_id`, Ñ…Ð¾Ñ‚Ñ `instance_id` может при Ñтом переиÑпользоватьÑÑ. + +_БутÑтрап клаÑтера_ — бутÑтрап первого инÑтанÑа + [приÑоединение](#joining) некоторого количеÑтва других. + +_БутÑтрап репликаÑета_ — бутÑтрап лидера репликаÑета + приÑоединение к нему реплик. + +### ПриÑоединение (joining) инÑтанÑа к клаÑтеру <a name="joining"></a> +_ПриÑоединение инÑтанÑа_ близко по ÑмыÑлу к [бутÑтрапу](#bootstrap), но делает акцент на процеÑÑах, проиÑходÑщих в Ñамом клаÑтере. Чтобы инÑÑ‚Ð°Ð½Ñ Ð¼Ð¾Ð³ приÑоединитьÑÑ, другие (уже ÑущеÑтвующие) члены клаÑтера должны Ñначала Ñохранить информацию о нем в raft-журнал. + +### Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ (replication) <a name="replication"></a> +**РепликациÑ** — один из механизмов [актуализации](#actualization) данных между инÑтанÑами. Ð’ Picodata ÑущеÑтвует два вида репликации: Tarantool (внутри [репликаÑета](#replicaset)) и Raft (Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð° веÑÑŒ клаÑтер). Под термином Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ имеют в виду переÑылку запиÑей журналов (`wal` или `raft` в завиÑимоÑти от того, о каком виде репликации идет речь). + +### ÐÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ (catch-up) инÑтанÑа <a name="actualization"></a> +ÐÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ â€” Ñто по Ñути ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… между инÑтанÑами. СущеÑтвует два механизма актуализации: поÑредÑтвом [репликации](#replication) журнала (catch-up by log replication), и поÑредÑтвом Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ [Ñнапшота](#snapshot) (catch-up by snapshot). + +ÐÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñнапшотом поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Raft, но не Ð´Ð»Ñ Tarantool. Она требуетÑÑ, когда на raft-лидере отÑутÑтвуют нужные запиÑи в raft-журнале. ЕÑли Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð°Ñ ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ñходит Ñ WAL Tarantool, пользователю не оÑтаетÑÑ Ð²Ñ‹Ð±Ð¾Ñ€Ð° кроме как делать [ребутÑтрап](#bootstrap) инÑтанÑа. + +### Proc API + +**Proc API** — Stored Procedures API (хранимые процедуры). Хранимыми процедурам ÑвлÑÑŽÑ‚ÑÑ Rust-функции Ñ Ð°Ñ‚Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ `#[tarantool::proc]`. Процедуры могут быть вызваны Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ любого тарантул-коннектора, в чаÑтноÑти, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Lua-Ð¼Ð¾Ð´ÑƒÐ»Ñ `net.box` или Rust-Ð¼Ð¾Ð´ÑƒÐ»Ñ `tarantool::network::client`. Ð’ Picodata хранимые процедуры иÑпользуютÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÑƒÐ½Ð¸ÐºÐ°Ñ†Ð¸Ð¸ между инÑтанÑами. + +Примерами хранимых процедур в Picodata могут Ñлужить: +- `.proc_cas` (низкоуровневый вызов механизма [Compare and Swap](#cas) на выбранном инÑтанÑе); +- `.proc_read_index` (получение текущего Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ raft-индекÑа выбранного инÑтанÑа). + +## Общие концепции +### ОтказоуÑтойчивоÑÑ‚ÑŒ <a name="failsoft"></a> +**ОтказоуÑтойчивоÑÑ‚ÑŒ** — ÑвойÑтво клаÑтера ÑохранÑÑ‚ÑŒ наличие и доÑтупноÑÑ‚ÑŒ данных при выходе из ÑÑ‚Ñ€Ð¾Ñ Ñ‡Ð°Ñти узлов. Ð’ Picodata отказоуÑтойчивоÑÑ‚ÑŒ обеÑпечиваетÑÑ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸ÐµÐ¹ и грамотным проектированием алгоритмов. + +### Горизонтальное маÑштабирование <a name="sharding"></a> +**Горизонтальное маÑштабирование** (оно же Ñегментирование или шардирование, sharding) — подход, предполагающий разделение данных на Ñегменты (бакеты, buckets), которые могут хранитьÑÑ Ð½Ð° отдельных репликаÑетах клаÑтера. С точки Ð·Ñ€ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° хранимых данных, каждый репликаÑет называетÑÑ ÑˆÐ°Ñ€Ð´Ð¾Ð¼. Деление на шарды — Ñто еще один вариант логичеÑкого Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ñтера, но без привÑзки к Ñерверам, на которых выполнÑÑŽÑ‚ÑÑ Ð¸Ð½ÑтанÑÑ‹. + +### ЛинеаризуемоÑÑ‚ÑŒ <a name="linearizability"></a> +Ð’ контекÑте раÑпределенных баз данных **линеаризуемоÑÑ‚ÑŒ** обозначает ÑвойÑтво хранилища обеÑпечивать целоÑтноÑÑ‚ÑŒ и ÑоглаÑованноÑÑ‚ÑŒ данных на разных репликах БД. ЛинеаризуемоÑÑ‚ÑŒ в Picodata обеÑпечиваетÑÑ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð¾Ð¼ конÑенÑуÑа Raft, который обновлÑет данные на маÑтер-реплике только поÑле того, как они запиÑаны на резервные реплики. + + +Ð’ Ñхеме данных клаÑтера Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ шардированного ÑпейÑа (таблицы) задаетÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ â€” _ключ шардированиÑ_, ÑоÑтоÑщий из одной или неÑкольких колонок. Пример: + +``` +sharding_key: + - id + - name +``` +### Уровень изолÑции транзакций <a name="isolation"></a> +Уровень изолÑции транзакций ÑвлÑетÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из компонентов ACID (_atomicity, consistency, isolation, durability_), который предÑтавлÑет Ñобой набор требований к СУБД ÑоглаÑно Ñтандарту [ANSI/ISO SQL](https://en.wikipedia.org/wiki/ISO/IEC_9075). Уровень изолÑции транзакций определÑет Ñтепень ÑтрогоÑти, которую СУБД применÑет к возможной неÑоглаÑованноÑти данных при иÑполнении неÑкольких транзакций одновременно. Различают Ñледующие уровни (по мере Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ ÑтрогоÑти и уÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð¾Ðº): + +- **Read uncommitted**. Ðизший уровень изолÑции, допуÑкающий чтение незафикÑированных данных. Ð’ результат Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ попаÑÑ‚ÑŒ данные от других, еще не завершившихÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ запиÑи. +- **Read committed.** Чтение уже зафикÑированных данных. Данный уровень гарантирует, что в момент Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ðµ были ранее зафикÑированы, однако позволÑет изменÑÑ‚ÑŒ данные Ñразу поÑле Ñтого. Т.е. повторное чтение внутри транзакции уже не гарантирует получение такого же набора данных. +- **Repeatable read**. ПовторÑемое чтение данных, при которых Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ данные до тех пор, пока Ñ‡Ð¸Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ð¸Ñ… Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð½Ðµ завершилаÑÑŒ. +- **Serializable**. ÐаивыÑший уровень изолÑции, предполагающий полное упорÑдочивание (Ñериализацию) транзакций. Результат Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких параллельных транзакций должен быть таким, как еÑли бы они выполнÑлиÑÑŒ поÑледовательно. + +### Read phenomena (проблемы Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…) +Уровни изолÑции транзакций ÑущеÑтвуют Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð° и Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñледующих проблем, возникающих при одновременном (параллельном) чтении данных: + +- **Lost update** (потерÑнное обновление). При одновременном изменении данных разными транзакциÑми терÑÑŽÑ‚ÑÑ Ð²Ñе изменениÑ, кроме поÑледнего. +- **Dirty read** (неточное чтение). Ð’ результат Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²ÑÑ‚ÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ, привнеÑенные другой транзакцией, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ð¿Ð¾ÑледÑтвие будет отменена (не получит ÑтатуÑа committed). +- **Non-repeatable read** (проблема однократного чтениÑ). ÐеÑколько поÑледовательных операций Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¸Ñ… и тех же данных дают разный результат, Ñ‚.к. между ними вклинилаÑÑŒ ÑтороннÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи. +- **Phantom read** (фантомное чтение). Проблема Ñхожа Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ и также каÑаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… поÑле начала операции чтениÑ. Однако, “фантомное чтение†предполагает изменение Ñамой выборки (Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи добавлÑет/удалÑет Ñтроки). + -**Governor** (губернатор) — внутреннÑÑ Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑущноÑÑ‚ÑŒ, управлÑÑŽÑ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñми и жизненными циклами инÑтанÑов в ÑоответÑтвие Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми их грейдов.