Статьи

Тестирование сбоя сети с использованием NuoDB и Jepsen, часть 2

Приветствую верных читателей! В нашем предыдущем посте мы говорили о тестере Jepsen и о различных улучшениях, которые мы внесли в него. В этом посте я собираюсь пройтись по прогону Jepsen, выполненному с помощью кода с нашего github-форка, объяснить настройку теста, а затем просмотреть вывод, объясняющий поведение Jepsen в NuoDB.

Испытательная установка

Этот тест и многие другие прогоны Jepsen были проведены на 6 машинах с Ubuntu. Это настоящие машины, а не контейнеры LXC. Однако мне удалось заставить одного из моих коллег здесь клонировать и протестировать форк на 6 экземплярах Amazon, и он получил аналогичные результаты. Итак, мы ожидаем, что вы сможете получить аналогичные результаты самостоятельно. Вот что вам нужно:

  1. 6 «коробок» Ubuntu (5 для запуска NuoDB, 1 для запуска клиента jepsen)
  2. SSH доступ ко всем 6 коробкам
  3. ssh-agent работает с соответствующей идентификацией для удобного доступа ко всем 6 машинам
  4. Привилегии sudo для 5 «коробок», работающих под управлением NuoDB (для iptables, между прочим)
  5. Все 6 компьютеров должны иметь возможность разрешать имена друг друга (по крайней мере, записи в / etc / hosts)

Затем вы захотите установить NuoDB на 5 серверных блоков и запустить брокеров. Тогда вы захотите запустить SM и TE на каждом узле. Вот скрипт bash, который я использовал для этого (он также находится в ветке в setup / nuodb / setupJepsen.sh):

#!/bin/bash
#
#Sample bash script to setup a nuodb database running a TE and SM on each of 5 hosts
#
BROKER="n1"
TIMEOUT=30
ARCHIVE_DIR="/tmp/jepsen"
DOMAIN_PW="bird"
NUODBMANAGER_JAR="/opt/nuodb/jar/nuodbmanager.jar"
declare -a HOSTS=("n1" "n2" "n3" "n4" "n5")

for HOST in ${HOSTS[@]}
do
    java -jar $NUODBMANAGER_JAR --broker $BROKER --password $DOMAIN_PW --command "start process sm host $HOST database jepsen archive $ARCHIVE_DIR initialize yes options '--ping-timeout $TIMEOUT --commit remote:3 --verbose error,warn,flush'"
done

for HOST in ${HOSTS[@]}
do
    java -jar $NUODBMANAGER_JAR --broker $BROKER --password $DOMAIN_PW --command "start process te host $HOST database jepsen options '--ping-timeout $TIMEOUT --commit remote:3 --dba-user jepsen --dba-password jepsen --verbose error,warn,flush'"
done

Вам нужно будет заменить все имена хостов (n1 и т. Д.) На имена, которые вы будете использовать, и если ваш путь установки отличается от заданного по умолчанию, вам также потребуется изменить NUODBMANAGER_JARпеременную. Первый цикл устанавливает все SM. Первый интересный момент — режим фиксации --commit remote:3. Это означает, что по умолчанию транзакции будут подтверждать принятие клиентов только тогда, когда ответы получены от 3 SM (что составляет большинство). Это означает, что по умолчанию все записи в эту базу данных будут долговечны перед лицом разделов. Второй интересный бит — это таймаут пинга--ping-timeout $TIMEOUT, Это устанавливает время ожидания в секундах модуля обнаружения сбоев на основе пульса. Детали этого механизма будут подробно объяснены в другом сообщении в блоге, но суть его в том, что по истечении TIMEOUT секунд отсутствия тактовых импульсов от однорангового узла этот узел помечается как подозрительный и может быть удален из базы данных.

На клиентском компьютере вам нужно установить Java, maven и leiningen. Jepsen — это приложение Clojure, поэтому Leiningen, безусловно, путь. Clojure работает поверх JVM, и leiningen извлекает все зависимости, которые нужны jepsen. Чтобы предварительно выбрать все файлы jar и тому подобное, просто запустите «lein deps» из каталога верхнего уровня проекта jepsen (тот, в котором находится project.clj).

Управление вещами из хлопка

