Этот пост был первоначально опубликован в нашем блоге Tumblr 8 марта 2016 г. Публикуем его здесь с небольшими обновлениями, отражающими последние тестируемые функции.
Нагрузочное тестирование базы данных Cassandra
Этот пост продолжает нашу серию о том, как тестировать различные типы технологий с помощью Testable. Сегодня мы проведем нагрузочное тестирование базы данных Cassandra, зафиксируем некоторые полезные пользовательские метрики и проанализируем результаты.
Тест будет включать создание и удаление схемы БД, а затем синхронизацию задержки вставки под нагрузкой.
Шаг 1: Создайте тестовый пример
Сначала убедитесь, что вы зарегистрировали учетную запись Testable. После входа в систему нажмите кнопку «Новый тестовый пример», дайте ему имя и укажите URL-адрес вашей БД (например, cassandra.myserver.com:9402).
Шаг 2: Напишите тестовый сценарий
Тестируемые скрипты — это просто Javascript, который выполняется в изолированной среде Node.JS. Закончив шаг 1, нажмите Далее и выберите Написать сценарий в качестве типа сценария. Мы будем использовать модуль cassandra-driver NPM для связи с нашей БД.
Код инициализации
Код Init будет выполняться глобально только один раз в начале нашего теста. Давайте используем следующий код для Init:
var cassandra = require('cassandra-driver'); var async = require('async'); var client = new cassandra.Client( { contactPoints : [ 'myserver.com' ] } ); async.series([ client.connect.bind(client), function createKeyspace(next) { var query = "CREATE KEYSPACE IF NOT EXISTS loadtest WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3' }"; client.execute(query, next); }, function createTable(next) { var query = "CREATE TABLE IF NOT EXISTS loadtest.person (id uuid, name text, address text, PRIMARY KEY(id))"; client.execute(query, next); } ], function (err) { if (err) { console.error('There was an error', err.message, err.stack); } console.log('Init completed'); client.shutdown(); });
Этот код подключается к БД (обновляет хост, пользователя, пароль для вашего варианта использования), создает пространство ключей loadtest, если оно не существует, и внутри этого пространства ключей человек таблица, если она не существует.
Код демонтажа
В конце теста мы хотим удалить пространство ключей, которое мы только что протестировали. Используйте следующий код для Teardown:
var cassandra = require('cassandra-driver'); var async = require('async'); var client = new cassandra.Client( { contactPoints : [ 'dev.testable.io' ] } ); async.series([ client.connect.bind(client), function dropKeyspace(next) { var query = "DROP KEYSPACE loadtest"; client.execute(query, next); } ], function (err) { if (err) { console.error('There was an error', err.message, err.stack); } console.log('Teardown completed'); client.shutdown(); });
Аналогично коду инициализации, за исключением того, что на этот раз мы удаляем пространство ключей, чтобы очистить наш тест.
Основной код
Теперь, когда у нас есть настройка init/teardown, давайте определим фактический тестовый сценарий:
var cassandra = require('cassandra-driver'); var async = require('async'); var client = new cassandra.Client( { contactPoints : [ 'dev.testable.io' ] } ); async.series([ client.connect.bind(client), function insertRow(next) { var query = "INSERT INTO loadtest.person (id, name, address) VALUES (?, ?, ?)"; timing(function(done) { client.execute(query, [cassandra.types.Uuid.random(), info.currentId(), 'Dummy address'], { prepare: true }, function() { done(); results().counter('inserts', 1); next.apply(this, arguments); }); }, 'insertLatency'); } ], function (err) { if (err) { console.error('There was an error', err.message, err.stack); } client.shutdown(); });
Этот код делает следующее:
- Подключиться к нашей БД
- Время нашего запроса INSERT. INSERT использует info.currentId() (то есть уникальный идентификатор для итерации теста) в качестве имени и фиктивного значения для адреса.
- Захватите таймер как настраиваемую метрику insertLatency.
- Подсчитайте количество выполненных вставок в качестве счетчика вставок.
Этот код теперь определяет сценарий для выполнения в масштабе.
Проверьте свой скрипт, нажав кнопку Smoke Test в правом верхнем углу. Это выполняется один раз на общем тестируемом агенте, включая init/teardown. Любые захваченные метрики и журналы появятся на вкладке Результаты дымового теста.
Пример вывода дымового теста
Обратите внимание, что Testable автоматически фиксирует набор низкоуровневых метрик в дополнение к пользовательской метрике, которую мы добавили в наш скрипт.
Шаг 3. Настройте нагрузочный тест
Нажмите Далее, чтобы перейти к шагу Настройка. Теперь мы точно определяем, как выполнить сценарий, который мы определили на шаге 2.
- 10 одновременных клиентов в каждом регионе. Каждый параллельный клиент похож на пользователя, использующего вашу службу, и работает на тестируемом агенте параллельно.
- Продолжительность 1 минута.
- Три региона в общедоступной общей сети (AWS N Virginia, AWS Oregon, AWS Singapore). Обратите внимание: если ваша БД защищена брандмауэром, вы также можете запустить тест локально.
Нажмите кнопку Начать тест, и ваш тест будет запущен! Поздравляем, вы официально создали и запустили нагрузочный тест. Теперь давайте посмотрим на анализ результатов.
Шаг 4: просмотрите результаты
К настоящему времени вы должны увидеть результаты, поступающие по мере выполнения теста. Панель мониторинга по умолчанию будет отображать сводку, сетку результатов и графики показателей, захваченных системой.
Давайте нарисуем нашу метрику insertLatency и добавим ее в сводную таблицу и таблицу результатов.
Добавить диаграмму InsertLatency
В правом верхнем углу нажмите на перевернутый треугольник и выберите Добавить диаграмму.
Дайте ему имя, например «Вставить задержку». Выберите Линейный график и начертите диаграмму insertLatency -> mean, insertLatency -> p95 (95-й процентиль) и insertLatency -> p99 (99-й процентиль).
Добавьте диаграмму, и она появится на панели инструментов.
Добавить задержку вставки в сводку
Прокрутите вниз до сводки и нажмите значок настройки. Нажмите Добавить столбец, выберите показатель InsertLatency-mean и нажмите Обновить сводку. Вы можете изменить порядок столбцов, перетащив новый столбец вверх или вниз в окне конфигурации.
После обновления конфигурации сводка будет выглядеть следующим образом:
Вы можете сохранить эту новую панель инструментов для будущего использования с помощью меню панели инструментов в правом верхнем углу. И это все! Мы настроили тестовый сценарий Cassandra, зафиксировали пользовательские метрики, запустили его в масштабе и проанализировали результаты.