Как интегрировать Google Cloud SQL с Google Big Query

Я разрабатываю решение, в котором Google Cloud SQL будет использоваться для хранения всех данных, поступающих от обычного функционирования приложения (вид данных OLTP). Ожидается, что данные со временем вырастут в довольно большой размер. Данные сами по себе носят реляционный характер, и поэтому мы выбрали Cloud SQL вместо Cloud Datastore.

Эти данные должны быть переданы в Big Query для аналитики, и они должны быть близки к аналитике в реальном времени (в лучшем случае), хотя реально можно ожидать некоторой задержки. Но я пытаюсь найти решение, которое уменьшит это отставание до минимума.

Мой вопрос состоит из 3 частей -

  1. Должен ли я использовать Cloud SQL для хранения данных, а затем переместить их в BigQuery или изменить сам базовый дизайн и использовать BigQuery для первоначального хранения данных? Подходит ли BigQuery для использования при обычных рабочих нагрузках OLTP с низкой задержкой?(Я так не думаю - верно ли мое предположение?)

  2. Какова рекомендуемая / лучшая практика для загрузки данных Cloud SQL в BigQuery и работает ли эта интеграция практически в реальном времени?

  3. Является ли Cloud Dataflow хорошим вариантом? Если я подключу Cloud SQL к Cloud DataFlow и далее к BigQuery - это будет работать? Или есть какой-то другой способ добиться этого, который лучше (как задано в вопросе 2)?

5 ответов

Посмотрите, как это делает WePay:

Оператор MySQL to GCS выполняет запрос SELECT к таблице MySQL. SELECT извлекает все данные, превышающие (или равные) последний верхний водяной знак. Верхний водяной знак является либо первичным ключом таблицы (если таблица только для добавления), либо столбцом метки времени изменения (если таблица получает обновления). Опять же, оператор SELECT также возвращается на некоторое время назад (или строки), чтобы перехватить потенциально пропущенные строки из последнего запроса (из-за проблем, упомянутых выше).

С Airflow им удается синхронизировать BigQuery с базой данных MySQL каждые 15 минут.

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

INSERT
   demo.customers (column1)
SELECT
   *
FROM
   EXTERNAL_QUERY(
      "project.us.connection",
      "SELECT column1 FROM mysql_table WHERE timestamp > ${timestamp};");

Просто не забудьте заменить ${timestamp} на текущую временную метку - 1 час.

Другой метод - разделить процесс записи на CloudSQL и Cloud Pub/Sub, а затем использовать средство чтения потоков данных для потоковой передачи в BigQuery. Это хорошо работает, когда у вас есть существенно разные схемы назначения для ваших таблиц BigQuery - что часто встречается при денормализации ваших реляционных данных.

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

Google предоставил справочную статью на эту тему, связанную с использованием инструмента сбора измененных данных для идентификации измененных данных и только их продвижения.

Это делает некоторые предположения, которые могут не сработать для вас:

  • готовность выучить дебезиум
  • готовность позволить GCP подключиться к вашей исходной базе данных MySQL

Если они работают в вашей ситуации, это кажется хорошим решением.

Я думаю, вы можете использовать федеративные запросы как одно из возможных решений:

Федеративный запрос — это способ отправить оператор запроса во внешнюю базу данных и вернуть результат в виде временной таблицы. Федеративные запросы используют API подключения BigQuery для установления соединения с внешней базой данных. В вашем стандартном SQL-запросе вы используете функцию EXTERNAL_QUERY для отправки оператора запроса во внешнюю базу данных, используя диалект SQL этой базы данных. Результаты преобразуются в стандартные типы данных SQL BigQuery.

Вы можете использовать объединенные запросы со следующими внешними базами данных:

Cloud Spanner Cloud SQL После первоначальной разовой настройки вы можете написать запрос с помощью SQL-функции EXTERNAL_QUERY.

Я оставляю вам документацию, чтобы вы могли реализовать ее в своем проекте:https://cloud.google.com/bigquery/docs/federated-queries-intro .

Другие вопросы по тегам