Ensina passo a passo como migrar facilmente dados do OceanBase para Apache Doris|Guia Prático

Autor | Equipe técnica do SelectDB

Como um banco de dados distribuído amplamente reconhecido, o OceanBase tem sido amplamente utilizado em muitos sistemas de negócios críticos para empresas. Na comunidade Apache Doris , muitos usuários optam por construir links poderosos de processamento e análise de dados baseados em OceanBase e Apache Doris. Este artigo apresentará em detalhes como migrar/sincronizar dados do OceanBase para Apache Doris de maneira conveniente e eficiente.

Guia prático

00 Preparação do ambiente

Use o Docker para iniciar o serviço Oceanbase Para construir o ambiente OceanBase Docker, consulte a documentação do Oceanbase - Use o Docker para implantar o banco de dados OceanBase.

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

Crie uma tabela no OceanBase e adicione dados

[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  

Crie uma mesa em Doris

[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 Sincronizar usando DataX

DataX é uma versão de código aberto da integração de dados Alibaba Cloud DataWorks. Ele fornece dois componentes, OceanBaseReader e DorisWriter, que podem migrar facilmente dados do OceanBase para Doris. As etapas de uso específicas são:

1. Baixe o DataX

2. Escreva o arquivo de configuração 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                                                                                                      
                        }                                                                                                                                  
                    }                                                                                                                                      
                }                                                                                                                                          
            }                                                                                                                                              
        ]                                                                                                                                                  
    }                                                                                                                                                      
}        

Para obter mais configurações, consulte Oceanbasev10reader e DorisWriter .

3. Execute o script DataX

python2 bin/datax.py oceanbase2doris.json

Executar script DataX.png

4. Sincronização completa de dados Os dados em Doris são:

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 Use a sincronização do catálogo

Usando a função Catalog suportada pelo Apache Doris , a tabela de dados no Oceanbase pode ser mapeada para Doris e os dados podem ser sincronizados com Doris por meio de Insert.

Baixe o pacote do driver OceanBase para os jdbc_driversdiretórios FE e BE e execute as operações no seguinte código em sequência:

-- 创建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 Use a sincronização do Flink CDC

O Flink CDC fornece o conector OceanBase CDC , permitindo que dados instantâneos e dados incrementais sejam lidos do OceanBase. As etapas específicas são as seguintes:

1. Prepare o ambiente

Inicie OceanBase e 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. Definir senha

No OceanBase, o usuário Root não possui senha por padrão. OBLogProxy requer um usuário locatário do sistema com uma senha não vazia, portanto, você precisa primeiro definir uma senha para o usuário root @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. Configuração do ambiente Flink

Coloque o pacote jar OceanBase CDC e o Doris Connector no FLINK_HOME/libdiretório e reinicie o cluster Flink.

4. Execute tarefas 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;

Após enviar a tarefa, você pode consultar a quantidade total de dados sincronizados no 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)  

A seguir, simule novos dados no OceanBase

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

Após enviar a tarefa, você pode consultar os novos dados sincronizados em 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) 

Nota: As versões OceanBase 3.xe 4.x são suportadas. Você precisa prestar atenção ao relacionamento de correspondência de versão entre OBLogProxy e OceanBase .

04 Use Outfile para exportar

Você também pode usar a função Outfile do Oceanbase para exportar dados para local ou OSS e importar dados para o Doris com base nos recursos Stream Load/S3 Load do Doris. Aqui está um arquivo local como exemplo:

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

Execute Stream Load em Doris e importe arquivos locais para Doris

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

Após a conclusão da importação, os dados importados podem ser consultados no 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)    

Mapeamento de tipo de dados

O banco de dados OceanBase pode suportar os modos MySQL e Oracle no mesmo sistema, portanto, o mapeamento do tipo Apache Doris também é igual ao MySQL e Oracle. Isso significa que quando o OceanBase estabelece um relacionamento de mapeamento com o Apache Doris, ele pode definir tabelas e colunas de acordo com a tabela abaixo para criar operações tranquilas de migração/sincronização de dados.

01 Mapeamento de tipo de esquema MySQL

Mapeamento de tipo de esquema MySQL.png

Para obter detalhes, consulte: Catálogo JDBC - Documentação MySQL

02 Mapeamento de tipo de esquema Oracle

Mapeamento de tipo de esquema Oracle.png

Para obter detalhes, consulte: Catálogo JDBC - Documentação Oracle

Conclusão

Este artigo apresenta uma variedade de maneiras de sincronizar dados do OceanBase com Doris, que podem atender às necessidades de sincronização de diferentes cenários. Se precisar sincronizar dados offline, você pode escolher o método DataX/Catalog/Outfile; se precisar sincronizar dados em tempo real, você pode escolher diretamente o método Flink CDC. Além disso, a sincronização de dados completos e incrementais pode ser concluída por meio do Flink CDC.

Linus assumiu a responsabilidade de evitar que os desenvolvedores do kernel substituíssem tabulações por espaços. Seu pai é um dos poucos líderes que sabe escrever código, seu segundo filho é o diretor do departamento de tecnologia de código aberto e seu filho mais novo é um núcleo de código aberto. contribuidor Robin Li: A linguagem natural se tornará uma nova linguagem de programação universal. O modelo de código aberto ficará cada vez mais atrás da Huawei: levará 1 ano para migrar totalmente 5.000 aplicativos móveis comumente usados ​​para Hongmeng. vulnerabilidades de terceiros. O editor de rich text Quill 2.0 foi lançado com recursos, confiabilidade e desenvolvedores. A experiência foi bastante melhorada. fonte de Laoxiangji não é o código, as razões por trás disso são muito comoventes. O Google anunciou uma reestruturação em grande escala.
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/selectdb/blog/11053991
Recomendado
Clasificación