本文檔是SymmetricDS3.6.14文檔的第一章節Quick Start Guide文檔的翻譯,的目的是幫助讀者快速搭建一個SymmetricDS集羣並普及一些基本概念術語。 html
本文檔描述瞭如何在兩個SymmetricDS節點之間同步兩個相同schema的數據庫。下面的例子構建了一個分銷業務模型,有一箇中央數據庫(咱們叫它root或者corp節點)和多個零售商店的數據庫(咱們叫它client或者store節點)。對於本教程,咱們將只有一個store(商店)節點,以下圖。若是你願意,能夠再教程的結束後,本身擴展這個例子,配置第二個商店。 node
在這個例子中,咱們將安裝兩個獨立的SymmetricDS表明兩個不一樣的服務器。一個表明store服務器,一個表明corp服務器。每個SymmetricDS安裝副本將負責一個數據庫,也就是一個SymmetricDS就是一個SymmetricDS術語中的節點。一個SymmetricDS安裝副本負責一個數據庫,表明一個節點,這種配置是最經常使用的(咱們能夠選擇配置一個安裝副本負責兩個節點,這叫作multi-homing,將會在教程的最後討論)。你極可能在一個機器上運行兩個SymmetricDS副本,咱們將運行兩個SymmetricDS安裝副本在兩個不一樣的端口。咱們將使用8080運行corp服務器,9090運行store服務器,以下圖。 mysql
Corp SymmetricDS安裝副本將負責捕獲store端的item(item表和item_selling_price表)的數據變化,像itemnumber,描述和商店的價格。Store端的SymmetricDS捕獲銷售交易(sale_transaction表和sale_return_line_item表)數據的變化,好比銷售的時間和商品。價格信息只發送給與價格相關的特定的商店,從而減小發送到每一個商店的訂價信息數據的數量。舉個例子,換句話說,商店001的商品的訂價信息只會發送給商店001的數據庫,不會發送給商店002的數據庫。 sql
這個簡單的配置老是使客戶端發起與root節點的通訊,這是一種至關常見的配置。在這個配置中,client將按期的從數據庫服務器中拉數據附加到root節點上,client也會將捕獲到的變化推送到root節點。 數據庫
概述已經足夠多了,下面咱們開始,咱們將按照下面的步驟行動: 安全
1. 安裝和配置兩個SymmetricDS應用程序 服務器
2. 建立SymmetricDS配置文件和用來存儲corp數據和store數據的數據庫表。 網絡
3. 在corp數據庫中建立零售數據 架構
4. 啓動SymmetricDS服務器,而後註冊store節點到corp節點 ide
5. 發送數據的初始負載到store節點
6. 執行一個數據推送和數據拉取操做
7. 驗證發送和接收到的batch的信息
首先,咱們將安裝兩個SymmetricDS的副本,而後分別配置其與數據庫的鏈接信息:
1. 下載SymmetricDS安裝文件
2. 建立兩個文件夾表明兩個機器。一個存放Corp節點的安裝副本,另外一個存放store節點的安裝副本。例如,你能夠將這兩個文件夾命名爲sym-corp和sym-store001,下面將假設你是這樣命名的。解壓上面下載的文件到兩個文件夾中。
3. 屬性文件用來存放啓動SymmetricDS須要的最小的配置信息。複製corp樣例屬性文件到corp engine文件夾,而後複製store屬性文件到store的engine文件夾。若是你使用的是上面建議的文件夾命名,你將作下面的複製動:
samples/corp-000.properties to sym-corp/symmetric-ds-3.x.x/engines/
和
samples/store-001.properties to sym-store001/symmetric-ds-3.x.x/engines/
4. 瀏覽兩個屬性文件,查看不一樣的配置。例如,root節點給定一個值爲corp的組ID,store節點給定一個值爲store的組ID;root節點給定了一個值爲000的外部ID,store節點給定了一個值爲001的外部節點。
下面是兩個節點中engine目錄下的兩個配置文件都有的配置屬性,指定了如何鏈接特定的數據庫服務器(下面的值只是例子):
# The class name for the JDBC Driver db.driver=com.mysql.jdbc.Driver # The JDBC URL used toconnect to the database db.url=jdbc:mysql://localhost/sample # The user to login as whocan create and update tables db.user=symmetric # The password for the userto login as db.password=secret
5. 下一步,在store-001.properties文件中設置下面的屬性,指定root節點所在的位置:
# The HTTP URL of the root node to contact for registration registration.url=http://localhost:8080/sync/corp-000
6. Tip,一個engine的URL是下面這種通用的格式:
http://{hostname}:{port}/sync/{engine.name}
URL中的engine.name部分來自節點的配置文件。
Important
你必須先爲你的root節點和client節點建立數據庫。建立的數據庫的名字和上邊配置文件中配置必須一致。
首先,經過下面的步驟,在root節點的數據庫中建立例子的數據庫表,加載樣例數據,加載樣例配置:
1. 打開一個命令行提示符,而後進入到corp安裝副本的samples文件夾下
2. 在root節點中經過執行下面的命令爲item,price和sale建立樣例表:
../bin/dbimport --engine corp-000 --format XMLcreate_sample.xml
來自命令行的警告信息是安全的能夠忽略。
另外一個關於屬性文件的簡要描述。在啓動階段,SymmetricDS尋找engines文件夾中的一個或多個屬性文件。由於咱們已經在命令行中指定了一個—engine參數,因此SymmetricDS將會尋找特定命名的文件,corp-000.properties。在這個例子中,由於在engines文件夾中只有一個屬性文件,因此SymmetricDS將會默認加載這個屬性文件中的配置。所以,在這個例子中,不指定—engine參數也是能夠的。加上這個參數,運行這個例子是,能夠減小由於啓動錯了安裝副本而致使的錯誤。SymmetricDS將會抱怨丟失了你指定的屬性配置文件。
3. 下一步,在corp節點的數據庫中建立SymmetricDS特定的數據庫表。這些表將包含同步操做的配置信息。下面的命令使用自動建立的特性建立全部必要的SymmetricDS系統表:
../bin/symadmin --engine corp-000create-sym-tables
4. 最後一步,執行下面的操做,加載樣例商品與交易數據和SymmetricDS配置信息到root節點的數據庫:
../bin/dbimport --engine corp-000insert_sample.sql
Important
上面的操做,針對MySQL,須要執行insert_sample_mysql.sql文件。針對大小寫敏感的表和列的命名,MySQL用反引號代替雙引號。
咱們如今已經穿件了corp數據庫表,而後填充了咱們的SymmetricDS配置信息和樣例數據。下一步,咱們將在store節點的數據庫中建立樣例數據庫表,準備接收數據。
5. 打開一個命令提示符,進入store節點的SymmetricDS安裝副本的samples文件夾。
6. 執行下面的命令,造store節點的數據庫中建立空的樣例表:
../bin/dbimport --engine store-001 --format XMLcreate_sample.xml
來自命令行的警告信息是安全的能夠忽略。你能夠查看create_sample.xml文件來看看它都有什麼。
登錄數據庫,覈實兩個數據庫中的表:
1. 找到須要從corp節點到store節點同步的item表:item和item_selling_price。
2. 找到須要從store節點到corp節點的sale表:sale_transaction和sale_return_line_item。
3. 找到SymmetricDS的系統表,這些表都以sym_做爲前綴,像sym_channel,sym_trigger,sym_router和sym_trigger_router.
4. 驗證corp節點的item表是否有樣例數據
本教程中的數據庫創建和配置如今已經完成了。是時候開始使用SymmetricDS了。如今咱們啓動兩個SymmetricDS節點,而後觀察它們的日誌輸出。
1. 打開兩個命令行提示符,分別進入到兩個安裝副本的根目錄下的samples目錄下。
2. 在corp的samples目錄下,執行下面的命令啓動corp SymmetricDS:
../bin/sym --engine corp-000 --port 8080
在首次啓動時,corp節點將會建立樣例配置文件中全部的trigger。而後在8080端口爲corp-000 engine監聽同步和註冊請求。
3. 在store001節點的samples目錄,執行下面的命令,啓動SymmetricDS:
../bin/sym --engine store-001 --port 9090
這個命令第一次啓動store節點的服務器時,將會使用自動建立特性建立SymmetricDS的系統表。而後不斷的嘗試註冊到corp節點(經過前面配置的registration URL,能夠知道corp節點的地址)。由於註冊尚未打開,store節點將會收到認證失敗(403 HTTP響應)。咱們在下面的註冊部分討論。
當一個未註冊的節點啓動時,它將嘗試註冊到registration URL指定的節點(在幾乎全部的狀況下,就是root節點)。經過容許註冊和爲已經註冊的節點返回配置信息,Registration 節點集中的管理網絡上的其餘節點。在本教程中,Registration節點就是root節點,corp節點,這個節點同時參與與其餘節點的同步操做。
所以,下一步,咱們須要爲store節點打開註冊,以使store節點能夠接收到初始負載的數據,而後就能夠接收來自corp的數據,也能夠向corp節點發送數據。有幾種方式能夠完成這個任務。咱們將使用SymmetricDS的管理功能,在corp節點上執行一個命令(由於這個節點負責註冊管理)。
1. 前面已經啓動了corp節點和store節點的SymmetricDS應用程序,下面打開一個新的命令行提示符,進入到corp節點的安裝副本的根目錄下的samples目錄。
經過執行下面的命令打開store節點的註冊功能:
../bin/symadmin--engine corp-000 open-registration store 001
如今corp的註冊功能已經爲group爲store,external id爲001的節點打開了。Group和external id信息與store節點中的store-001.properties配置文件中的配置對應。在SymmetricDS中,每個節點都被分配到一個節點組(Node Group),而後給一個external ID表明這個應用程序。在本教程中,咱們命名錶明商店的group爲store,而後咱們使用以001開始的數字標示符做爲external ID(000表明corp節點)。關於節點組的更多的信息將在下一章節中介紹。
2. 查看store節點的日誌輸出,看是否成功註冊到corp節點。Store被配置爲以隨機的時間間隔嘗試註冊一次,最多1分鐘。一旦註冊成功,corp和store節點將開始同步。
下一步,咱們將發送一個數據的初始負載給store節點,再一次在corp節點上使用節點管理功能。
1. 打開一個命令行提示符,進入到corp安裝副本的根目錄的samples文件夾下。(注意,一般大多數系統命令在corp服務器端直接發出。例如,全部的配置文件,在corp輸入,而後同步到任意的client節點。)
2. 執行下面的命令,發送一個數據的初始負載到store節點:
../bin/symadmin --engine corp-000 reload-node 001
使用這個命令以後,corp節點排隊各個store節點拉數據請求。數據的初始負載包括=被配置了同步的每一表中的數據。
3. 觀察兩個節點的日誌輸出,查看數據傳輸。Store被配置爲每分鐘從corp節點拉一次數據。
下一步,咱們將對中央數據庫的item數據作一些修改(咱們將增長一個新的商品),而後觀察數據被拉到store節點。
1. 打開一個與Corp數據庫的交互式sql Session
2. 在store001和store002(本例中只有store001),增長一個新的商品:
insert into "item"("item_id", "name") values (110000055, 'Soft Drink'); insert into "item_selling_price"("item_id", "store_id", "price") values(110000055, '001', 0.65); insert into "item_selling_price" ("item_id","store_id", "price") values (110000055, '002', 1.00);
一旦statement被提交,數據變化將被SymmetricDS捕獲,而後排隊等store節點拉數據。
4. 觀察兩個節點的日誌輸出,查看數據傳輸狀況。Store被配置爲每分鐘從corp節點拉一次數據。
5. 在本教程中,item_selling_price被配置爲列匹配的Router,特定的訂價數據的變化將僅發送給store_id和external ID匹配的節點。在store節點的數據庫執行SQL語句,驗證是否有新的數據到達。在本例中,第一條記錄將僅僅被髮送到store 001。
如今,咱們將假冒一條交易,而後觀察SymmetricDS是怎麼把交易信息推送到中央節點的。(在這咱們能夠發現,數據的拉取和推送都是各個從節點的事,中央節點只負責管理)
1. 對store節點的數據庫打開一個SQL會話
2. 增長一個新的交易信息到store節點的數據庫。
insert into "sale_transaction"("tran_id", "store_id", "workstation","day", "seq") values (1000, '001', '3', '2007-11-01', 100); insert into "sale_return_line_item"("tran_id", "item_id", "price","quantity") values (1000, 110000055, 0.65, 1);
一旦statement被提交,數據修改將被捕獲,而後排隊等候store節點推送到中央節點。
3. 觀察兩個節點的日誌輸出,查看數據傳輸狀況。Store節點被配置爲每分鐘推送一次數據到corp節點。
前面咱們演示了已經推送和拉取了數據,下面咱們將描述你如何獲取數據的batch和發送的相關的信息。一個batch被用來追蹤和發送一個或者多個數據變化到給定的節點。數據所在的節點建立一個batch,接收數據的節點接收到數據而後作出迴應。
除此以外,在SymmetricDS中,表被分組到不一樣的數據通道,爲了容許不一樣的數據類型在部分數據類型有錯誤的狀況下也能夠同步。例如,若是將要發向給定的channel的batch發生了錯誤,這個batch將會在這個channel的每一次同步操做中進行嘗試,直到這個batch不在發生錯誤。只有在這個batch不在發生錯誤以後,發向這個channel的其他的batch纔會被髮送。使用這種方式,在數據源發生的數據變化的順序能保證以一樣的順序被髮送到目的地,而且在目的地以一樣的順序應用這些變化。可是,一個channel上沒有錯誤的batch不會被另外一個有錯誤的batch的channel阻塞。使用這種方式,一個channel上的數據變化不會被另外一個channel上的錯誤阻塞。
能夠經過下面的步驟查看發出的batch信息:
1. 打開一個與corp或者store節點的數據庫服務器鏈接的會話
2. 確認已經捕獲到的數據變化:
select * from sym_data order by data_id desc;
這個表中的每一行數據表明一行變化的數據。Data_id是順序增加的,因此最近的一個data id應該與你的數據插入SQL相關聯。Event_type是I表明insert,U表明update,D表明delete。對於插入和更新,捕獲到的數據在row_data列中,對於更新和刪除,主鍵的值在pk_data列中。
3. 使用上一步獲得的data_id,確認數據變化在某個batch中:
select * from sym_data_event where data_id = ?;
batch是基於必要的目的節點信息被建立的,稱之爲Route Job。做爲Route Job的一部分,數據變化使用使用batch_id被分配到一個batch,batch_id在追蹤和同步數據的時候會用到。Batch和數據之間的鏈接信息經過sym_data_event表被鏈接。
4. 使用上一步獲得的batch_id,去人數據變化被batch,發送到目的地並獲得響應:
select * from sym_outgoing_batch where batch_id =?;
初始的Batch,在剛建立和尚未發送到一個節點的時候,有一個NE(new)的狀態。一旦收到節點的響應,成功發送時,batch狀態將會變爲OK,發送失敗,將會變爲ER。若是這個batch失敗,這個batch的error_flag將會被設置爲1,已經失敗的batch可能在它在從新嘗試時成功,這時,這個狀態須要被改變。
理解這三個表,還有咱們在下個部分討論到的第四個表,是診斷可能遇到的同步問題的關鍵。在你使用SymmetricDS的時候,不論是在實驗環境仍是生產環境,花些時間監控這些表能夠更好的理解SymmetricDS是如何工做的。
接收數據的節點會保持本節點響應的batch信息和加載的數據相關的統計信息。重複的batch默認是忽略的,可是能夠經過修改incoming.batches.skip.duplicates 改變這個行爲。
經過下面的步驟觀察接收到的batch信息:
1. 打開一個與corp或者store節點的數據庫交互的SQL會話
2. 使用上個部分得到的batch_id,確認接收和響應的batch信息:
select * from sym_incoming_batch where batch_id =?;
一個batch表明節點加載的數據變化的集合。表中記錄了建立和發送這個batch的節點,batch的狀態成功時是OK,失敗時是ER。
咱們的快速入門指南到這就結束了。咱們已經成功的建立了兩個同步節點,而後在兩個數據庫中執行了同步操做。如今咱們退回去,討論一下在指南的第一步討論的一個問題。也就是,在指南中,讓你安裝兩個SymmetricDS副本的那一步。
在上邊的例子中,咱們在每個SymmetricDS安裝副本的engines目錄中替換了一個屬性文件。當SymmetricDS被啓動的時候,SymmetricDS被初始化,而後根據提供的配置文件建立一個SymmetricDS engine(再說一次,一個engine就是一個SymmetricDS節點,負責一個特定的數據庫)。
事實上,一個SymmetricDS應用程序能夠同時啓動多個engine。當SymmetricDS啓動時,它在engines目錄中尋找一‘.properties’結尾的文件。它將爲找到的每個配置文件啓動一個SymmetricDS engine。命令行提示符中的—engine參數會覆蓋上邊的操做,將會使SymmetricDS只啓動命令行中指定的一個engine。在一個SymmetricDS安裝副本啓動多個engine的這種狀況,叫作‘multi-homing’。
對於上邊的例子,若是咱們想改爲multi-homing的架構,只要要作下面的步驟:
1. 安裝一個SymmetricDS副本代替上邊的兩個安裝副本。不在須要一個目錄表明兩個機器。
2. 從安裝副本的samples目錄拷貝兩個配置文件到engines目錄。
3. 上邊全部運行過的命令在此安裝副本的samples目錄下在運行一遍
4. 啓動SymmetricDS時,不在須要指定特定的engine,這樣將啓動兩個engine。這個命令仍是從sampls目錄運行,以下:
../bin/sym --port 8080
注意使用上邊的命令,咱們不在使用9090端口。SymmetricDS如今在8080端口監聽corp和store engine之間的數據交換。
5. 除了啓動服務器的命令,全部其餘的命令的執行仍是須要使用—engine參數指定engine。由於要給特定的節點(engine)來處理命令,像打開註冊,發起從corp到store的初始負載等等。