Этот пост был первоначально опубликован в нашем блоге 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();
});

Этот код делает следующее:

  1. Подключиться к нашей БД
  2. Время нашего запроса INSERT. INSERT использует info.currentId() (то есть уникальный идентификатор для итерации теста) в качестве имени и фиктивного значения для адреса.
  3. Захватите таймер как настраиваемую метрику insertLatency.
  4. Подсчитайте количество выполненных вставок в качестве счетчика вставок.

Этот код теперь определяет сценарий для выполнения в масштабе.

Проверьте свой скрипт, нажав кнопку 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, зафиксировали пользовательские метрики, запустили его в масштабе и проанализировали результаты.