バックグラウンド
MySQL
データベースには 1 億件を超える機器履歴データ テーブルがあります。低コストで迅速に移行するにはどうすればよいでしょうかTDengine3.x
?
タイトルからわかるように、私たちが使用するデータ移行/同期ツールは、DataX
データ ソース ( Source
) が従来のリレーショナル データベースでありMySQL
、ターゲット データベース ( Sink
) がシーン特性を持つ新しいタイプの時系列データベースですTDengine
。
DataX: Alibaba Cloud DataWorks データ統合のオープンソース バージョンであり、アリババ グループで広く使用されているオフライン データ同期ツール/プラットフォームです。DataX
MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore (OTS)、MaxCompute (ODPS)、Hologres、DRDS、databend など、さまざまな異種データソース間の効率的なデータ同期機能を実現します。
MySQL: わずかに。。
TDengine: オープンソース、高性能、クラウドネイティブの時系列データベース (Time-Series Database、TSDB) です。モノのインターネット、産業用インターネット、車両のインターネット、運用と保守、金融などの分野TDengine
で広く使用できます。IT
時系列データベースのコア機能に加え、TDengine
キャッシュ、データサブスクリプション、ストリーミングコンピューティングなどの機能も提供し、システム設計の複雑さを最小限に抑え、研究開発費や運用コストを削減するミニマルな時系列データ処理プラットフォームです。
からMySQL
へのデータ移行はTDengine3.x
、異種データの移行に直面しています。まず、MySQL
と のデータ モデルの違いを理解する必要がありますTDengine
。詳細については、Taosi Data が公式に提供する電力メーター データのモデル比較: MySQL 開発者向け TDengine Getting Started Guideを参照してください。
データ・モデル
貯水池の水位監視の場合を例にとると、 には、MySQL
1 つのデバイス情報テーブル (デバイス番号、メーカー、モデルなど) と 1 つのデバイス データ テーブル (センサーによって収集されたシーケンス データ) があります。
のMySQL
2 つのテーブルは、TDengine
への移行後は1 スーパーテーブル+ N (デバイス数) のサブテーブルTDengine
となり、各サブテーブルの名前がデバイス情報テーブルの各デバイス コードに対応する、という設計思想でモデル化されています。具体的には、のデータ モデルは次のとおりです。MySQL
TDengine
create database if not exists sensor;
create stable if not exists sensor.water(ts timestamp, level float, status int) tags(district_code nchar(6), unit_id nchar(36), sensor_code int);
ここで作成されるスーパーテーブルは 1 つだけであり、特定のサブテーブルはMySQL
データ移行時にデバイス情報テーブルのデバイス コードに従って自動的に作成されます。
移行ツールの準備
最初はhttps://github.com/taosdata/DataXの README: Download DataX download addressから直接ダウンロードしていたのですが、後で Writer のバージョンがないことが分かり、 https://github.com/taosdata/DataXTDengine3.x
のソースコードを直接ダウンロードし、ローカルでコンパイルしてパッケージを生成し、 のディレクトリに置きました。jar
DataX
plugin
注:ローカル ソース コードmvn clean package -Dmaven.test.skip=true
がビルドおよび生成されたらtdengine30writer-0.0.1-SNAPSHOT.jar
、の下のディレクトリをコピーし、 に名前を変更し、それに応じて とその中のと 、の下のディレクトリを変更します。\datax\plugin\writer
tdenginewriter
tdengine30writer
plugin.json
plugin_job_template.json
libs
taos-jdbcdriver-3.0.2.jar
この時点でツールの準備は完了し、残りはデータ移行用の構成スクリプトを作成することになります。
デバイス情報シートの移行
job-water.json
: 移行構成スクリプトは 2 つの部分に分かれています。1 つはデータ ソースで、もう 1 つはターゲット ライブラリです。デバイス情報テーブルを移行するステップの結果、すべてのサブテーブル (1 つのデバイスに対して 1 つのテーブル) が作成されます。
- データソース
"name": "mysqlreader" の場合、デバイス情報テーブルを移行する際に、デバイスコードの別名を付けるtbname
と、TDengine
サブテーブルの名前として自動的に作成されます。
TDengine
注: ではテーブル名に数字を使用できないため、ここではデバイス コードの前に文字 d が追加されます。
- ターゲットライブラリ
"name": "tdengine30writer" は、column
データ ソース内のMySQL
順序と名前に対応する部分にデータ ソースでクエリされた列名をリストし、table
テーブル名にスーパー テーブルの名前を直接記述します。
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "your-password",
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://your-ip:3306/iotdata?useSSL=false&serverTimezone=Asia/Shanghai"
],
"querySql": [
"select concat('d', code) as tbname, create_time as ts, sensor_code, district_code, unit_id from b_device WHERE sensor_code=2;"
]
}
]
}
},
"writer": {
"name": "tdengine30writer",
"parameter": {
"username": "root",
"password": "taosdata",
"column": [
"tbname",
"ts",
"sensor_code",
"district_code",
"unit_id"
],
"connection": [
{
"table": [
"water"
],
"jdbcUrl": "jdbc:TAOS-RS://192.168.44.158:6041/sensor"
}
],
"batchSize": 1000,
"ignoreTagsUnmatched": true
}
}
}
],
"setting": {
"speed": {
"channel": 1
}
}
}
}
- 移行/同期スクリプトを実行する
D:\datax\bin>datax.py ../job/job-water.json
デバイスのデータシートの移行
job-water-data.json
: 移行構成スクリプトは 2 つの部分に分かれています。1 つはデータ ソースで、もう 1 つはターゲット ライブラリです。デバイス データ テーブルを移行するステップの結果、センサー データはデバイス番号に従って対応するサブテーブルに書き込まれます。
- 情報元
デバイス データ テーブルを移行するときは、センサーによって収集されたフィールドをクエリし、デバイス コードの別名も付けてtbname
、TDengine
対応するサブテーブルにデータを自動的に書き込みます。
- ターゲットライブラリ
column
データ ソース内の順序と名前に対応する、データ ソース内でクエリされた列名をパートにリストします。デバイス データ テーブルを構成するときは、テーブル名にすべてのサブテーブルの名前をMySQL
書き込むように注意する必要があります。table
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "your-password",
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://your-ip:3306/iotdata?useSSL=false&serverTimezone=Asia/Shanghai&net_write_timeout=600"
],
"querySql": [
"select concat('d', code) as tbname, create_time as ts, value as level, status from sensor_water;"
]
}
]
}
},
"writer": {
"name": "tdengine30writer",
"parameter": {
"username": "root",
"password": "taosdata",
"column": [
"tbname",
"ts",
"level",
"status"
],
"connection": [
{
"table": [
"d66057408201830",
"d66057408063030",
"d66057408027630",
"d66057408208130",
"d66057408009630",
"d66057408000530",
"d66057408067330",
"d66057408025430"
],
"jdbcUrl": "jdbc:TAOS-RS://192.168.44.158:6041/sensor"
}
],
"encoding": "UTF-8",
"batchSize": 1000,
"ignoreTagsUnmatched": true
}
}
}
],
"setting": {
"speed": {
"channel": 1
}
}
}
}
- 移行/同期スクリプトを実行する
D:\datax\bin>datax.py ../job/job-water-data.json
DataX の使用時に発生する可能性のある問題
DataX の中国語文字化け
実行後D:\datax\bin>datax.py ../job/job.json
、コンソール上の中国語出力が文字化けします。
- 解決策:
CHCP 65001
新しいウィンドウに「アクティブ コード ページ: 65001」が表示されるまで直接入力して Enter キーを押し、ジョブ コマンドを再度実行すると、中国語が正常に表示されます。
プラグインの読み込みに失敗しました。指定されたプラグインの読み込みが完了していません: [mysqlreader、tdengine20writer]
- 解決策: 使用するプラグインの名前を正しく記述する必要があります。
com.アリババ.データタックス.共通.例外。DataXException: コード:[TDengineWriter-00]、説明:[パラメータ値がありません]。- パラメーター [ユーザー名] が設定されていません。
- 解決策: TDengine2.0 と 3.0 の設定項目は異なります。これは、最初に TDengine2.0 の設定を使用して移行したためであり、パラメータは 3.0 のドキュメントに従って変更できます。
java.lang. ClassCastException: java.lang. 文字列を java.util にキャストすることはできません。リスト
- 解決策: mysql リーダーの読み取り部分の jdbcUrl と querySql の値は、
jdbc
固定テンプレートである「[]」で囲む必要があります。
com.アリババ.データタックス.共通.例外。DataXException: コード: [TDengineWriter-02]、説明: [ランタイム例外]。- [“jdbc: TAOS-RS://192.168.44.158:6041/sensor”] に適したドライバーが見つかりません
- 解決策: ライター側の「jdbcUrl」: 「jdbc: TAOS-RS://192.168.44.158:6041/sensor」、配列の代わりに文字列を使用します。
Null ポインター エラー: エラー WriterRunner - Writer Runner が例外を受け取りました:
java.lang.NullPointerException: null
at com.taosdata.jdbc.rs.RestfulDriver.connect(RestfulDriver.java:111) ~[taos-jdbcdriver-2.0.37.jar:na]
at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.8.0_311]
at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.8.0_311]
at com.alibaba.datax.plugin.writer.tdenginewriter.DefaultDataHandler.handle(DefaultDataHandler.java:75) ~[tdenginewriter-0.0.1-SNAPSHOT.jar:na]
- 解決策: taos-jdbcdriver が 2.0 jar パッケージを使用していることを確認し、DataX ソース コードをダウンロードし、tdengine30writer-0.0.1-SNAPSHOT.jar をコンパイルして生成し、tdenginewriter フォルダーを tdengine30writer にコピーし、tdengine30writer-0.0.1-SNAPSHOT.jar を tdengine30writer に配置し、tdengine30writer\ libs を削除します。その中に taos-jdbcdriver-2.0.37.jar を追加し、taos-jdbcdriver-3.0.2.jar を追加します。
com.alibaba.datax.common.Exception. DataXException: コード:[TDengineWriter-02]、説明:[実行時例外]. - TDengine エラー (2600): sql: description 66057408201830、desc: 「66057408201830」付近の構文エラー
- 解決策: テーブル名に数字を使用することはできません。数字の前に文字 d を追加しました。
com.mysql.jdbc.例外.jdbc4。CommunicationsException: 接続が失敗したときに、アプリケーションは結果をストリーミングしていました。サーバー上の「net_write_timeout」の値を増やすことを検討してください。
- 解決策:
URL
データ ソースの接続でこのパラメータを増やし、net_write_timeout/net_read_timeout
少し大きく設定します。デフォルトは 60 秒です。
例えば:jdbc:mysql://your-ip:3306/iotdata?useSSL=false&serverTimezone=Asia/Shanghai&net_write_timeout=600
MySQL
変数値を:で表示しますSHOW VARIABLES LIKE "net%"
。
小さな要約
上記はDataX
からMySQL
へのTDengine3.x
時系列データ移行の実際の記録に基づいており、DataX
ツールの助けを借りて、構成ファイル駆動のアプローチを通じて大量の時系列データの迅速な移行が完了します。
実際の移行テストの結果では、3,000 台以上の貯水池水位検知デバイス、1 億枚以上の履歴データ シート、および 5,000 万枚以上のデータ シートが半日で移行されたことが示されています。
参照
- https://github.com/taosdata/DataX
- MysqlReader プラグインのドキュメント
- DataX TDengineWriter プラグインのドキュメント
- https://developer.aliyun.com/ask/430332
- DataX に基づく TDengine 2.* バージョンのデータ移行ツール
ご質問やバグが見つかった場合は、お気軽にご連絡ください。
ご意見やご提案は大歓迎です。