После того, как вы настроили и запели 6 машин: войдите в клиентскую машину, перейдите в каталог проекта jepsen и запустите «lein run nuodb -n 2000 -f partition -u <username> -p <passwd> -X insert» , Это запустит тест jepsen nuodb. Вот краткое изложение аргументов командной строки:

  • -n контролирует общее количество записей
  • -f — режим сбоя, «раздел» выполняет раздел во время теста (а затем лечит его), «noop» ничего не делает (полезно для тестирования)
  • -u — имя пользователя, который будет подключаться и запускать iptables на компьютерах серверов.
  • -p — пароль для имени пользователя, указанного в -u (необходим для sudo)
  • -X insert заставляет jepsen обрабатывать всю таблицу как набор результатов, а не изменять CLOB в таблице из одной строки

Jepsen начинается просто с вставки целых чисел в логический набор (в NuoDB, фактическая таблица).

Вы должны увидеть что-то подобное при запуске. Через некоторое время (несколько сотен вставок или около того) jepsen рассердится и разделит базу данных. В частности, он будет использовать правила iptables для получения n1 и n2, чтобы молча отбрасывать весь трафик с n3,4,5 (и наоборот). Это симулирует гнусную тихую сетевую ошибку, похожую на некорректно работающий коммутатор. Поскольку ОС не обнаружит сбой, процессы NuoDB не будут зависать от сокетов или чего-либо еще. Они будут испытывать буферы, которые начинают заполняться неподтвержденными сообщениями. После разделения транзакции, выполняемые против n1 и n2, не смогут быть зафиксированы (удаленный: 3 гарантирует это). Транзакции, выполняемые против n3,4,5, будут генерировать не отправляемые сообщения, предназначенные для n1 и n2 (которые будут накапливаться на n3-5), и эти узлы начнут отталкиваться от новых транзакций.

После 30 секунд пропущенных звуковых ударов оба раздела запустят механизмы обнаружения сбоев, которые определят, кто будет «голосовать за остров». Миноритарные узлы (n1, n2) не смогут сформировать кворум и будут приятно закрываться. Остальные узлы сформируют кворум и будут вырезать n1 и n2 из своих наборов узлов. Неотправленные сообщения будут удалены, а транзакции, отправленные назад, начнут истощаться.

Таймауты

Задачи Jepsen будут превышены. Задачи могут блокировать ожидание коммита, если они находятся в разделе меньшинства и ожидают третьего сообщения о коммите, которое никогда не будет доставлено. Задачи могут блокироваться на мажоритарном разделе, когда начинается возврат, прежде чем обнаружение сбоев завершится. Кроме того, задачи, которые были заблокированы в разделе меньшинства, должны будут повторить попытку, когда узлы меньшинства завершат работу, и могут прерваться, прежде чем они завершатся на остальных узлах. В этих случаях вы увидите что-то вроде:

Операции записи, превышающие время ожидания, заняли больше времени, чем хотелось бы, но завершились успешно, как только перестал работать мажоритарный раздел.

Сбои подключения

По истечении времени ожидания проверки связи узлы в меньшинственном разделе попытаются сформировать кворум, чтобы определить, кто достижим. Поскольку они не могут, они решат закрыть себя. Клиенты, подключенные к этим узлам, получат ошибку соединения (точнее, исключение Java IOException). NuoDB рекомендуется для клиентских приложений, которые делают свое собственное управление соединением, чтобы повторить попытку в случае сбоя соединения. Многие из задач, которые заканчиваются повторной попыткой, могут быть приостановлены, потому что таймер не сбрасывается при повторной попытке подключения. Когда узлы меньшинства отключатся, вы увидите такие вещи в выводе jepsen:

Полученные результаты

В конце концов, jepsen излечит раздел. К тому времени узлы NuoDB обнаружат раздел, узлы меньшинства отключатся, узлы большинства перестанут пытаться связаться с узлами меньшинства, и весь резервный трафик будет проходить через оставшиеся в живых узлы. Как только jepsen завершит попытки выполнить все задачи, которые он намеревался выполнить, он суммирует результаты. Для этого запуска, результаты:

Как вы можете видеть, нет потерянных записей, даже при сбое раздела и узла, и чуть более 95% записей успешно выполнено! Мы много раз запускали jepsen, и это не необычный результат. Количество успешных записей (из 2000 записей) будет варьироваться с середины 1800-х до середины 1900-х годов. Если время раздела меньше, чем время пинга, NuoDB может «отключить» раздел, и все записи будут успешными (однако, это не тот случай использования, который пытается выполнить jepsen).

Затем мой коллега и начинающий сыроделец Дэн отложит свои инструменты чеддеринга и углубится в детали механизма обнаружения сбоев, который тестирует jepsen.