From 6979103437648593a3dd7ba140740dbaf1814e2e Mon Sep 17 00:00:00 2001 From: "a.tolstoy" <a.tolstoy@picodata.io> Date: Tue, 25 Jul 2023 12:48:19 +0300 Subject: [PATCH] sync glossary with the docs version --- docs/cluster_group.svg | Bin 0 -> 139926 bytes docs/glossary.md | 249 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 230 insertions(+), 19 deletions(-) create mode 100644 docs/cluster_group.svg diff --git a/docs/cluster_group.svg b/docs/cluster_group.svg new file mode 100644 index 0000000000000000000000000000000000000000..00260c54cbcbeaf872454104e59a5c74008f1fe8 GIT binary patch literal 139926 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≺LcEr;Sgx*YSs6%+j}~zR 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 Y645CZ%8-;*{`33KK7RMjAAa}$03wUu-~a#s literal 0 HcmV?d00001 diff --git a/docs/glossary.md b/docs/glossary.md index 3343d9519d..f26b56d36f 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** (губернатор) — внутреннÑÑ Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑущноÑÑ‚ÑŒ, управлÑÑŽÑ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñми и жизненными циклами инÑтанÑов в ÑоответÑтвие Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми их грейдов. -- GitLab