Перейти к содержимому
Последнее обновление

Обзор непрерывной загрузки

Экспериментальная функция

Непрерывная загрузка Doris является экспериментальной функцией и поддерживается начиная с Doris 4.1.5.

Doris поддерживает непрерывную загрузку данных из нескольких источников в таблицы Doris через Streaming Job. После отправки Job Doris продолжает выполнять задание загрузки, в реальном времени считывая данные из источника и записывая их в таблицу Doris.

Этот документ поможет ответить на следующие вопросы:

  • Какие источники данных и режимы синхронизации поддерживает непрерывная загрузка?
  • Как выбрать между SQL Mapping Sync и Auto Table Creation Sync?
  • Как изменяются состояния задания и как работает автоматическое восстановление?
  • Как в повседневной работе просматривать, приостанавливать, возобновлять и удалять задания загрузки?
  • Каковы общие параметры конфигурации FE и Job?

Поддерживаемые источники данных и режимы синхронизации​

Непрерывная загрузка поддерживает следующие источники данных и режимы синхронизации. Уведомления S3 и однократная загрузка поддерживаются начиная с Doris 4.1.6:

Источник данныхПоддерживаемые версииSQL Mapping SyncAuto Table Creation SyncРуководство по настройке
MySQL5.6, 5.7, 8.0.xMySQL CDC с SQL Mapping SyncMySQL CDC с Auto Table Creation SyncAmazon RDS MySQL · Amazon Aurora MySQL
PostgreSQL14, 15, 16, 17PostgreSQL CDC с SQL Mapping SyncPostgreSQL CDC с Auto Table Creation SyncAmazon RDS PostgreSQL · Amazon Aurora PostgreSQL
OceanBaseрежим совместимости с MySQL-OceanBase CDC с Auto Table Creation Sync-
S3-Непрерывная загрузка S3--

Сведения о сопоставлении типов столбцов источника с типами Doris см. в разделах о сопоставлении типов данных для MySQL, PostgreSQL и OceanBase.

Как выбрать метод синхронизации​

SQL Mapping Sync и Auto Table Creation Sync — это два метода непрерывной загрузки с полностью разными внутренними механизмами, а не различие в «количестве таблиц». Auto Table Creation Sync также поддерживает синхронизацию только одной таблицы через include_tables, поэтому выбирать метод следует по требуемым возможностям.

Сравнение возможностей​

ВозможностьSQL Mapping SyncAuto Table Creation Sync
Базовый механизмJob + TVF (INSERT INTO tbl SELECT * FROM tvf())Job + нативный DDL для всей базы данных (FROM src TO DATABASE db)
Уровень назначенияСуществующая таблица DorisКонтейнер базы данных Doris
Охват синхронизацииОдна таблицаОт одной или нескольких таблиц до всей базы данных (управляется include_tables)
Автоматическое создание таблицТаблицы необходимо создать заранееТаблицы с первичным ключом автоматически создаются при первой синхронизации
Гибкость SQLПоддерживаются сопоставление столбцов, фильтрация и преобразование (предложение SELECT)Поддерживаются переименование целевых таблиц и исключение столбцов без ключа; выражения SQL, фильтрация строк и преобразование данных не поддерживаются
Гарантия семантикиexactly-onceat-least-once
Требуемые привилегииLoadLoad + Create (при автоматическом создании таблиц)
Типичные сценарииСинхронизация в реальном времени, требующая выражений SQL, преобразования типов или условной фильтрацииЗеркальная репликация всей базы данных или группы таблиц с возможностью простого переименования целевых таблиц или удаления столбцов

Рекомендации по выбору​

  • Если необходимо обрабатывать данные с помощью SQL или есть строгие требования к семантике exactly-once -> выберите SQL Mapping Sync
  • Если требуется, чтобы Doris автоматически создавал таблицы и синхронизировал группу таблиц одной конфигурацией -> выберите Auto Table Creation Sync
  • Если источником данных является OceanBase -> в настоящее время поддерживается только Auto Table Creation Sync в режиме совместимости с MySQL
  • Если источником данных является объектное хранилище S3 -> поддерживается только SQL Mapping Sync (с использованием S3 TVF)

Переходы состояний задания​

Во время выполнения Streaming Job переходит между следующими состояниями. SQL Mapping Sync и Auto Table Creation Sync используют одну и ту же машину состояний:

job-state-flow

Описание состояний​

