Научите вас шаг за шагом, как легко перенести данные OceanBase в Apache Doris|Практическое руководство.

Автор | техническая команда SelectDB

OceanBase — широко известная распределенная база данных, которая широко используется во многих критически важных бизнес-системах предприятия. В сообществе Apache Doris многие пользователи предпочитают создавать мощные каналы обработки и анализа данных на основе OceanBase и Apache Doris. В этой статье подробно описано, как удобно и эффективно мигрировать/синхронизировать данные из OceanBase в Apache Doris.

Практическое руководство

00 Подготовка окружающей среды

Используйте Docker для запуска службы Oceanbase. Чтобы создать среду OceanBase Docker, обратитесь к документации Oceanbase — используйте Docker для развертывания базы данных OceanBase.

docker run -p 2881:2881 --name oceanbase -e MINI_MODE=1 -d oceanbase/oceanbase-ce:4.0.0.0

Создайте таблицу в OceanBase и добавьте данные.

[root@VM-10-6-centos ~]$ mysql -h127.0.0.1 -P2881 -uroot

mysql> CREATE DATABASE ob;                                                                                                                                 
Query OK, 1 row affected (0.01 sec)
                                                                                                                                                           
mysql> use ob;                                                                                                                                             
Database changed  

mysql> CREATE TABLE student (                                                                                                                              
    -> id int,                                                                                                                                     
    -> name varchar(256),                                                                                                                              
    -> age int,                                                                                                                                    
    -> primary key (id)                                                                                                                                  
    -> );                                                                                                                                                  
Query OK, 0 rows affected (0.06 sec)


mysql> insert into student values(1, 'zhangsan01', 18),                                                                                                    
    ->                           (2, 'zhangsan02', 23),                                                                                                    
    ->                           (3, 'zhangsan03', 30),                                                                                                    
    ->                           (4, 'zhangsan04', 35),                                                                                                    
    ->                           (5, 'zhangsan05', 40);                                                                                                    
Query OK, 5 rows affected (0.01 sec)                                                                                                                       
Records: 5  Duplicates: 0  Warnings: 0  

Создать таблицу в Дорис

[root@VM-10-6-centos ~]$ mysql -h127.0.0.1 -P9030 -uroot -p

mysql> CREATE TABLE `student` (                                                                                                                            
    ->    id int,                                                                                                                                          
    ->   `name` varchar(256),
    ->   `age` int                                                                                                                              
    -> ) ENGINE=OLAP                                                                                                                                       
    -> UNIQUE KEY(`id`)                                                                                                                                    
    -> COMMENT 'OLAP'                                                                                                                                      
    -> DISTRIBUTED BY HASH(`id`) BUCKETS 1                                                                                                                 
    -> PROPERTIES (                                                                                                                                        
    -> "replication_allocation" = "tag.location.default: 1"                                                                                                
    -> );                                                                                                                                                  
Query OK, 0 rows affected (0.06 sec) 

01 Синхронизация с помощью DataX

DataX — это версия интеграции данных Alibaba Cloud DataWorks с открытым исходным кодом. Она предоставляет два компонента: OceanBaseReader и DorisWriter, которые могут легко переносить данные из OceanBase в Doris. Конкретные этапы использования:

1. Загрузите DataX

2. Запишите файл конфигурации DataX.

