異質資料庫同步:SymmetricDS

    • 下載套件:SymmetricDS
    • 技術文件:使用手冊
    • 安裝:
      • 解壓縮至【SymmetricDS 目錄】如:"D:\Java\Symmetric-DS-2.0.6"
      • 假設:
        • 欲同步之資料庫為 【mySQL】
        • 欲同步之資料庫 Schema 為 【emprogria】
        • 欲同步之資料表格為 【item】,來源資料庫 → 目的資料庫
        • 來源資料庫服務器為【apollo-desktop】
        • 目的資料庫服務器為【apollo-cluster】
        • 資料庫同步服務器為【本機-apollo】,由獨立服務器執行資料庫同步
      • 在【SymmetricDS 目錄】下,建立【同步設定目錄】如:"D:\Java\Symmetric-DS-2.0.6\emprogria"
      • 複製【SymmetricDS 目錄】下,*.properties 檔案至【同步設定目錄】
    • 測試程式工具:jython
    • 設定:
      • 修改 root.properties 如下:
        • db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://apollo-desktop/emprogria db.user=【資料庫帳號】 db.password=【資料庫密碼】 sync.url=http://apollo:38080/sync group.id=sunexternal.id=00000 job.purge.period.time.ms=7200000
      • 修改 client.properties 如下:
        • db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://apollo-cluster/emprogria db.user=【資料庫帳號】 db.password=【資料庫密碼】 registration.url=http://apollo:38080/sync group.id=earth external.id=1 job.routing.period.time.ms=2000 job.push.period.time.ms=5000 job.pull.period.time.ms=5000 job.purge.period.time.ms=7200000
      • 撰寫命令稿如下:
        • 建立同步資料表格【create_emprogria.xml】:
          • <?xml version="1.0"?> <!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database.dtd"> <database name="emprogria"> <table name="item"> <column name="item_id" type="INTEGER" required="true" primaryKey="true" /> <column name="price_id" type="INTEGER" required="true" /> <column name="name" type="VARCHAR" size="100" /> </table> </database>
        • 設定單向同步機制資料【create_nodes_emprogria.sql 】:
          • -- 設定同步節點:來源=sun/目的=earth insert into sym_node_group (node_group_id, description) values ('sun', 'Headquarters:Sun'); insert into sym_node_group (node_group_id, description) values ('earth', 'Branch:Earth'); insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action) values ('earth', 'sun', 'P'); insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action) values ('sun', 'earth', 'W'); insert into sym_node (node_id, node_group_id, external_id, sync_enabled) values ('00000', 'sun', '00000', 1); insert into sym_node_identity values ('00000'); -- Channels insert into sym_channel (channel_id, processing_order, max_batch_size, enabled, description) values('sunshine', 1, 100000, 1, 'Headquarters:Sun => Branch:Earth'); -- Routers insert into sym_router (router_id,source_node_group_id,target_node_group_id,create_time,last_update_time) values('sunshine_identity', 'sun', 'earth', current_timestamp, current_timestamp);
        • 設定同步機制【insert_emprogria.sql】:
          • -- Sample Data insert into item (item_id, price_id, name) values (11000001, 1, 'Yummy Gum'); -- Triggers insert into sym_trigger (trigger_id,source_table_name,channel_id,last_update_time,create_time) values('item','item','sunshine',current_timestamp,current_timestamp); -- Example of a "dead" trigger, which is used to only sync the table during initial load insert into sym_trigger (trigger_id,source_table_name,channel_id, sync_on_insert, sync_on_update, sync_on_delete, last_update_time,create_time) values('item_dead','item','sunshine',0,0,0,current_timestamp,current_timestamp); -- Trigger Router Links insert into sym_trigger_router (trigger_id,router_id,initial_load_order,last_update_time,create_time) values('item','sunshine_identity', 200, current_timestamp, current_timestamp); -- Example of a "dead" trigger, which is used to only sync the table during initial load insert into sym_trigger_router (trigger_id,router_id,initial_load_order,last_update_time,create_time) values('item_dead','sun_identity', 300, current_timestamp, current_timestamp);
        • 設定來源資料庫同步機制【root_init.bat】:
          • SET SYMMETRIC_DS_PATH=D:\Java\Symmetric-DS-2.0.6 SET CONFIG_PATH=%SYMMETRIC_DS_PATH%\emprogria CALL %SYMMETRIC_DS_PATH%\bin\sym -p root.properties --run-ddl create_emprogria.xml -v CALL %SYMMETRIC_DS_PATH%\bin\sym -p root.properties --auto-create -v CALL %SYMMETRIC_DS_PATH%\bin\sym -p root.properties --run-sql create_nodes_emprogria.sql -v CALL %SYMMETRIC_DS_PATH%\bin\sym -p root.properties --run-sql insert_emprogria.sql -v
        • 設定目的資料庫同步機制【client_init.bat】:
          • SET SYMMETRIC_DS_PATH=D:\Java\Symmetric-DS-2.0.6 SET CONFIG_PATH=%SYMMETRIC_DS_PATH%\emprogria CALL %SYMMETRIC_DS_PATH%\bin\sym -p client.properties --run-ddl create_emprogria.xml -v
        • 首次資料同步【root_init_load.bat】:
          • SET SYMMETRIC_DS_PATH=D:\Java\Symmetric-DS-2.0.6 SET CONFIG_PATH=%SYMMETRIC_DS_PATH%\emprogria CALL %SYMMETRIC_DS_PATH%\bin\sym -p %CONFIG_PATH%\root.properties -v --reload-node 1
        • 登錄欲同步節點【root_register.bat】:
          • SET SYMMETRIC_DS_PATH=D:\Java\Symmetric-DS-2.0.6 SET CONFIG_PATH=%SYMMETRIC_DS_PATH%\emprogria CALL %SYMMETRIC_DS_PATH%\bin\sym -p %CONFIG_PATH%\root.properties --open-registration "earth,1" -v
        • 啟動來源同步服務【start_root.bat】:
          • SET SYMMETRIC_DS_PATH=D:\Java\Symmetric-DS-2.0.6 SET CONFIG_PATH=%SYMMETRIC_DS_PATH%\emprogria CALL %SYMMETRIC_DS_PATH%\bin\sym -p %CONFIG_PATH%\root.properties --port 38080 --server -v
        • 啟動目的同步服務【start_client.bat】:
          • SET SYMMETRIC_DS_PATH=D:\Java\Symmetric-DS-2.0.6 SET CONFIG_PATH=%SYMMETRIC_DS_PATH%\emprogria CALL %SYMMETRIC_DS_PATH%\bin\sym -p %CONFIG_PATH%\client.properties --port 38090 --server -v
      • 執行設定順序:
        • 設定目的資料庫同步機制【client_init.bat】
        • 設定來源資料庫同步機制【root_init.bat】
        • 啟動來源同步服務【start_root.bat】
        • 啟動目的同步服務【start_client.bat】
        • 首次資料同步【root_init_load.bat】
    • 測試:
      • 撰寫 jython 資料庫設定檔【dbexts.ini】如下:
        • [default] name=apollo [jdbc] name=apollo url=jdbc:mysql://apollo-desktop/emprogria user=【資料庫帳號】 pwd=【資料庫密碼】 driver=com.mysql.jdbc.Driver [jdbc] name=apollo_cluster url=jdbc:mysql://apollo-cluster/emprogria user=【資料庫帳號】 pwd=【資料庫密碼】 driver=com.mysql.jdbc.Driver
      • 撰寫測試命令稿【emprogria_check_data.py】如下:
        • import time from dbexts import dbexts class emprogria: confifFile = "dbexts.ini" def __init__(self, confifFile): self.confifFile = confifFile def root_task(self, connName): print "-- root --" root_jdbc = dbexts(connName, self.confifFile) root_jdbc.isql("SELECT * FROM emprogria.item ORDER BY item_id") root_jdbc.isql("UPDATE emprogria.item SET name='" + time.strftime("%Y%m%d%H%M%S") + "' WHERE item_id=104") # root_jdbc.isql("DELETE FROM emprogria.item WHERE item_id=104") # root_jdbc.isql("INSERT INTO emprogria.item (item_id,price_id,name) VALUES (104,1,'" + time.strftime("%Y%m%d%H%M%S") + "')") def client_task(self, connName): print "-- client --" client_jdbc = dbexts(connName, self.confifFile) client_jdbc.isql("SELECT * FROM emprogria.item ORDER BY item_id") if __name__ == "__main__": myObject = emprogria("dbexts.ini") myObject.root_task("apollo_laptop") time.sleep(10) myObject.client_task("apollo_cluster")
      • 執行測試:
        • jython emprogria_check_data.py