СостояниеЗначение
PENDINGЗадание создано, но дочерние задачи ещё не запланированы; оно ожидает следующего цикла планировщика для создания StreamingTask.
RUNNINGДочерняя задача создана и выполняется: она считывает инкрементальные данные из источника и записывает их в Doris.
FINISHEDИсточник полностью обработан, и задание завершено. Задание S3 TVF переходит в это состояние после загрузки всех файлов.
PAUSEDДочерняя задача завершилась ошибкой, задание автоматически приостановлено, а failReason записан. Причину можно проверить в поле ErrorMsg запроса select * from jobs(...).

Автоматическое восстановление (autoResume)​

После перехода задания в PAUSED планировщик периодически пытается восстановить его, используя стратегию экспоненциальной задержки. После восстановления задание возвращается в PENDING и продолжает создавать дочерние задачи. Ручное вмешательство не требуется: временные сбои (нестабильность сети, кратковременная недоступность источника и т. п.) устраняются автоматически.

Используйте соответствующую команду в каждом сценарии:

  • Немедленно возобновить или вручную запустить после устранения неполадки: используйте RESUME JOB
  • Полностью остановить и больше не планировать: используйте PAUSE JOB (задание, приостановленное вручную, не будет разбужено autoResume) или DROP JOB

Идентификатор задачи CDC и обработка сбоев​

Начиная с версии 4.1.5 Streaming CDC использует учётную запись Doris создателя задания для записи, запросов метаданных таблиц и изменений схемы вместо фиксированной учётной записи администратора. Создателю нужны привилегии LOAD для целевых таблиц, CREATE для автоматического создания таблиц, а также соответствующие привилегии ALTER и просмотра таблиц для синхронизации схемы. Отзыв привилегий во время выполнения также влияет на последующие задачи. Проверьте разрешения создателя, указанного в задании.

Неудачные задачи Streaming INSERT на основе cdc_stream() не переходят в обычный поток повторных попыток задач. Изучите ошибки в jobs() и tasks(), исправьте проблемы источника или привилегий и возобновите выполнение в соответствии с состоянием задания. Не следует предполагать, что неудачная задача будет автоматически воспроизведена.

Общие операции​

Просмотр состояния загрузки​

Выполните запрос для всех Insert Job типа Streaming:

select * from jobs("type"="insert") where ExecuteType = "STREAMING";

Столбцы результата:

СтолбецОписание
IDИдентификатор Job
NAMEИмя Job
DefinerОпределитель Job
ExecuteTypeТип планирования задания: ONE_TIME/RECURRING/STREAMING/MANUAL
RecurringStrategyСтратегия повторения. Используется обычным Insert. Пусто, если ExecuteType=Streaming
StatusСостояние Job
ExecuteSqlОператор Insert SQL задания
CreateTimeВремя создания Job
SucceedTaskCountЧисло успешно выполненных задач
FailedTaskCountЧисло неудачных задач
CanceledTaskCountЧисло отменённых задач
CommentКомментарий Job
PropertiesСвойства Job
CurrentOffsetOffset, до которого Job завершил обработку. Заполняется только при ExecuteType=Streaming
EndOffsetМаксимальный EndOffset, полученный Job из источника данных. Заполняется только при ExecuteType=Streaming
LoadStatisticСтатистика Job
ErrorMsgСообщение об ошибке Job
JobRuntimeMsgСообщения о состоянии выполнения Job
LagBytesЧисло отстающих байтов в журнале источника (binlog MySQL / OceanBase или WAL PostgreSQL). -1 означает, что значение сейчас недоступно, например для источника S3 или на этапе полного снимка.
LastSourceEventTimestampМетка времени (в секундах Unix) последнего события источника, записанного в зафиксированном offset. Пусто, если недоступно.
LastTaskSuccessTimeВремя успешного завершения последней Task

Просмотр состояния Task​

Выполните запрос всех дочерних задач Job по его идентификатору:

select * from tasks("type"="insert") where jobId='<job_id>';

Столбцы результата:

СтолбецОписание
TaskIdИдентификатор Task
JobIDИдентификатор Job
JobNameИмя Job
LabelМетка, используемая Task для загрузки
StatusСостояние Task
ErrorMsgСообщение об ошибке Task
CreateTimeВремя создания Task
StartTimeВремя начала Task
FinishTimeВремя завершения Task
LoadStatisticСтатистика Task
UserИсполнитель Task
RunningOffsetИнформация об offset, который сейчас синхронизирует Task. Заполняется только при Job.ExecuteType=Streaming

Приостановка задания загрузки​

Вручную приостановите указанное задание (задание, приостановленное вручную, не будет разбужено autoResume):

