pgunconf / 多機能データ同期ツール symmetricds を使ってみよう

21
マイグレーションの切り札、 多機能データ同期ツール SymmetricDS を使ってみましょう 2015-05-30 JPUG PostgreSQL Unconference 高塚 遙 [email protected]

Upload: haruka-takatsuka

Post on 10-Aug-2015

333 views

Category:

Software


2 download

TRANSCRIPT

Page 1: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

マイグレーションの切り札、多機能データ同期ツール

SymmetricDS を使ってみましょう

2015-05-30JPUG PostgreSQL Unconference

高塚 遙 [email protected]

Page 2: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

他DBMSからPostgreSQLにマイグレーションしていますか?

並行稼働したいんだよね。何か不安だし。 現システムはマ

テビューで連携しまくりですが

こういう要件に、皆様どうしていますか?

Page 3: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

TOC

● SymmetricDS とは● アーキテクチャ● 基本的な使い方● 機能あれこれ● 実際の適用時の課題

Page 4: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

SymmetricDSとは?

● open-source,● database independent,● data synchronization software● written in Java with Spring

Postgresinstance

SymmetricDS

SymmetricDS

Ora.instance

MariaDBinstance

HTTPJDBCJDBC

JDBC

SymmetricDS

HTTP

Ora.instance JDBC

since 2007

Page 5: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

SymmetricDSとは (2)

● ほとんどの RDB に対応– トリガとJDBCがあれば

– mongoDB 連携– ファイル/

フォルダ同期

PostgreSQL / Greenplum / RedshiftSql Server / Sql Server AzureHSQLDB / H2 / Apache DerbyIBM DB2 / Interbase / InformixOracle database / MySQL / MariaDBFirebird / SQLiteSybase Adaptive Server EnterpriseSybase SQL Anywhere

Page 6: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

SymmetricDSとは (3)

● 遅延型(非同期型)のロジカルレプリケータ● 任意テーブル間のデータ同期を実現

– 双方向データ同期が可能– カスケード構成が可能– N対1で行のマージ/パーティションが可能

● やりたければ N対Mでも

– トランザクション単位でのデータ同期● nontransactional も指定可能

Page 7: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

アーキテクチャ (1)

(図は SymmetricDS User Guide より)

Page 8: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

アーキテクチャ (2)

ユーザテーブル(元テーブル)

管理テーブルSYM_DATA

トリガ

更新内容を記録

アプリがデータ更新

SymmetricDS

管理テーブルSYM_OUTGOING_BATCH 他

バッチジョブを編成

管理テーブルSYM_INCOMING_BATCH 他

一時ファイル

バッチジョブを転送

ユーザテーブル(宛先テーブル)

バッチジョブを適用

SymmetricDS

Page 9: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

基本的な使い方 (1)

● セットアップ手順– ノード毎にSymmetricDS用のユーザ/スキーマを用意

● 大まかには1ノードが1データベースと理解すれば良い

– インストール● unzip して置くだけ / Java 6 以上● ノード毎の接続設定ファイルを記述(engineファイル)

– ノード初期化● 最初のノードだけコマンド実行、SQL実行の手順がある● 2つ目ノード以降は自動で登録できる

Page 10: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

基本的な使い方(2)

● 設定用管理テーブルの行で同期定義を記述する主な設定用管理テーブル 役割SYM_NODE ノードを定義SYM_NODE_GROUP ノードグループを定義SYM_NODE_GROUP_LINK グループ間の伝送方式を定義SYM_CHANNEL 同期のデータ転送を定義SYM_ROUTER 同期を定義(宛先とノード)SYM_TRIGGER 同期を定義(同期元)SYM_TRIGGER_ROUTER 上記2テーブルの組み合わせ

これらも自動で同期されるのでどれかのノードに設定すれば良い

Page 11: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

基本的な使い方 (3)

● とりあえず簡単に設定するなら– SYM_CHANNEL は出来合いの 'default' チャンネル– SYM_ROUTER もノード間で一つだけ、

「元テーブルと同じテーブル名が宛先」のルータを定義● SYM_ROUTER には、どのノードグループからどのノードグ

ループであるか、と宛先スキーマ/テーブルを記述する

– 一つのテーブル間レプリケーションにつき、 SYM_TRIGGER と SYM_TRIGGER_ROUTER だけ記述