{                                                                                                                                                          
    "job": {                                                                                                                                               
        "setting": {                                                                                                                                       
            "speed": {                                                                                                                                     
                "channel": 1                                                                                                                               
            }                                                                                                                                              
        },                                                                                                                                                 
        "content": [                                                                                                                                       
            {                                                                                                                                              
                "reader": {                                                                                                                                
                    "name": "oceanbasev10reader",                                                                                                          
                    "parameter": {                                                                                                                         
                        "username": "root",                                                                                                                
                        "password": "123456",                                                                                                              
                        "column": ["*"],                                                                                                                   
                        "connection": [                                                                                                                    
                            {                                                                                                                              
                                "table": ["student"],                                                                                                   
                                "jdbcUrl": ["jdbc:oceanbase://127.0.0.1:2881/ob"]                                                                       
                            }                                                                                                                              
                        ]                                                                                                                                  
                    }                                                                                                                                      
                },                                                                                                                                         
                "writer": {                                                                                                                                
                    "name": "doriswriter",                                                                                                                 
                    "parameter": {                                                                                                                         
                        "loadUrl": ["127.0.0.1:28737"],                                                                                                   
                        "loadProps": {                                                                                                                     
                        },                                                                                                                                 
                        "column": ["*"],                                                                                                                   
                        "username": "root",                                                                                                                
                        "password": "",                                                                                                                    
                        "postSql": [],                                                                                                                     
                        "preSql": [],                                                                                                                      
                        "flushInterval":10000,                                                                                                             
                        "connection": [                                                                                                                    
                          {                                                                                                                                
                            "jdbcUrl": "jdbc:mysql://127.0.0.1:29737/test",                                                                               
                            "selectedDatabase": "test",                                                                                                    
                            "table": ["student"]                                                                                                     
                          }                                                                                                                                
                        ],                                                                                                                                 
                        "loadProps": {                                                                                                                     
                            "format": "json",                                                                                                              
                            "strip_outer_array": true                                                                                                      
                        }                                                                                                                                  
                    }                                                                                                                                      
                }                                                                                                                                          
            }                                                                                                                                              
        ]                                                                                                                                                  
    }                                                                                                                                                      
}        

Дополнительную информацию о настройке см. в Oceanbasev10reader и DorisWriter .

3. Выполните скрипт DataX.

python2 bin/datax.py oceanbase2doris.json

Выполнить скрипт DataX.png

4. Полная синхронизация данных. Данные в Дорисе:

mysql> select * from student;                                                                                                                              
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.02 sec) 

02 Использование синхронизации каталога

Используя функцию каталога , поддерживаемую Apache Doris , таблицу данных в Oceanbase можно сопоставить с Doris, а данные можно синхронизировать с Doris посредством вставки.

Загрузите пакет драйверов OceanBase в jdbc_driversкаталоги FE и BE и последовательно выполните операции следующего кода:

-- 创建catalog
CREATE CATALOG jdbc_oceanbase PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:oceanbase://127.0.0.1:2881/ob",
    "driver_url" = "oceanbase-client-2.4.2.jar",
    "driver_class" = "com.oceanbase.jdbc.Driver"
)

-- 在doris中查询oceanbase的表
mysql> select * from jdbc_oceanbase.ob.student;                                                                                                            
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.02 sec)

mysql> CREATE TABLE internal.test.student                                                                                                                  
    -> PROPERTIES("replication_num" = "1")                                                                                                                 
    -> AS SELECT * FROM jdbc_oceanbase.ob.student;                                                                                                         
Query OK, 5 rows affected (0.07 sec)                                                                                                                       
{'label':'label_139f7d7f13ba491b_85038d67c9e3ae32', 'status':'VISIBLE', 'txnId':'12014'}


mysql> select * from internal.test.student;                                                                                                                
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.03 sec) 

03 Используйте синхронизацию Flink CDC

Flink CDC предоставляет разъем OceanBase CDC , позволяющий считывать данные моментального снимка и инкрементальные данные из OceanBase. Конкретные шаги заключаются в следующем:

1. Подготовьте среду

Запустите OceanBase и OBLogProxy.

docker pull oceanbase/oceanbase-ce:4.0.0.0
docker run --name oceanbase --network=host -e MINI_MODE=1 -d oceanbase/oceanbase-ce:4.0.0.0

docker pull whhe/oblogproxy:1.1.0_4x
docker run --network=host --name oceanbase_proxy -e OB_SYS_USERNAME=root -e OB_SYS_PASSWORD=123456 -d whhe/oblogproxy:1.1.0_4x

2. Установить пароль

