0

我正在开发一个部署为两个独立站点的 ASP.NET Web 应用程序。每个站点都由它自己的相同(相同模式)ORACLE 数据库 (10g) 的实例支持,但每个数据库都包含“单独的”数据。一个站点仅包含“安全数据”,而另一个站点仅包含“开放数据”。只有少数用户可以看到安全站点和安全数据,而大多数公司都可以使用开放站点。

安全站点用户现在希望能够查看来自安全站点的安全数据和开放数据。此外,他们希望能够修改开放数据,并且从安全站点对开放数据的更改需要传播到开放站点,并且需要相应地处理冲突。

我希望有一个仅数据库的解决方案,因为我们有与存储过程相关的报告,现在需要为安全用户显示安全和开放的数据。

我们可以假设数据被相应地标记为安全 (Y/N)。

我们目前的道路似乎不太理想。它涉及修改安全数据库以包含指向开放数据库的数据库链接。我们还向安全数据库添加了额外的视图,以通过数据库链接“联合”安全和开放数据。同时,我们正在对安全站点上的原始存储过程进行大修以处理 CRUD 操作,例如

if (someRecord.IsSecure = 'Y')
update secure data;
else
update open data;

在我们继续进行之前,我想联系一下,看看是否有更好的方法来解决这个问题,比如通过复制。

我一直在研究多主复制。这似乎是正确的道路吗?有没有人遇到过这种情况?

4

1 回答 1

1

在我正在进行的项目中,我们使用Oracle Streams支持多主复制(我们在全球纽约、伦敦和新加坡运营 3 个站点,都需要能够读取和更新相同的数据)。

Streams 支持我们根据监管要求使用的条件复制(例如,在新加坡,私人银行客户数据不能离开该国)。

例如,使用 Streams,您可以复制整个架构(DML 和/或 DDL)或仅复制表列表。在事务中,您可以控制流,以便复制对象上的各个行操作不会复制..例如:

if (is_secure)
then
  dbms_streams.set_tag('01'); -- set a non null tag to prevent replication.
end if;

insert into your_table ()..values ();

if (is_secure)
then
  dbms_streams.set_tag(''); -- set a the null tag back 
end if;

insert into your_table ()..values ();

对于is_secure为真的场景,只有第二条规则会复制(如果存在非空流标签,您可以将复制规则设置为不复制)。因此,如果数据安全,您只需在您的代码中设置此标签。这样流就不会将此事务应用于远程站点。

对于多主复制,您应该预先考虑“冲突”的可能性,即两个以上站点并行修改相同数据的情况。您应该处理此问题(您可以为复杂场景设置应用处理程序)以解决冲突而不会导致应用错误。例如,对于复制对象,这将是一个糟糕的设计:

create table foo
(
  id number primary key,
  data
);
create sequence foo_seq start with 1 increment by 1;

如果这是在两个站点上创建的,并且有人在站点 1 上并行发布:

insert into foo (id, data) values (foo_seq.nextval, 'a');

和站点 2:

insert into foo (id, data) values (foo_seq.nextval, 'b');

两个站点都尝试将“1”插入主键。这将在复制时失败,您最终会遇到应用错误来解决。

您可以在每个 env 上设置不同的序列,例如start with 100 increment by 100在一个 env 和start with 101 increment by 100另一个 ext 上,这将消除此问题,或/并为每个站点添加一个location_id设置为1or等​​的列。2

此外,通过更新,您需要处理两个以上站点同时更新同一行(因为站点之间总是存在一些延迟......延迟越多,进入需要冲突处理的场景的变化就越多)。

Streams 的设置和理解有点复杂,因此您需要仔细阅读该主题。它非常成熟并且仍然受支持,但在增强方面,从现在开始它不会得到太多,因为 Oracle 专注于 Goldengate(GG 是许可产品,因此会产生额外成本,而 Streams 是企业许可的一部分)。

于 2013-03-13T17:22:17.607 回答