Size: a a a

2019 October 08

A

Andrey Afoninskiy in K8Spb
у меня тут странная хотелка возникла
короче, некий докер-контейнер который умеет выбирать среди подобных мастера, договариваться о консенсусе и прочее
все это через rest/grpc/env/... предоставлет основному приложению деплоймента
юзкейс: выкинуть из бизнес-сервисов логику оркестрации (выбор мастер-слейва и прочее) и выделить ее в отдельный переиспользуемый слой

странно но я такого не встречал, может пропустил че? так-то полезно
источник

MF

Maxim Filatov in K8Spb
Andrey Afoninskiy
у меня тут странная хотелка возникла
короче, некий докер-контейнер который умеет выбирать среди подобных мастера, договариваться о консенсусе и прочее
все это через rest/grpc/env/... предоставлет основному приложению деплоймента
юзкейс: выкинуть из бизнес-сервисов логику оркестрации (выбор мастер-слейва и прочее) и выделить ее в отдельный переиспользуемый слой

странно но я такого не встречал, может пропустил че? так-то полезно
ко мне только что с этим @freeseacher приходил
вы там вместе чтоли работаете?
источник

AS

Aleksey Shirokikh in K8Spb
Не
источник

A

Andrey Afoninskiy in K8Spb
мысли они в воздухе витают )
источник

PR

Paul Rudnitskiy in K8Spb
Maxim Filatov
ко мне только что с этим @freeseacher приходил
вы там вместе чтоли работаете?
то есть вы там вместе работаете?

скандалы! интриги! расследования! )
источник

MF

Maxim Filatov in K8Spb
бгггг
источник

AS

Aleksey Shirokikh in K8Spb
я к вам обоим пришел потрындеть про дистрибьют локинг примитив
источник

E

Etki in K8Spb
Andrey Afoninskiy
у меня тут странная хотелка возникла
короче, некий докер-контейнер который умеет выбирать среди подобных мастера, договариваться о консенсусе и прочее
все это через rest/grpc/env/... предоставлет основному приложению деплоймента
юзкейс: выкинуть из бизнес-сервисов логику оркестрации (выбор мастер-слейва и прочее) и выделить ее в отдельный переиспользуемый слой

странно но я такого не встречал, может пропустил че? так-то полезно
Ты про etcd?
источник

PR

Paul Rudnitskiy in K8Spb
Aleksey Shirokikh
я к вам обоим пришел потрындеть про дистрибьют локинг примитив
Клепмана посмотри плз. Там есть детали алго
источник

AS

Aleksey Shirokikh in K8Spb
и как бы мне его реализовать
источник

MF

Maxim Filatov in K8Spb
Paul Rudnitskiy
то есть вы там вместе работаете?

скандалы! интриги! расследования! )
не, я тут как тот старый полкан в анекдоте: "может шавет кому подам"
источник

PR

Paul Rudnitskiy in K8Spb
вполне вероятно что схемы того же Рафта или Паксоса оттуда тебе хватит
источник

AS

Aleksey Shirokikh in K8Spb
Paul Rudnitskiy
вполне вероятно что схемы того же Рафта или Паксоса оттуда тебе хватит
да что бы взгруснуть и начать бухать по черному
источник

AS

Aleksey Shirokikh in K8Spb
вообще выглядит будто вот это похоже https://github.com/pulcy/kube-lock
источник

A

Andrey Afoninskiy in K8Spb
а кстати, вот лок через попытку ресурс занять кубера … он разве продакшн-реди?
источник

A

Andrey Afoninskiy in K8Spb
такое ощущение что в блоге одном пример появился как прув оф концепт (я даже вроде помню статью) и все стали ксерокопировать
источник

E

Etki in K8Spb
Что вам надо-то? Отказоустойчивый CAS? Я ей-богу не понимаю.
источник

A

Andrey Afoninskiy in K8Spb
я ничего не понимаю в современных алгоритмах конценсуса, руководствовался правилом интернета “задай неправильный вопрос и узнаешь ответ” )
источник

E

Etki in K8Spb
Короче, как понял, ваша цель - это сделать интерфейс leader election, который будет няшни мжвячни и с которым не надо будет думать.
TL;DR: это нереализуемо, надо писать клиентскую библиотеку к etcd, но она наверняка уже кем-то написана.