Page 12: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

基本的な使い方 (4)

INSERT INTO sym_trigger (trigger_id, source_schema_name, source_table_name, channel_id, last_update_time, create_time)VALUES ('trg_foo', 'APP', 'FOO_TBL', 'default', current_timestamp, current_timestamp);

INSERT INTO sym_trigger_router (trigger_id, router_id, create_time, last_update_time)VALUES ('trg_foo', 'rt_ora2pg', current_timestamp, current_timestamp);

APP.FOO_TBL の同期を設定する2行

Page 13: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

機能あれこれ (1)

両方向同期/カスケード同期● 両方向

– 単に両方向に同期を定義すれば良い

– 一貫性の保証は何も無し– 適用時にエラーになる

バッチは手動対応● カスケード

– 到着バッチからトリガ駆動する設定を与える

ノード1

ノード2

tbl1

tbl1

ノード3

tbl2

tbl2

tbl2

Page 14: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

機能あれこれ (2)

マージ・パーティション同期● 値によって同期先を動的に決めることができる

支店2ノード

社員テーブル

伝票ID 支店ID 明細

102 2 .....

支店1ノード

社員テーブル

伝票ID 支店ID 明細101 1 .....

103 1 .....

本社ノード

社員テーブル

伝票ID 支店ID 明細101 1 .....

102 2 .....

103 1 .....支店ノードグループ

本社ノードグループ

Page 15: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

機能あれこれ (3)

データ変形● 一部カラムを除外して同期● データを加工して同期

– 単純な処理(式計算、文字列を一定長切り捨てなど)– マップ定義に基づく置換– 別表を引いた結果で置換– bean shell

– Java Class による拡張

Page 16: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

実際の利用時の課題 (1)

転送速度● やっぱりロジカルレプリケーションは遅い● 細かいトランザクションが大量発生すると各々が

バッチジョブになる → 転送オーバーヘッド増– 複数トランザクションを集約する設定が可能

● 発生源は 10,000 TPS → 宛先では 100TPS

● テーブルの初期ロードも遅い– いくつかのDBMSむけに bulk_loader 機能あり

● Oracle database、MySQL、PostgreSQL、MS SQL Server

Page 17: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

実際の利用時の課題 (2)

マテビューDBLink との違い● 選択条件や値の加工、結合を伴うマテビューは、

簡単にはエミュレートできない– あくまでもテーブル単位の同期なので– 選択条件も条件カラム値が UPDATE されると面倒

● 結合の実現は難しい– 登場テーブルを同期して宛先側でマテビュー作る

● 選択条件や値の加工は bean shell 変形で対応

Page 18: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

実際の利用時の課題 (3)

null pointer exception とか● 実装におけるエラー処理が雑

– OSS版 3.6系での話であって、3.7系や PRO版では改善されているかも

– ArrayIndexOutOfBoundsException や NullPointerException が出ても、まずは、設定の間違いを疑うべし(本来、ここそこが間違っています、と実装すべきだという意味ではバグだ)。

Page 19: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

実際の利用時の課題 (4)

メモリ不足エラー● Javaサーバアプリなので、Javaサーブレットコン

テナのチューニングの技法が使える– JVMパラメータなど

● 「大きなバッチジョブ」が原因がポピュラー– 一つのジョブサイズを抑える設定– エラーになる大きいジョブサイズに合わせてメモリ設定– メモリ不足エラーは「一過性の状態が原因」と判断され

て繰り返される ~ ちょっと煩い

Page 20: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

実際の利用時の課題 (5)

DBMSごとの違い● データの問題

– 単純にJDBC基準でデータ読み書きするだけ– VARCHAR(10) vs マルチバイト文字 など– timestampなど、型の小数点以下精度

● オブジェクト名の問題– デフォルトが大文字か小文字か?

● トリガプロシージャの違い– 「この条件設定はどの DB で動くか」を意識

UPDATE sym_trigger SET sync_on_insert_condition = ' :NEW.id > 100 ' ...

Page 21: pgunconf / 多機能データ同期ツール SymmetricDS を使ってみよう

ご清聴ありがとうございました

Sourceforge のレビューが面白い。Lowest Ratedの感想も分からないでもない。