SymmetricDS文档翻译--【Chapter3.详细配置(Configuration)[sectionC]】(一)

2015-02-03 10:06:06 · 作者: · 浏览: 31

3.6. Routers

目前的实现中提供的Route实现包含:

1. Default Router:这个Router发送所有的数据到Router中定义的目标节点所属的组中的所有的节点。
2. Column Match Router:这个Router可以将一个列的旧值(数据源表中此列的值)或者新值(将要在目标节点设置的值)与一个常量值或者节点的external_id和node_id的值比较。
3. Lookup Router:这个Router可以被配置,在路由数据时,基于已经存在的表或者从属表,确定是否执行路由操作。
4. Subselect Router:这个Router对数据库执行一个SQL表达式来选择要路由到的节点。这个SQL表达式可以被传入某个列的旧值(数据变化之前的值)或者新值(数据变化之后的值)。
5. Scripted Router:这个Router执行一个Bean脚本表达式以选出要路由到的节点。这个脚本可以使用某个列的旧值或者新值。
6. XML Publishing Router:这个Router直接发布数据的变化到一个消息解决方案,而不是传送这些变化给一个已经注册的节点。这个Router必须被手工配置为以XML格式作为扩展点。(可以跟kafka结合,然后数据就可以进入hadoop生态系统了)
7. Audit Table Router:这个Router将数据插入到一个自动创建的审计表中。这个Router记录捕获到的数据变化到与其关联的表中。

Trigger和Router是多对多的关系。这意味着,一个触发器可以捕获数据变化然后路由这些变化到多个位置。也意味着一个Router可以与过个不同的触发器相联系。

3.6.1. Default Router

最简单的Router,这是一个发送所有相关的触发器捕获到的数据到所有router中定义的目标节点所属的组中所有节点的Router。一个Router以ROUTER表中的一行数据代表。然后连接到TRIGGER_ROUTER表。

下面这个SQL语句定义了一个Router,这个Router将从“corp”组发送数据到“store“组。

insert into SYM_ROUTER (router_id,
               source_node_group_id, target_node_group_id, create_time,
               last_update_time) values ('corp-2-store','corp', 'store',
               current_timestamp, current_timestamp); 

下面的SQL语句建立上边的Router与item触发器的映射。

insert into SYM_TRIGGER_ROUTER
               (trigger_id, router_id, initial_load_order, create_time,
               last_update_time) values ('item', 'corp-2-store', 1, current_timestamp,
               current_timestamp); 

3.6.2. Column Match Router

有时可能会有这样的需求,数据需要根据数据的当前值(数据变化发生之后)或者某个列的先前的值(数据变化发生之前)来决定是否需要被路由。在插入ROUTER系统表时设置router_type为column可以配置一个Column Router,然后在设置router_expression列为一个等式,这个等式代表了某个列的期望值。

表达式的第一部分总是一个列名。这个列名应该总是用大写字母定义。大写的列名以OLD_作为前缀可以用来比较这个列的旧值。表达式的第二个部分可以使一个常量,一个可以代表另一个列的符号或者可以代表其他的SymmetricDS概念的符号。符号的值总是以冒号(:)开始。

当一个表的状态列被设置为“READY TO SEND”的时候,数据变化才被路由到目标节点组的所有节点。下面的SQL语句将在ROUTER表中插入一个column router来完成这个需求。

insert into SYM_ROUTER (router_id,
               source_node_group_id, target_node_group_id,router_type,
               router_expression,create_time, last_update_time) values
               ('corp-2-store-ok','corp','store', 'column', 'STATUS=READY TO SEND',
               current_timestamp,current_timestamp);

当一个表的状态列的值被修改时,变化的数据才被路由到目标组的所有节点。下面的SQL语句将在ROUTER表中插入一个column router来完成这个需求。注意OLD_STATUS的使用,OLD_前缀可以访问这个列的旧值。

insert into SYM_ROUTER (router_id,
               source_node_group_id,target_node_group_id, router_type,
               router_expression,create_time, last_update_time) values
               ('corp-2-store-status','corp','store', 'column', 'STATUS!=:OLD_STATUS',
               current_timestamp,current_timestamp);

一个表的数据变化发送到目标节点组中一个节点的external id与此表的STORE_ID列的值匹配的节点。下面的SQL语句将插入ROUTER表中一个column router来实现这个需求。

insert into SYM_ROUTER (router_id,
               source_node_group_id,target_node_group_id, router_type,
               router_expression,create_time, last_update_time) values
               ('corp-2-store-id','corp','store', 'column', 'STORE_ID=:EXTERNAL_ID',
               current_timestamp,current_timestamp);

一个节点的下面3个属性可以被引用:

1. :NODE_ID

2. :EXTERNAL_ID

3. :NODE_GROUP_ID

在route过程中,总是可以捕获EXTERNAL_DATA的值作为一个虚拟列。

一个表的数据变化需要被路由到一个重定向节点,这个节点的external id在REGISTRATION_REDIRECT表中定义。下面的SQL语句将在ROUTER表中插入一个column router来实现这个需求。

insert into SYM_ROUTER (router_id,
               source_node_group_id,target_node_group_id, router_type,
               router_expression, create_time,last_update_time) values
               ('corp-2-store-redir