Он реализуется в виде одного регистра в произвольном хранилище, к которому применяется Compare-And-Set операция, это есть как в etcd/consul на основе рафта, как в кассандре на основе paxos, так и в более специфичных алгоритмах консенсуса.
Элекция у лидера происходит следующим путем:
- Прочитать значение регистра
- Если в регистре лежит значение "лидер = х по такую-то дату", и дата еще не истекла - прекратить пытаться стать лидером
- Если в регистре пусто или лежит устаревшее значение, то попытаться произвести атомарную операцию замены старого значения на новое, в котором будет указано, что лидер - это тот узел, который оперирует, а дата будет поставлена в виде текущей + произвольное время, в течение которого узел и сеть имеют право подтупливать
- Если атомарная операция не прошла, значит другой узел оказался шустрее и надо вернуться в п.1.
- Если удалось избраться лидером, то надо регулярно обновлять регистр с помощью атомарной замены старого значения на такое же, но с обновленной датой истечения срока. Если атомарная замена не прошла, то добро пожаловать в п.1
Никакой высшей математики с самостоятельным вкручиванием рафта или паксоса не нужно - и боже упаси вас делать, все равно придет Афир и скажет, что ниччего не работает.

Как бы вы ни крутились, вся эта фантасмагория (кроме, может быть, проставления таймстампов) все равно будет лежать внутри приложения, поэтому никакого магического контейнера не будет - будет магическая либа, которая взаимодействует с etcd, consul, cassandra, zookepper, name it. От read - modify - cas никуда не уйти.
И на этом боль не кончается, потому что есть нюанс в виде времени:
- Во-первых никто не гарантирует, что на нодах не разойдутся часы
- Во-вторых внутри того алгоритма, который должен выполняться в контексте мастера, каждый чекпоинт должен сверяться с тем, является ли текущий узел мастером. Потому что никто не знает, сколько времени заняла эта операция, своппила ли ОС на диск, был ли CPU spike, был ли GC spike, алгоритм оказался квадратичной сложности, сеть затупила, чтение из базы данных привело к дедлоку, другая транзакция держала данные, короче, неважно как, но оно пробьет. Адекватное решение - это в той же либе сделать обертку, которая будет делать это за вас, и будет иметь сигнатуру типа

<State> Future<State> execute(List<Function<State, Future<State>>> pipeline, State initial);

Резюме: в пизду это, делайте идемпотентные алгоритмы, которые разбирают таски из очереди, и никакого мастера не нужно.
источник

DN

Dmitry Nagovitsin in K8Spb
Etki
Короче, как понял, ваша цель - это сделать интерфейс leader election, который будет няшни мжвячни и с которым не надо будет думать.
TL;DR: это нереализуемо, надо писать клиентскую библиотеку к etcd, но она наверняка уже кем-то написана.

Он реализуется в виде одного регистра в произвольном хранилище, к которому применяется Compare-And-Set операция, это есть как в etcd/consul на основе рафта, как в кассандре на основе paxos, так и в более специфичных алгоритмах консенсуса.
Элекция у лидера происходит следующим путем:
- Прочитать значение регистра
- Если в регистре лежит значение "лидер = х по такую-то дату", и дата еще не истекла - прекратить пытаться стать лидером
- Если в регистре пусто или лежит устаревшее значение, то попытаться произвести атомарную операцию замены старого значения на новое, в котором будет указано, что лидер - это тот узел, который оперирует, а дата будет поставлена в виде текущей + произвольное время, в течение которого узел и сеть имеют право подтупливать
- Если атомарная операция не прошла, значит другой узел оказался шустрее и надо вернуться в п.1.
- Если удалось избраться лидером, то надо регулярно обновлять регистр с помощью атомарной замены старого значения на такое же, но с обновленной датой истечения срока. Если атомарная замена не прошла, то добро пожаловать в п.1
Никакой высшей математики с самостоятельным вкручиванием рафта или паксоса не нужно - и боже упаси вас делать, все равно придет Афир и скажет, что ниччего не работает.

Как бы вы ни крутились, вся эта фантасмагория (кроме, может быть, проставления таймстампов) все равно будет лежать внутри приложения, поэтому никакого магического контейнера не будет - будет магическая либа, которая взаимодействует с etcd, consul, cassandra, zookepper, name it. От read - modify - cas никуда не уйти.
И на этом боль не кончается, потому что есть нюанс в виде времени:
- Во-первых никто не гарантирует, что на нодах не разойдутся часы
- Во-вторых внутри того алгоритма, который должен выполняться в контексте мастера, каждый чекпоинт должен сверяться с тем, является ли текущий узел мастером. Потому что никто не знает, сколько времени заняла эта операция, своппила ли ОС на диск, был ли CPU spike, был ли GC spike, алгоритм оказался квадратичной сложности, сеть затупила, чтение из базы данных привело к дедлоку, другая транзакция держала данные, короче, неважно как, но оно пробьет. Адекватное решение - это в той же либе сделать обертку, которая будет делать это за вас, и будет иметь сигнатуру типа

<State> Future<State> execute(List<Function<State, Future<State>>> pipeline, State initial);

Резюме: в пизду это, делайте идемпотентные алгоритмы, которые разбирают таски из очереди, и никакого мастера не нужно.
мы делали такое на etcd
источник