Статьи

Cyclop: веб-редактор для языка запросов Cassandra

Cassandra — одна из самых популярных баз данных NoSQL с открытым исходным кодом, но ей всего несколько лет, и поэтому поддержка инструментов по-прежнему ограничена, особенно когда речь идет о бесплатном программном обеспечении с открытым исходным кодом.

Если вы работаете с Cassandra, рано или поздно вам придется анализировать его содержимое на удаленном кластере. Большинство доступных инструментов — это настольные приложения, которые подключаются к Cassandra по его протоколу. Получение такого доступа может быть сложной задачей, потому что обычно базы данных устанавливаются в ограниченных сетях, чтобы минимизировать риск взлома данных. Политики безопасности часто меняются, чтобы охватить новые открытия, и тот факт, что у вас есть доступ к вашей базе данных сегодня, не обязательно означает, что она продлится долго.

Получение доступа через SSH и интерфейс командной строки должно быть проще, но мне не нужно никого убеждать, что использование терминала для запроса содержимого базы данных является болезненным, особенно когда он содержит широкие строки!

Но есть одно решение, которое почти всегда доступно: веб-приложения! Каждая компания знает, как их обезопасить, как выполнить тесты на проникновение, обнаружить утечки в системе безопасности и т. Д. На самом деле не имеет значения, что происходит за кулисами. Вы, конечный пользователь, всегда имеете доступ к такому приложению — по крайней мере, в теории.

Вот и хорошие новости: Cyclop на 100% основан на сети и основан на последнем релизе Wicket! После того, как вам удалось установить его, вы можете запросить базу данных из веб-браузера и при этом по-прежнему наслаждаться нативным ощущением приложения (оно почти полностью основано на AJAX, поэтому перезагрузки страниц происходят редко).

Есть еще одна интересная вещь: если ваши эксперты по безопасности проведут тесты на проникновение против Cyclop, они найдут такие выводы, как инъекция сценариев базы данных. Это будет первый раз в вашей жизни, когда вы можете честно сказать: «Это не ошибка, это будущее!». В любом случае — я бы предложил ограничить доступ к Cyclop в некоторых доверенных сетях. Это определенно не обычное веб-приложение, но как только вам удастся развернуть его, вы сможете получить простой доступ к своим данным через CQL.

Управление пользователями

Образ

Cyclop не управляет пользователями — он передает авторизацию и аутентификацию Cassandra. После открытия сеанса Cassandra он сохраняется в сеансе HTTP, и все. С этого момента каждый запрос будет передаваться в Cassandra в течение его активного сеанса, и результат будет успешным или нет — на основе прав доступа, определенных в Cassandra для этого конкретного пользователя.

Обеспечение поддержки постоянных данных, таких как история запросов, становится немного сложнее, если нет такой вещи, как пользователь. Мы могли бы ссылаться на учетные данные, используемые для открытия сеанса Cassandra, но это распространенный случай, когда многие пользователи делятся ими — например, «пользователь только для чтения для ИТ на третьем этаже».

Как вы могли заметить, UUID — это решение всех наших проблем, и на этот раз это сработало! Cyclop генерирует случайный файл cookie на основе UUID и сохраняет его в браузере. Это решение для замены отсутствующего управления пользователями. Мы узнаем не самого пользователя, а браузер. Конечно, всегда требуется действительный сеанс Cassandra, поэтому неавторизованный пользователь не может получить доступ к ограниченным данным (например, к истории запросов) только потому, что он имеет доступ к браузеру или «знает» значение cookie, ему придется войти в систему. в первую очередь.

Пользовательские настройки охватывают такие вещи, как количество строк в таблице результатов, настройки импорта или состояние кнопки. Они хранятся в браузере в виде файла cookie в формате JSON. Во-первых, нет проблем с безопасностью, потому что это не конфиденциальные данные, во-вторых, мы можем получить к ним доступ напрямую из JavaScript.

Редактор запросов

Завершение запроса

  • Завершение поддерживается почти для всего синтаксиса CQL 3
  • Подсказка о завершении показывает все возможные ключевые слова, которые действительны для фактической позиции запроса. Таблицы, пространства клавиш и столбцы сгруппированы и отсортированы. Группы также выделены другим цветом шрифтаОбраз
  • Если пространство ключей было установлено в предыдущем запросе («используйте cqldemo» на снимке экрана ниже), выполнение следующих запросов будет сужено до таблиц из этого пространства ключей, при условии, что пространство ключей явно не указано в запросе.cmp_tables_from_global_keyspace
  • Завершение содержит только таблицы, которые принадлежат пространству клавиш, предоставленному в текущем запросе cmp_cqldemo_tables
  • Завершение содержит только столбцы таблицы, предоставленной в текущем запросе. cmp_table_columns
  • Справка по синтаксису запроса была скопирована из документации Cassandra. Он украшен цветной подсветкой, соответствующей цветам Completion Hint
  • cql_syntax_help

Клавиатура навигации

  • Enter — подтверждает текущее выделенное завершение
  • Tab — следующее значение завершения
  • Ctrl + Enter — выполняет запрос
  • ESC — отменить завершение

Таблица результатов запроса

