К основному содержимому
#DistributedSystems

Jepsen (Distributed Systems Safety Research)

#DistributedSystems #QualityAssurance #SystemDesign #Engineering #Software #Architecture #SoftwareArchitecture #SoftwareDevelopment #SRE

Сегодня я решил вспомнить про jepsen, clojure библиотеку, которая позволяет тестировать распределенные системы. Почему именно сейчас? Потому что на этой неделе я делал ревью доклада для ArchDays на тему эмулирования сбоев. В рамках ревью я вспомнил про библиотеку Jepsen и мы немного обсудили подход Kyle Kingsbury, автора библиотеки, к тестированию гарантий и отказов в распределенных системах. В общем и целом, мне нравится подход Кайла и я считаю его полезным для применения, поэтому я решил написать этот пост:)

Кайл отлично рассказал о своем подходе в 2018 году на конференции GOTO (рекомендую посмотреть видео - оно сделано с юмором и кучей информации). На его сайте есть краткое описание работы библиотеки Jepsen analyses generally consist of running operations against a distributed system in a dedicated cluster, introducing faults into that cluster, and observing whether the results of those operations are consistent with some model. This introduces various sources for error: bugs, bounds on the search space, and the problem of induction. Jepsen’s design also limits its use as a performance benchmark.

На этом же сайте есть крутая схема моделей консистентности, соответствие которым проверяется в тестах. Плюс есть отдельный раздел с результатами анализа разных баз, которых накопилось больше 20 за 10 лет исследований.

Но если если возвращаться к выступлению 2018 года, то там Кайл сначала рассказывает по сложности работы stateful сервисов, а точнее баз данных, приводя метафору с горящей кучей покрышек, над которой развернуты приложения, которые предоставляют API клиентам, которые делают вид, что все хорошо. Дальше он рассказывает про виды проблем в распределенных системах и рассказывает про результаты исследований популярных продуктов и проблемы, найденные в них.

А в конце выпустления он доходит до практических советов по поводу выбора базы данных / очереди для вашего продукта делать следующее

  • читать документацию и искать предоставляемые этим решением гарантии
  • если там написано просто strong consistency, ACID, strict и ничего больше, то возможно авторы базы данных не понимают что это значит (или скрывают реальные гарантии за marketing bullshit)
  • смотреть на формальные гарантии и спецификации
  • думать про те инварианты и гарантии, которые важны для вашей системы (баланс между safety/consistency и performance)
  • думать про модели отказа (failure modes) и конкретно про -- краши процессов (kill -9) -- откзаы машин -- clock skew -- паузы на gc/io -- разделения сети (network partition) (iptables -j DROP)
  • тестировать систему end-to-end, а не только базу или очередь - это позволит проверить работоспособность пользовательских сценариев целиком
  • не быть перфекционистом и остановиться в тестировании системы на good enough уровне

#DistributedSystems #QualityAssurance #SystemDesign #Engineering #Software #Architecture #SoftwareArchitecture #SoftwareDevelopment #SRE