PAUSE JOB WHERE jobname = <job_name>;

Возобновление задания загрузки​

Возобновите задание, находящееся в состоянии PAUSED:

RESUME JOB WHERE jobName = <job_name>;

Удаление задания загрузки​

Безвозвратно удалите указанное задание. После удаления оно больше не планируется:

DROP JOB WHERE jobName = <job_name>;

Общие параметры​

Параметры конфигурации FE​

ПараметрПо умолчаниюОписание
max_streaming_job_num1024Максимальное число Streaming Job
job_streaming_task_exec_thread_num10Число потоков для выполнения StreamingTask
max_streaming_task_show_count100Максимальное число записей о выполнении StreamingTask, хранимых в памяти

Общие параметры конфигурации загрузки Job​

Настройте следующие параметры через CREATE JOB ... PROPERTIES (...). Если не указано иное, их можно использовать в заданиях непрерывной загрузки MySQL, PostgreSQL и OceanBase.

ПараметрЗначение по умолчаниюОписание
max_interval10Интервал простоя планировщика в секундах, когда новые данные из источника отсутствуют. Принимаются только целые числа, большие или равные 1; суффиксы единиц, такие как 10s, не поддерживаются.
compute_groupТекущая сессия или вычислительная группа пользователя по умолчаниюПоддерживается только в режиме разделения вычислений и хранения. Указывает вычислительную группу, в которой выполняется задание. Явно заданное значение не может быть пустым, и пользователь должен иметь привилегию USAGE для этой вычислительной группы. Создание задания завершается ошибкой, если параметр не задан и ни текущая сессия, ни пользователь не имеют доступной вычислительной группы по умолчанию.
session.<variable_name>Значение соответствующей переменной сессии по умолчаниюПоддерживается только в режиме TVF. Задаёт переменную сессии для INSERT-задачи Job, например session.insert_max_filter_ratio. Имя и значение переменной должны соответствовать допустимым переменным сессии Doris.

При использовании в качестве свойства Job параметр offset не задаёт начальную позицию задания CDC. При создании задания задайте начальную позицию в параметрах источника FROM MYSQL, FROM POSTGRES, FROM OCEANBASE или cdc_stream(...). После приостановки задания CDC его позицию можно сбросить через ALTER JOB ... PROPERTIES ("offset" = '<json_offset>'). MySQL и OceanBase используют {"file":"binlog.000001","pos":"154"}, а PostgreSQL — {"lsn":"12345678"}. ALTER JOB принимает только точные JSON-значения offset.

Ограничения​

Охват синхронизации, автоматическое создание таблиц и гарантии семантики (exactly-once / at-least-once) описаны в разделе Сравнение возможностей. В этом разделе перечислены только ограничения и варианты поведения, которые не поддерживаются.

Таблицы с первичным ключом​

Синхронизировать можно только исходные таблицы с первичным ключом (для обоих методов синхронизации). Соответствующая таблица Doris является таблицей Unique Key — в Auto Table Creation Sync она создаётся автоматически, а в SQL Mapping Sync вы создаёте её самостоятельно. Таблицы без первичного ключа не поддерживаются.

Schema Change (DDL)​

Синхронизация DDL применяется только к методу Auto Table Creation Sync; метод SQL Mapping Sync не синхронизирует DDL — табличная функция cdc_stream() всегда принудительно устанавливает schema_change_enabled в false.

  • Для MySQL, PostgreSQL и OceanBase синхронизируются только ADD COLUMN и DROP COLUMN. Изменения типов столбцов, RENAME COLUMN, а также изменения первичных ключей, ограничений, индексов и секционирования НЕ синхронизируются — применяйте их вручную в Doris. Информацию о поведении и ограничениях для конкретного источника см. в разделах о синхронизации Schema Change для MySQL, PostgreSQL и OceanBase.

Auto Table Creation Sync включает Schema Change Sync по умолчанию. В настоящее время Doris не предоставляет SQL-свойство для его отключения.

Часто задаваемые вопросы​

Ошибка подключения MySQL: Public Key Retrieval is not allowed​

Причина: настроенный пользователь MySQL использует аутентификацию паролем SHA256, которая требует передачи пароля по протоколу TLS или аналогичному протоколу.

Решение 1: добавьте параметр allowPublicKeyRetrieval=true в JDBC URL:

jdbc:mysql://127.0.0.1:3306?allowPublicKeyRetrieval=true

Решение 2: измените метод аутентификации пользователя MySQL на mysql_native_password:

ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;