【RDS】オープンソースのRDB同期ツール SymmetricDS を使ってみた

2014.07.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹です。本日はオープンソースで提供されているデータレプリケーションツール「SymmetricDS」を使ってみました。

本来であれば設定手順やコマンドを掲載した「やってみた」ブログを書くところなのですが、Getting-Startチュートリアルがとてもよく出来ているので、これを見ながら進めればレプリケーション動作は確認できると思います。

ただこのチュートリアルで実行する、初期レコード設定SQLがいろいろな設定を全部やってくれているので、いざ自分の環境で設定しようとするとどこから手をつけていいのか分からず戸惑ってしまいました。

そこで今回は、チュートリアルで実行する初期データのSQL(samples/insert_sample.sql)を追いながらユーザーガイドを読み、SymmetricDSが使う管理テーブルの役割を調べてみました。

SymmetricDSの用語

External-ID
ノードを識別するID。
チャネル
「バッチ」で一緒に同期するテーブルのグループ。
トリガー
テーブルに対する変更はデータベーストリガーで検知する。トリガーは設定情報に基いてSymmetricDSが自動作成する。
ノード
Symmetric DSを起動するコンピューターのこと。
root ノード
Symmetric DSの中央サーバーのこと。
client ノード
rootノード以外のノード。
バッチ
テーブルのレコードに変更があった場合に実行される反映ジョブの単位。この単位でデータが別のノードへ反映され、失敗した場合もこの単位でリトライが行われる。
エンジン
データベースのこと。各ノードにはそれぞれ1つ(以上)のエンジンが関連づいている。
Multi-Homing
1ノードで複数のエンジンを管理すること。

主要テーブルと役割

テーブルをリバース・エンジニアリングしてER図を作成してみました。

20140728_SymmetricDS-ER_001

なおER図作成にあたってはA5:SQL Mk-2 - フリーの汎用SQL開発ツール/ER図ツールを利用させていただきました。

それでは上図の左のエンティティから順に説明していきます。

SYM_CHANNEL

「チャネル」を管理するテーブルです。例えば商品テーブル(item)と商品売価テーブル(item_selling_price)のデータなど、テーブルをまたいだデータ反映(バッチ)を同じタイミングで行いたい、またいずれかの反映に失敗したらすべてロールバックしてもらいたい場合があります。この時は2つのテーブルを同一の「チャネル」としてグルーピングしておきます。

SYM_TRIGGER

トリガーはテーブルの変更を監視するための設定です。SymmetricDSはこのテーブルの設定に基いて実際のデータベーストリガーを作成します。またこのテーブルは監視対象テーブルと上記チャネルを紐付けてあげる役割もしています。

SYM_ROUTER/SYM_TRIGGER_ROUTER

1つ飛ばしてまずルーター(SYM_ROUTER)の説明からします。監視対象テーブルに変更があった場合にどちらの方向に更新を反映するか、を設定しているのがルーターです。例えばチュートリアルだと、本社(corp)→ 販売店(shop)に反映されるルート(corp_2_store)と、逆に販売店から本社に反映するルート(store_2_corp)が設定されています。

また本社での変更を一部の販売店のみに反映する(corp_2_one_store)というように、条件によって反映先を変更する仕組みもあるようです。

トリガー(監視対象テーブル)と反映先(ルーター)を紐付けているのが、SYM_TRIGGER_ROUTER テーブルです。

SYM_NODE_GROUP_LINK

ルーターによって情報が反映されるルートは決まりました。この情報を反映元からPushするのか、反映先からPullするかを決めるのが SYM_NODE_GROUP_LINK テーブルです。DATA_EVENT_ACTIONが "P" なら "Push"、"W" なら "Wait(Pull)" の動きをします。

SYM_NODE_GROUP

チュートリアルでは本社を"corp"グループ、全国に販売店を "shop" グループでグルーピングしています。これにより"corp"のテーブルに変更があった場合には、"shop"グループに登録された複数の販売店に一斉に変更をかけることができます。SYM_NODE_GROUP テーブルではこのグループを定義しています。

SYM_NODE

各グループに登録される実際のノードが登録されているテーブルです。初期設定時にはSymmetricDSのrootノード(本社ノード)のみレコードを追加しておく必要があります。販売店ノードはsynコマンドで起動した際にrootノードへ自らを登録しにいきますので事前登録は不要です。

なお販売店ノードが登録しにいく前に、下記管理コマンドを使ってrootノードへ販売店ノード(clientノード)の登録許可を与えておく必要があります。

$ ../bin/symadmin --engine corp-000 open-registration store 001

SymmetricDSのバージョン、エンジン(データベース)の種類やバージョンなども管理されています。これらの情報はノード登録時に自動設定されます。

SYM_NODE_HOST

各ノードのIPアドレスや、SymmetricDSが動いているJavaのバージョンなどが管理されています。ノード情報は登録時に自動設定されます。

SYM_NODE_IDENTITY

rootノードのノードExternal-IDが1レコードのみ登録されています。SymmetricDS起動前に事前登録が必要です。

まとめ

SymmetricDSを起動する前に、rootノードのデーターベースにテーブルを作成し、いくつかのテーブルには手作業でレコードを作成しておく必要があります。チュートリアルで提供されているSQLでは、これらのレコードがすべて初期設定でINSERTされます。

レコードがなくてもsynコマンドでSymmetricDSは起動するのですが、テーブルのデータを変更してもレプリケーションされません。ログにも「いくつかのテーブルで設定が不足しているよ」といったメッセージは表示されませんので注意が必要です。

なお各テーブルには外部キーが設定されているため、順序よくやらないとレコードが追加できません。ここはチュートリアル(samples/insert_sample.sql)の通り以下の順で設定してくのが良いでしょう。

  1. sym_node_group ... ノードグループ
  2. sym_node_group_link ... データ反映のPush/Pull設定
  3. sym_node ... 中央サーバーノードのみ
  4. sym_node_identity ... 中央サーバーノードのID(通常 "000")
  5. sym_channel ... チャネル
  6. sym_trigger ... トリガー
  7. sym_router ... ルーター
  8. sym_trigger_router ... トリガーとルーターを関連付け

次回はこれを踏まえてRDS間(Oracle → MySQL)のレプリケーション設定をしてみたいと思います。