Groups 定义在NODE_GROUP表中。下面的SQL语句将分别为分销商店例子中的“corp”和“store”创建一个节点组。
insertinto SYM_NODE_GROUP (node_group_id, description) values ('store', 'A retail storenode'); insert into SYM_NODE_GROUP (node_group_id, description) values ('corp', 'A corporate node');
insertinto SYM_NODE_GROUP (node_group_id, description) values ('store', 'A retail storenode'); insert into SYM_NODE_GROUP (node_group_id, description) values ('corp', 'A corporate node');
Group links定义在 NODE_GROUP_LINK表中。Links定义了一个组中节点如何联系其他组中的节点。下面是通信的机制。
Push(P)
表明数据源节点将通过HTTP PUT请求初始化通信。
Wait for Pull(W)
表明数据源节点将等待目标节点通过HTTP GET请求联系数据源节点拉取数据。
Route-Only(R)
Route-Only表明数据传送将不会通过SymmetricDS。这个类型在使用XML发布Router或者一个审计表改变Router的时候可能会非常有用。
如果配置数据在link上被同步,Link也可以定义。例如,你可能不想让远程节点能够改变配置,印象网络中的其他节点。在这种情况下,你可以在对应的Link上设置sync_config_enabled的值为0。
一个Link可以使用同一个节点组同时作为源和目标。这样的配置将允许一个节点组与该节点组中的其他节点数据同步。
下面的SQL语句将“corp”和“store”节点组连接。“store”节点将推送它们的数据变化到“corp”节点,“corp”节点将等待“store”节点拉取该节点上的数据变化。
insert into SYM_NODE_GROUP_LINK (source_node_group, target_node_group, data_event_action) values ('store', 'corp', 'P'); insert into SYM_NODE_GROUP_LINK (source_node_group, target_node_group, data_event_action) values ('corp', 'store', 'W');
通过将数据分类到不同的Channel和不同的TRIGGER管理,用户可以获得更多数据流的控制和更多的可见性。此外,SymmetricDS也允许同步操作会被开启,挂起或者被channel重新调度。同步的频率和数据被同步的顺序也是在channel层被控制的。
下面的SQL语句为一个分销商店创建了的几个channel。一个“Item”channel处理商品和商品价格的信息的数据,“sale_transaction” Channel处理交易信息的数据。
insert into SYM_CHANNEL (channel_id, rocessing_order, max_batch_size, max_batch_to_send, extract_period_millis, batch_algorithm, enabled, description) values ('item', 10, 1000, 10, 0, 'default', 1, 'Item and pricing data'); insert into SYM_CHANNEL (channel_id, processing_order, max_batch_size, max_batch_to_send, extract_period_millis, batch_algorithm, enabled, description) values ('sale_transaction', 1, 1000, 10, 60000, 'transactional', 1, 'retail sale transactions from register');
Batch过程是Channel给将要被传输的数据分组,然后一起提交到客户端(其他的节点)。有三种不同的开箱即食(哈哈)的batch算法,可以在定义channel时通过指定batch_algorithm列的值指定想用的batch算法。
Default
在一个事务中所有的数据变化确保被batch到一起。多个事务将会被batch到一起,然后一起提交,直到没有更多的要发送的数据或者batch的大小达到设定的max_batch_size值。
Transactional
Batch将直接映射到数据库事务。如果有多个小的数据库事务,将会有很多的batch。此算法中,设定的max_batch_size的值不起任何作用。
Nontraditional
多个事务将会被batch到一起,然后一起提交,直到没有更多要发送的数据或者batch的大小达到max_batch_size设定的值。Batch将会在max_batch_size大小处被截断,不管是不是在事务的中间。
如果一个channel只包含了需要单向同步的数据库表,而且数据被路由到目标组的所有的节点,Channel上的batch将会被优化,以在所有的目的节点间共享提交的batch。在数据需要被路由到成千上万个节点时,这是一个非常重要的特性。当这个节点被检测的时候,你将会看到OUTGOING_BATCH表中的Batch的common_flag被设置为1。
Channel有几个与大小相关的属性。包括:
max_batch_size
指定此channel中的一个batch中可以处理的数据变化事件的最大值。
Max_batch_to_send
指定在两个节点的一次同步中要被发送给一个给定的channel的batch的最大值。一次同步就是一次推送数据或者一次拉取数据。例如,如果有12的batch已经准备好了要被发送给一个channel,max_batch_to_send等于10,然后只有这12个中的前10个被发送,即使这12个已经都被准备好了。
Max_data_to_route
指定一个channel一次route的数据行数的最大值。
根据你的同步需求,你可以分别指定在一个channel正在route数据的时候,是否读取和传输旧的数据(数据变化发生之前的数据),新的数据(数据变化发生之后的数据)和主键数据(就是主键)。这分别被channel表的use_old_data_to_route列,use_row_data_to_route列和use_pk_data_to_route列设置。默认情况下,它们都是1(true)。
如果一个channel上的数据包含Lob类型的数据,你可以设置channel表的contains_big_lob列为1(true),这会给SymmetricDS一个暗示,这个channel中包含Lob类型的数据。如果SymmetricDS知道DATA表中将不会包含大对象,SymmetricDS就可以利用一些数据库提供的特性们,所以,如果表中真有大对象,最好是配置上,让SymmetricDS知道。不同数据库对于一个大对象的大小的定义是不同的。