0 Обзор альбома
etcd является важным базовым компонентом облачной архитектуры, которая инкубируется и размещается CNCF. etcd можно использовать не только для регистрации и обнаружения сервисов в микросервисах и кластерах Kubernetes, но и как промежуточное ПО для хранения ключей и значений.
"Понимание статей серии etcd" познакомит с etcd с точки зрения базовой функциональной практики etcd, интерфейса API, принципа реализации, анализа исходного кода и опыта преодоления ям в реализации. Ожидается, что статей будет около 20, автор будет обновлять каждую неделю, прошу обратить внимание.
1 etcd транзакция Транзакция
Транзакции представляют собой атомарные структуры If/Then/Else в хранилище ключ-значение. etcd предоставляет примитивы для группировки запросов в атомарные блоки (т.е. тогда/иначе), которые защищают выполнение (т.е. если) на основе содержимого хранилища ключ-значение. Транзакции можно использовать для обеспечения согласованности одновременных обновлений, для создания CAS и контроля параллелизма на уровне разработки.
Транзакции позволяют серверу etcd автоматически обрабатывать несколько внешних запросов в одном запросе. Для модификаций хранилища "ключ-значение" это означает, что версия этого репозитория увеличивается только один раз для транзакции, и все события, сгенерированные этой транзакцией, будут иметь одну и ту же версию. Важно отметить, что запрещается изменять один и тот же ключ несколько раз в рамках одной транзакции.
Каждое сравнение в транзакции проверяет один ключ в хранилище, подобно операции If, проверяя существование значения, сравнивая с заданным значением или проверяя версию или версию ключа. Два разных сравнения могут применяться к одному и тому же или к разным ключам. Все сравнения являются атомарными операциями. Если все сравнения истинны, транзакция успешна, и etcd применяет блок запроса then/success транзакции, в противном случае он считает неудачным и применяет блок запроса else/failure.
Относительно конкретной концепции дел вы можете поискать в интернете самостоятельно, в этой статье мы не будем подробно останавливаться на этой части.
2 Определение передачи
Метод Txn обрабатывает несколько запросов в одной транзакции. Запрос txn увеличивает версию хранилища ключей и значений и создает событие с одной и той же версией для каждого завершенного запроса. etcd не позволяет изменять один и тот же ключ несколько раз в txn.
rpc Txn(TxnRequest) returns (TxnResponse) {}
Следующий абзац взят из комментариев TxnRequest в прото-файле документа google paxosdb, объясняющего, как работают запросы Txn:
Наша реализация вращается вокруг мощного примитива, который мы называем MultiOp. Все операции с базой данных, кроме циклов, реализуются как один вызов MultiOp. MultiOp применяется атомарно и состоит из трех частей:
- Список тестов, называемых охранниками. Каждый тест в Guard проверяет одну запись в базе данных. Он может проверять наличие или отсутствие значения или сравнивать его с заданным значением. К одному и тому же или к разным элементам базы данных могут применяться два разных теста защиты. Все тесты в Guard применяются, и MultiOp возвращает результат. Если все проверки верны, MultiOp выполняет операцию t (см. второй пункт ниже), в противном случае — операцию f (см. третий пункт ниже).
- Список операций базы данных, известных как t операций. Каждая операция в списке является операцией вставки, удаления или поиска и применяется к одному элементу базы данных. Две разные операции в списке могут применяться к одному и тому же или к разным элементам в базе данных. Эти операции будут выполняться, если охрана оценивается как истина.
- Список операций с базой данных, известных как f-операции. Аналогичен операции t, но выполняется, когда значение Guard равно false.
Тело сообщения TxnRequest запроса определяется следующим образом:
message TxnRequest {
// compare 是断言列表,体现为条件的联合
repeated Compare compare = 1;
// 成功请求列表,当比较评估为 true 时将被应用。
repeated RequestOp success = 2;
// 失败请求列表,当比较评估为 false 时将被应用。
repeated RequestOp failure = 3;
}
сравнение Если сравнение прошло успешно, успешные запросы будут обработаны по порядку, и ответы будут содержать соответствующие ответы по порядку; если сравнение не удалось, неудачные запросы будут обработаны по порядку, а ответы будут содержать соответствующие ответы по порядку. . Тело сообщения TxnResponse ответа определяется следующим образом:
message TxnResponse {
ResponseHeader header = 1;
// 如果比较评估为true则succeeded被设置为true,否则是false
bool succeeded = 2;
repeated ResponseOp responses = 3;
}
заголовок обозначает общие заголовки ответа. responses — список ответов. Если Successed равно true, это соответствует успешному запросу, а если Successed равно False, это соответствует неудачному запросу. Сравните тело сообщения:
message Compare {
enum CompareResult {
EQUAL = 0;
GREATER = 1;
LESS = 2;
NOT_EQUAL = 3;
}
enum CompareTarget {
VERSION = 0;
CREATE = 1;
MOD = 2;
VALUE= 3;
}
CompareResult result = 1;
CompareTarget target = 2;
bytes key = 3;
oneof target_union {
// version 是给定 key 的版本
int64 version = 4;
// create_revision 是给定 key 的创建修订版本
int64 create_revision = 5;
// mod_revision 是给定 key 的最后修改修订版本
int64 mod_revision = 6;
// value 是给定 key 的值,以 bytes 的形式
bytes value = 7;
}
}
результат является логической операцией сравнения для этого сравнения. target — поле ключ-значение для сравнения. key — ключ субъекта, используемый для операций сравнения. Определение ключевого слова oneof, за которым следует имя oneof в .proto, установка поля oneof автоматически очистит все остальные члены поля oneof. В сгенерированном коде одно из полей имеет те же методы установки и получения, что и обычные поля.
Тело сообщения RequestOp определяется следующим образом:
message RequestOp {
oneof request {
RangeRequest request_range = 1;
PutRequest request_put = 2;
DeleteRangeRequest request_delete_range = 3;
}
}
request — это объединение типов запросов, которые могут быть приняты транзакцией. Тело сообщения ResponseOp:
message ResponseOp {
oneof response {
RangeResponse response_range = 1;
PutResponse response_put = 2;
DeleteRangeResponse response_delete_range = 3;
}
}
response — это набор типов ответов, возвращаемых транзакцией.
3 Резюме
В этой статье в основном представлено определение транзакции Txn, используемой в API Etcd.Метод Txn обрабатывает несколько запросов в одной транзакции, тем самым обеспечивая согласованность бизнес-процессов.
Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер
Рекомендуемое чтение
- Сравнение etcd с другими компонентами k-v, такими как Zookeeper и Consul
- Тщательно изучите серию статей etcd (1): первое знакомство с etcd
- Тщательно изучите серию статей etcd (2): различные положения установки etcd
- Тщательно изучите серию статей etcd (3): эксплуатация и обслуживание кластера etcd, развертывание.
- Тщательно изучите серию статей etcd (4): безопасность etcd
- Тщательно изучите серию статей etcd (5): использование etcdctl
- Тщательно изучите серию статей etcd (6): etcd core API v3
- [Знакомство со статьями из серии etcd (7): API сервиса etcd gRPC
](блюз доступен empty.com/2020/08/27/…)