OceanBase CDC с автоматическим созданием таблиц
Непрерывная загрузка Doris является экспериментальной функцией и поддерживается начиная с Doris 4.1.5.
OceanBase CDC с автоматическим созданием таблиц использует FROM OCEANBASE (...) TO DATABASE (...). Doris считывает полные и инкрементальные данные через сервис OBBinlog и автоматически создаёт таблицы Doris Unique Key на основе схем вышестоящих таблиц. Используйте include_tables, чтобы синхронизировать одну, несколько или все таблицы базы данных.
В настоящее время непрерывная загрузка OceanBase поддерживает только режим совместимости OceanBase MySQL и Auto Table Creation Sync. Режим совместимости Oracle и SQL Mapping Sync не поддерживаются.
Сценарии применения
- Зеркально синхронизировать группу таблиц OceanBase или всю базу данных с Doris.
- Позволить Doris создавать целевые таблицы и первичные ключи на основе схем вышестоящих таблиц.
- Выполнить первоначальную полную загрузку, а затем непрерывно синхронизировать инкрементальные изменения.
- Переименовывать целевые таблицы или исключать столбцы без SQL-выражений, фильтрации строк и преобразований данных.
Возможности и ограничения
| Пункт | Описание |
|---|---|
| Режим совместимости | Только режим совместимости OceanBase MySQL |
| Метод синхронизации | Только Auto Table Creation Sync; SQL Mapping Sync не поддерживается |
| Семантика согласованности | At-least-once |
| Тип таблиц | Вышестоящие таблицы должны иметь первичные ключи; автоматически созданные таблицы Doris используют модель Unique Key |
| Разрешения | Требуется разрешение Load; если целевая таблица не существует, также требуется разрешение Create |
| Schema Change | Синхронизируются ADD COLUMN и DROP COLUMN; см. Синхронизация Schema Change |
| Типы данных | Используется преобразование типов, совместимое с MySQL; см. Сопоставление типов данных |
Предварительные условия
Перед созданием задания убедитесь в следующем:
- OceanBase работает в режиме совместимости MySQL. При создании задания Doris проверяет режим, выполняя
SHOW VARIABLES LIKE 'ob_compatibility_mode'. - Сервис OBBinlog развёрнут и доступен. Выполнение
SHOW MASTER STATUSчерез его конечную точку протокола MySQL возвращает корректные файл и позицию binlog. - Doris FE, BE и CDC Client могут обращаться к сервису OBBinlog.
- Доступен совместимый драйвер MySQL Connector/J, а
jdbc_urlначинается сjdbc:mysql://. - Исходная учётная запись может читать таблицы, схемы и binlog в области синхронизации.
- Каждая синхронизируемая вышестоящая таблица имеет первичный ключ.
Быстрый старт
Шаг 1. Создайте задание загрузки
Следующий пример синхронизирует таблицы users и orders в source_db:
CREATE JOB oceanbase_db_sync
ON STREAMING
FROM OCEANBASE (
"jdbc_url" = "jdbc:mysql://127.0.0.1:2883",
"driver_url" = "mysql-connector-j-8.4.0.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver",
"user" = "root@test",
"password" = "123456",
"database" = "source_db",
"include_tables" = "users,orders",
"offset" = "initial"
)
TO DATABASE target_db (
"table.create.properties.replication_num" = "1"
);
jdbc_urlуказывает на порт протокола MySQL сервиса OBBinlog. Используйте порт, настроенный в вашем развёртывании.offset = "initial"сначала загружает существующие строки, а затем непрерывно синхронизирует изменения binlog.- Если
include_tablesне указан, синхронизируются все подходящие таблицы вdatabase. - Для развёртывания с одним BE установите
replication_numравным1. В рабочей среде задайте число реплик в соответствии с размером кластера.
Шаг 2. Проверьте состояние загрузки
SELECT Name, Status, CurrentOffset, ErrorMsg
FROM jobs("type" = "insert")
WHERE Name = "oceanbase_db_sync";
При нормальной работе задания значение Status равно RUNNING:
+-------------------+---------+-----------------------------------------------+----------+
| Name | Status | CurrentOffset | ErrorMsg |
+-------------------+---------+-----------------------------------------------+----------+
| oceanbase_db_sync | RUNNING | {"file":"binlog.000001","pos":"154", ...} | NULL |
+-------------------+---------+-----------------------------------------------+----------+
Шаг 3. Проверьте инкрементальную синхронизацию
После выполнения INSERT, UPDATE или DELETE в исходной таблице OceanBase запросите соответствующую таблицу Doris и убедитесь, что изменение синхронизировано:
SELECT * FROM target_db.users ORDER BY id;
Операции приостановки, возобновления, удаления и запроса Task см. в разделе Обзор непрерывной загрузки.
Параметры источника данных
| Параметр | Обязательный | Значение по умолчанию | Описание |
|---|---|---|---|
jdbc_url | Да | - | Строка JDBC-подключения к сервису OBBinlog. Должна начинаться с jdbc:mysql://. |
driver_url | Да | - | Путь к jar-файлу драйвера MySQL Connector/J. Поддерживаются имя файла, локальный абсолютный путь или URL HTTP. |
driver_class | Да | - | Класс драйвера MySQL JDBC, например com.mysql.cj.jdbc.Driver. |
user | Да | - | Имя пользователя OceanBase. Включите сведения о тенанте в формате имени пользователя, требуемом OceanBase. |
password | Да | - | Пароль пользователя OceanBase. |
database | Да | - | Имя базы данных OceanBase. |
include_tables | Нет | - | Имена синхронизируемых таблиц через запятую. Если параметр не указан, синхронизируются все таблицы базы данных. |
exclude_tables | Нет | - | Имена таблиц, которые не нужно синхронизировать, через запятую. Параметр действует только если include_tables не задан. |
table.<table_name>.target_table | Нет | Имя исходной таблицы | Задаёт имя целевой таблицы Doris для исходной таблицы. |
table.<table_name>.exclude_columns | Нет | - | Исключает неключевые столбцы исходной таблицы через запятую. Каждый столбец должен существовать и не может быть столбцом первичного ключа. |
offset | Нет | latest | Начальная позиция. initial: полная и инкрементальная синхронизация; snapshot: только полная синхронизация; earliest: запуск с самой ранней доступной позиции binlog; latest: синхронизация только изменений после запуска задания. Также поддерживается точная позиция, например {"file":"binlog.000001","pos":"154"}. |
snapshot_split_size | Нет | 40960 | Число строк в каждом фрагменте на этапе полной синхронизации. Должно быть положительным целым числом. |
snapshot_parallelism | Нет | 1 | Максимальное число фрагментов, планируемых параллельно одним Task на этапе полной синхронизации. Должно быть положительным целым числом. |
skip_snapshot_backfill | Нет | true | Пропускать ли обратное заполнение binlog на этапе создания снимка. Auto Table Creation Sync использует семантику at-least-once. |
server_id | Нет | Создаётся автоматически | Server ID средства чтения CDC. Поддерживается одно значение, например 5400, или замкнутый диапазон, например 5400-5408. Диапазон должен содержать как минимум snapshot_parallelism идентификаторов. |
ssl_mode | Нет | disable | Режим SSL. Допустимые значения: disable, require и verify-ca. |
ssl_rootcert | Условно | - | Требуется, если ssl_mode имеет значение verify-ca. Используйте формат FILE:<file_name> и сначала загрузите файл с помощью CREATE FILE. |
Параметры schema, slot_name и publication_name не поддерживаются. Если указан любой из них, создание задания завершается ошибкой.
Справочное руководство
Оператор загрузки
CREATE JOB <job_name>
[job_properties]
ON STREAMING
[COMMENT <comment>]
FROM OCEANBASE (
[source_properties]
)
TO DATABASE <target_db> (
[target_properties]
);
| Модуль | Описание |
|---|---|
job_name | Имя задания. |
job_properties | Общие параметры Job, такие как max_interval и compute_group. |
comment | Комментарий к заданию. |
source_properties | Параметры источника данных OceanBase. |
target_properties | Параметры целевой базы данных Doris. |
Параметры целевой базы данных Doris
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
table.create.properties.* | - | Добавляет свойства таблицы при создании таблицы Doris, например table.create.properties.replication_num. |
load.strict_mode | false | Включать ли строгий режим для Stream Load. |
load.max_filter_ratio | 0 | Максимально допустимая доля отфильтрованных строк в окне выборки, в диапазоне [0, 1]. Задание приостанавливается, если доля превышает это значение. |
Рекомендации и лучшие практики
- Перед расширением области синхронизации в рабочей среде используйте небольшой набор таблиц, чтобы проверить подключение к OBBinlog, сопоставление типов и задержку инкрементальной синхронизации.
- Используйте
include_tables, чтобы явно задать область синхронизации и не включать автоматически несвязанные таблицы, добавленные позднее. - Исключайте неподдерживаемые неключевые столбцы с помощью
table.<table_name>.exclude_columns. Столбцы первичного ключа исключать нельзя. - Перед внесением неподдерживаемого изменения схемы приостановите задание, примените совместимое изменение к таблице Doris, а затем возобновите задание.
- Отслеживайте
CurrentOffset,LagBytesиErrorMsg, чтобы убедиться, что задание продолжает выполняться и не было автоматически приостановлено.
Часто задаваемые вопросы
Q1. Поддерживается ли режим совместимости OceanBase Oracle?
Нет. Doris проверяет ob_compatibility_mode при создании задания и отклоняет любой режим, кроме режима совместимости MySQL.
Q2. Поддерживается ли SQL Mapping Sync?
Нет. В настоящее время OceanBase поддерживает только Auto Table Creation Sync через FROM OCEANBASE (...) TO DATABASE (...).
Q3. Как синхронизировать только изменения, произошедшие после запуска задания?
Установите для offset значение latest. Строки, существовавшие до перехода задания в состояние RUNNING, не загружаются через снимок.
Q4. Перезаписывается ли существующая целевая таблица?
Нет. Автоматическое создание таблиц пропускает уже существующую целевую таблицу. Убедитесь, что её первичный ключ и типы столбцов совместимы с исходной таблицей.