results_table

  • Таблица результатов ориентирована на столбцы, она обратна по сравнению с традиционными редакторами SQL — строки отображаются горизонтально, а столбцы — вертикально. При прокрутке страницы слева направо вы будете переключаться между строками. Прокрутка сверху вниз показывает последующие столбцы
  • Столбцы отображаются в порядке, возвращаемом запросом, но, кроме того, они сгруппированы в два раздела, разделенных синей разделительной линией. В верхней части таблицы содержатся «статические столбцы» — их значения не являются пустыми в нескольких строках, возвращаемых выполненным запросом. Второй раздел содержит столбцы, значение которых не пусто только для одной строки. Cassandra поддерживает динамические столбцы, и идея состоит в том, чтобы иметь «статические» столбцы вверху таблицы и «динамические» столбцы внизу, потому что они в основном пусты
  • Заголовок таблицы для каждой строки отображает значение ключа раздела, при условии, что запрос возвращает его
  • Длинный текст обрезается, чтобы поместиться в ячейки таблицы. Такие ячейки имеют синий значок в левом верхнем углу. При нажатии на него открывается всплывающее окно, содержащее весь текстlarge_content

История запросов

history_full

  • История содержит последние 500 запросов, которые были успешно выполнены из этого конкретного браузера (мы распознаем пользователей на основе постоянных файлов cookie)
  • Каждая запись в истории содержит сам запрос, время выполнения и размер ответа
  • Рядом с запросом есть синий значок. Нажатие на него вызовет перенаправление в редактор и вставит запрос в него, чтобы вы могли выполнить его снова

Фильтрация истории

  • Фильтр поддерживает обновление в реальном времени — вы получаете результаты при наборе текста. Просто помните, что слова длиной менее трех символов будут игнорироваться
  • Несколько ключевых слов объединяются OR. Это означает, что результат фильтра будет содержать запросы как минимум с одним ключевым словом.
  • Нажатие Enter сбрасывает фильтр (вы также можете нажать на иконку «очистить»)
  • Вы можете указать несколько ключевых слов в фильтре. В этом случае вершина отфильтрованной истории будет содержать запросы с наибольшим количеством обращений. Это создает группы, такие как запросы с четырьмя попаданиями, затем тремя, и, в конце концов, с одним попаданием. Запросы в этих группах отсортированы по времени выполненияhistory_filter

Данные на сервере

Сама история хранится на сервере в файле: [fileStore.folder] \ QueryHistory- [User-UUID] .json. Сам файл содержит сериализованную историю в форме JSON. Решение также является безопасным, поэтому вы можете использовать Cyclop с любого компьютера без ограничений. Случайный файл cookie — это единственная информация, хранящаяся в браузере, но это не имеет значения, поскольку историю могут просматривать только аутентифицированные пользователи.

экспорт

Результаты запроса могут быть экспортированы в файл CSV. Вы можете влиять на его формат через файл конфигурации

импорт

Импортировать

Он предназначен для импорта файлов, содержащих запросы CQL, разделенных; \ n. Один запрос может занимать несколько строк. Результаты импорта отображаются в таблице, которая содержит каждый отдельный запрос, время выполнения и, в конечном итоге, ошибку — в этом случае строка выделяется красным цветом. Вы также можете указать несколько параметров, чтобы выполнение скрипта прерывалось (или нет) после первой ошибки, или выполненные запросы могли быть включены в историю запросов или параллельный импорт. Последний вариант разделит файл импорта на куски (по умолчанию 6) и выполнит каждый в отдельном потоке. Имейте в виду, что запросы будут выполняться в неуказанном порядке.

Монтаж

  1. Загрузите последний выпуск: https://github.com/maciejmiklas/cyclop/releases/latest
  2. Отредактируйте файл свойств:  cyclop/src/main/resources/cyclop.properties и установите параметры подключения для Cassandra
cassandra.hosts: localhost
cassandra.port: 9042
cassandra.useSsl: false
cassandra.timeoutMilis: 3600000
  1. Вы также можете перезаписать каждое свойство  cyclop.properties , установив его в качестве параметра jvm. Например , для подключения к другому набору Cassandra хоста: -Dcassandra.hosts=server1,server2. Это дает вам простую возможность изменить свойства после того, как файл war будет собран.

  2. При желании изменить настройки регистратора путем редактирования  logback.xml. По умолчанию он входит в /var/lib/tomcat7/logs/cyclop-${time}.log
  3. Создайте файл войны: mvn package
  4. Перетащите файл войны в кота

Созданная война может соединиться только с одним кластером Кассандры. Чтобы обслуживать несколько кластеров из одного Tomcat, вам нужно развернуть несколько военных циклопов, каждый из которых имеет свое  cassandra.hosts значение

Технические детали

Проект можно найти на github:  https://github.com/maciejmiklas/cyclop

Он основан на следующих технологиях:

  • веб-приложение — v3.x
  • Maven — v3.x
  • Весна — v3.x
  • Калитка — v6.x
  • wicket-auth-role — v6.x
  • bootstrap — v3.x (тема: киборг из начальной загрузки)
  • Пользовательский интерфейс jQuery — v1.10.x
  • Кассандра-драйвер-ядро — v1.x
  • slf4j / logback — v1.7.x
  • средство проверки гибернации — v4.x
  • guava — v15.x (Cassandra 2.0 не работает с v16)

Live Demo

Существует циклическое развертывание Cyclop, чтобы вы могли получить первое впечатление. Я размещаю его дома, поэтому иногда он может быть недоступен, потому что у меня нет статического IP-адреса, а когда он меняется, распространение занимает некоторое время.

Различные ссылки ниже содержат разные запросы. Нажатие на ссылку откроет Cyclop и вставит в его редактор запрос по ссылке. Попробуйте отредактировать эти запросы с помощью редактора Cyclop, чтобы увидеть, как работает завершение кода. Предоставленный пользователь имеет доступ только для чтения, поэтому доступна только часть функций.