В OceanBase у пользователя root по умолчанию нет пароля. Для OBLogProxy требуется системный пользователь-арендатор с непустым паролем, поэтому сначала необходимо установить пароль для корневого пользователя @sys .

-- 登陆root用户的sys租户,
mysql -h127.0.0.1 -P2881 -uroot@sys 

-- 设置密码为上面的OB_SYS_PASSWORD
MySQL [(none)]> ALTER USER root IDENTIFIED BY '123456';                                                                                                    
Query OK, 0 rows affected (0.02 sec)    

-- 进入root用户的test租户,单独设置密码test
mysql -h127.0.0.1 -P2881 -uroot@test 
MySQL [(none)]> ALTER USER root IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.02 sec)

-- 创建数据库表和数据
mysql> CREATE DATABASE ob;
mysql> USE ob;
mysql> CREATE TABLE student (                                                                                                                              
    -> id int,                                                                                                                                     
    -> name varchar(256),                                                                                                                              
    -> age int,                                                                                                                                    
    -> primary key (id)                                                                                                                                  
    -> );                                                                                                                                                  
Query OK, 0 rows affected (0.06 sec)

mysql> insert into student values(1, 'zhangsan01', 18),                                                                                                    
    ->                           (2, 'zhangsan02', 23),                                                                                                    
    ->                           (3, 'zhangsan03', 30),                                                                                                    
    ->                           (4, 'zhangsan04', 35),                                                                                                    
    ->                           (5, 'zhangsan05', 40);                                                                                                    
Query OK, 5 rows affected (0.01 sec)                                                                                                                       
Records: 5  Duplicates: 0  Warnings: 0  

3. Конфигурация среды Flink

Поместите jar-пакет OceanBase CDC и соединитель Doris в FLINK_HOME/libкаталог и перезапустите кластер Flink.

4. Выполнение задач Flink SQL.

SET 'execution.checkpointing.interval' = '3s';

CREATE TABLE student (
    id INT,
    name STRING,
    age INT,
    PRIMARY KEY (id) NOT ENFORCED
  ) WITH (
    'connector' = 'oceanbase-cdc',
    'scan.startup.mode' = 'initial',
    'username' = 'root@test',
    'password' = 'test',
    'tenant-name' = 'test',
    'database-name' = 'ob',
    'table-name' = 'student',
    'hostname' = 'localhost',
    'port' = '2881',
    'rootserver-list' = '127.0.0.1:2882:2881',
    'logproxy.host' = 'localhost',
    'logproxy.port' = '2983',
    'working-mode' = 'memory'
  );
 
CREATE TABLE doris_sink (
    id INT,
    name STRING,
    age INT
)
WITH (
'connector' = 'doris',
'fenodes' = '10.16.10.6:28737',
'table.identifier' = 'test.student',
'username' = 'root',
'password' = ''
);
  
INSERT into doris_sink select * from student;

После отправки задачи вы можете запросить полный объем синхронизированных данных в Doris.

mysql> select * from  student;                                                                                                                             
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.01 sec)  

Затем смоделируйте новые данные в OceanBase.

MySQL [ob]> insert into student values(6, 'zhangsan06', 48)                                                                                                
    -> ;                                                                                                                                                   
Query OK, 1 row affected (0.13 sec)  

После отправки задачи вы можете запросить синхронизированные новые данные в Doris.

mysql> select * from  student;                                                                                                                             
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
|    6 | zhangsan06 |   48 |                                                                                                                               
+------+------------+------+                                                                                                                               
6 rows in set (0.02 sec) 

Примечание. Поддерживаются версии OceanBase 3.x и 4.x. Необходимо обратить внимание на соответствие версий между OBLogProxy и OceanBase. Подробную информацию см. в выпуске GitHub.

04 Используйте Outfile для экспорта

Вы также можете использовать функцию Outfile Oceanbase для экспорта данных в локальную систему или OSS, а также импортировать данные в Doris на основе возможностей Doris Stream Load/S3 Load. Вот локальный файл в качестве примера:

