著者 | 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
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 DataX を使用して同期する
DataX は、Alibaba Cloud DataWorks データ統合のオープンソース バージョンであり、OceanBase から Doris にデータを簡単に移行できる 2 つのコンポーネント、OceanBaseReader と DorisWriter を提供します。具体的な使用手順は次のとおりです。
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
4. データ同期を完了します。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.02 sec)
02 カタログ同期を使用する
Apache Doris でサポートされているCatalog 関数を使用すると、Oceanbase のデータ テーブルを Doris にマッピングでき、Insert を通じてデータを Doris に同期できます。
OceanBase ドライバー パッケージを FE ディレクトリと BEjdbc_drivers
ディレクトリにダウンロードし、次のコードの操作を順番に実行します。
-- 创建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 には空ではないパスワードを持つシステム テナント ユーザーが必要なので、最初に 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. Flink環境設定
OceanBase CDC jar パッケージとDoris Connector を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 バージョンがサポートされています。詳細については、GitHub リリースを参照してください。
04 Outfileを使用してエクスポートする
Oceanbase のOutfile 機能を使用してデータをローカルまたは OSS にエクスポートしたり、Doris の Stream Load/S3 Load 機能に基づいてデータを Doris にインポートしたりすることもできます。ローカル ファイルの例を次に示します。
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 で Stream Load を実行し、ローカル ファイルを 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 スキーマ型マッピング
詳細については、JDBC カタログ - MySQL ドキュメントを参照してください。
02 Oracle スキーマ型マッピング
詳細については、JDBC カタログ - Oracle ドキュメントを参照してください。
結論
この記事では、さまざまなシナリオの同期ニーズを満たす、OceanBase データを Doris と同期するさまざまな方法を紹介します。オフライン データを同期する必要がある場合は、DataX/Catalog/Outfile 方式を選択できます。リアルタイム データを同期する必要がある場合は、Flink CDC 方式を直接選択できます。さらに、完全データ同期と増分データ同期の両方を Flink CDC を通じて完了できます。
ライナスは、カーネル開発者がタブをスペースに置き換えるのを防ぐことに自ら取り組みました。 彼の父親はコードを書くことができる数少ないリーダーの 1 人であり、次男はオープンソース テクノロジー部門のディレクターであり、末息子はオープンソース コアです。寄稿者Robin Li: 自然言語 は 新しいユニバーサル プログラミング言語になるでしょう。オープン ソース モデルは Huawei にますます後れをとっていきます 。一般的に使用されている 5,000 のモバイル アプリケーションを Honmeng に完全に移行するには 1 年かかります。 リッチテキスト エディタ Quill 2.0 が リリースされ、機能、信頼性、開発者は「恨みを取り除く 」 ために握手を交わしました。 Laoxiangji のソースはコードではありませんが、その背後にある理由は非常に心温まるものです。Googleは大規模な組織再編を発表しました。