MySQL [ob]> select * from student;                                                                                                                         
+----+------------+------+                                                                                                                                 
| id | name       | age  |                                                                                                                                 
+----+------------+------+                                                                                                                                 
|  1 | zhangsan01 |   18 |                                                                                                                                 
|  2 | zhangsan02 |   23 |                                                                                                                                 
|  3 | zhangsan03 |   30 |                                                                                                                                 
|  4 | zhangsan04 |   35 |                                                                                                                                 
|  5 | zhangsan05 |   40 |                                                                                                                                 
|  6 | zhangsan06 |   48 |                                                                                                                                 
+----+------------+------+                                                                                                                                 
6 rows in set (0.00 sec)   

MySQL [ob]> SELECT id,name,age INTO OUTFILE '/home/student.csv' 
            FIELDS TERMINATED BY ','
            LINES TERMINATED BY '\n' FROM student;
Query OK, 3 rows affected (0.01 sec)


#cat student.csv
1,zhangsan01,18
2,zhangsan02,23
3,zhangsan03,30
4,zhangsan04,35
5,zhangsan05,40
6,zhangsan06,48

Выполните потоковую загрузку в Doris и импортируйте локальные файлы в Doris.

curl  --location-trusted -u root:  -H "column_separator:," -T student.csv http://127.0.0.1:28737/api/test/student/_stream_load

После завершения импорта импортированные данные можно запросить в Doris.

mysql> select * from student;                                                                                                                              
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
|    6 | zhangsan06 |   48 |                                                                                                                               
+------+------------+------+                                                                                                                               
6 rows in set (0.05 sec)    

Сопоставление типов данных

База данных OceanBase может поддерживать режимы MySQL и Oracle в одной и той же системе, поэтому сопоставление типов Apache Doris также такое же, как в MySQL и Oracle. Это означает, что когда OceanBase устанавливает связь с Apache Doris, он может определять таблицы и столбцы в соответствии с таблицей ниже, чтобы обеспечить плавные операции миграции/синхронизации данных.

01 Сопоставление типов схемы MySQL

Mapping типа схемы MySQL.png

Подробную информацию см. в разделе: Каталог JDBC — документация MySQL.

02 Сопоставление типов схемы Oracle

Mapping типа схемы Oracle.png

Подробную информацию см. в: Каталог JDBC — документация Oracle.

Заключение

В этой статье представлены различные способы синхронизации данных OceanBase с Doris, которые могут удовлетворить потребности синхронизации в различных сценариях. Если вам нужно синхронизировать автономные данные, вы можете выбрать метод DataX/Catalog/Outfile; если вам нужно синхронизировать данные в реальном времени, вы можете напрямую выбрать метод Flink CDC. Кроме того, с помощью Flink CDC можно выполнить как полную, так и инкрементную синхронизацию данных.

Линус взял на себя задачу не допустить, чтобы разработчики ядра заменяли табуляции пробелами. Его отец — один из немногих руководителей, умеющих писать код, его второй сын — директор отдела технологий с открытым исходным кодом, а младший сын — ядро ​​с открытым исходным кодом. участник Робин Ли: Естественный язык станет новым универсальным языком программирования. Модель с открытым исходным кодом будет все больше и больше отставать от Huawei: потребуется 1 год, чтобы полностью перенести 5000 часто используемых мобильных приложений на язык Hongmeng, наиболее подверженный этому . сторонние уязвимости. Расширенный текстовый редактор Quill 2.0 был выпущен с функциями, надежностью и разработчиками. Опыт был значительно улучшен. Ма Хуатэн и Чжоу Хунъи пожали друг другу руки, чтобы «устранить обиды». Meta Llama 3 официально выпущен. источник Laoxiangji не является кодом, причины этого очень трогательны. Google объявил о масштабной реструктуризации.
{{o.name}}
{{m.name}}

рекомендация

отmy.oschina.net/selectdb/blog/11053991