首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Active-Active PostgreSQL配置与SymmetricDS

Active-Active PostgreSQL配置与SymmetricDS
EN

Stack Overflow用户
提问于 2021-07-01 15:38:19
回答 2查看 582关注 0票数 2

我在使用SymmetricDS (开源版本)在两个Postgres服务器之间复制数据时遇到了问题。以下是了解我的问题的相关信息:

我已经部署了3台Vagrant服务器:

  • symmetricds.local 192.168.44.9
  • 局部192.168.44.10
  • 局部192.168.44.11

symmetricds.local服务器中,我将SymmetricDS安装为一个服务。在我安装postgres 11的postgres##.local服务器上加载Sakila数据 (示例数据)。

然后在symmetricds.local服务器中创建以下配置文件:

代码语言:javascript
复制
cat <<EOF >>/opt/symmetric-server-3.12.10/engines/postgres01.properties
engine.name=postgres01
db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://192.168.44.10:5432/postgres?stringtype=unspecified
db.user=postgres
db.password=postgres
registration.url=
sync.url=http://192.168.44.9:31415/sync/postgres01
group.id=primary
external.id=postgres01
auto.registration=true
initial.load.create.first=true
EOF

cat <<EOF >>/opt/symmetric-server-3.12.10/engines/postgres02.properties
engine.name=postgres02
db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://192.168.44.11:5432/postgres?stringtype=unspecified
db.user=postgres
db.password=postgres
registration.url=http://192.168.44.9:31415/sync/postgres01
sync.url=http://192.168.44.9:31415/sync/postgres02
group.id=primary
external.id=postgres02
EOF

之后,我启动了SymmetricDS服务:

代码语言:javascript
复制
sudo /opt/symmetric-server-3.12.10/bin/sym_service start

此时,所有sym_表都在两个Postgres服务器中创建。

我在postgres01.local服务器中添加了一些数据,以便在两个Postgres服务器之间进行复制:

代码语言:javascript
复制
INSERT INTO sym_node_group_link (source_node_group_id,target_node_group_id,data_event_action)
VALUES ('primary','primary','P');

INSERT INTO sym_trigger (trigger_id, source_schema_name, source_table_name, channel_id, sync_on_update, sync_on_insert, sync_on_delete, sync_on_update_condition, sync_on_insert_condition, sync_on_delete_condition, last_update_time, create_time)
VALUES ('public.all', 'public', '*', 'default', 1, 1, 1, '1=1', '1=1', '1=1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

INSERT INTO sym_router (router_id,source_node_group_id,target_node_group_id,router_type,router_expression,sync_on_update,sync_on_insert,sync_on_delete,use_source_catalog_schema,create_time,last_update_by,last_update_time)
VALUES ('primary_2_primary', 'primary', 'primary', 'default', NULL, 1, 1, 1, 0, CURRENT_TIMESTAMP, 'console', CURRENT_TIMESTAMP);

INSERT INTO sym_trigger_router (trigger_id, router_id, enabled, initial_load_order, create_time, last_update_time)
VALUES ('public.all', 'primary_2_primary', 1, 10, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

最后,我在symmetricds.local服务器上运行它以允许注册:

代码语言:javascript
复制
sudo /opt/symmetric-server-3.12.10/bin/symadmin -e postgres01 open-registration primary postgres02

几分钟后,将创建触发器,并在sym_表之间共享数据。但是用户数据(Sakila表)没有被复制。

我试图使用以下内容强制重新加载表:

代码语言:javascript
复制
INSERT INTO sym_table_reload_request (source_node_id, target_node_id, trigger_id, router_id, create_time, last_update_time) VALUES ('postgres01', 'postgres02', 'ALL', 'ALL', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

但是,我在SymmetricDS日志中得到了这个错误:

代码语言:javascript
复制
2021-07-01 15:03:19,097 ERROR [postgres01] [InitialLoadService] [postgres01-job-11] Error while queuing initial loads StackTraceKey.init [SymmetricException:46596748] org.jumpmind.symmetric.SymmetricException: Unable to issue an update for sym_node_security.  Check the sym_trigger_hist for sym_node_security.
    at org.jumpmind.symmetric.service.impl.DataService.insertNodeSecurityUpdate(DataService.java:2230)
    at org.jumpmind.symmetric.service.impl.DataService.insertSqlEventsPriorToReload(DataService.java:1227)
    at org.jumpmind.symmetric.service.impl.DataService.insertReloadEvents(DataService.java:1006)
    at org.jumpmind.symmetric.service.impl.InitialLoadService.processTableRequestLoads(InitialLoadService.java:282)
    at org.jumpmind.symmetric.service.impl.InitialLoadService.queueLoads(InitialLoadService.java:98)
    at org.jumpmind.symmetric.job.InitialLoadJob.doJob(InitialLoadJob.java:43)
    at org.jumpmind.symmetric.job.AbstractJob.invoke(AbstractJob.java:227)
    at org.jumpmind.symmetric.job.AbstractJob.run(AbstractJob.java:298)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)

2021-07-01 15:03:29,118 INFO [postgres01] [InitialLoadService] [postgres01-job-14] Found 1 table reload requests to process.
2021-07-01 15:03:29,131 INFO [postgres01] [InitialLoadService] [postgres01-job-14] Cancelling load 2 for node postgres02
2021-07-01 15:03:29,134 INFO [postgres01] [InitialLoadService] [postgres01-job-14] Marked 1 load requests as OK for node postgres02
2021-07-01 15:03:29,136 INFO [postgres01] [InitialLoadService] [postgres01-job-14] Marked 0 extract requests as OK for node postgres02
2021-07-01 15:03:29,137 INFO [postgres01] [InitialLoadService] [postgres01-job-14] Marked 0 batches as OK for node postgres02
2021-07-01 15:03:29,147 INFO [postgres01] [DataService] [postgres01-job-14] Queueing up an initial load to node postgres02
2021-07-01 15:03:29,175 ERROR [postgres01] [InitialLoadService] [postgres01-job-14] Error while queuing initial loads StackTraceKey [SymmetricException:46596748]

但是,没有任何东西被复制,sym_trigger_hist表在postgres01上是空的,但是postgres02上的所有表都是空的。

云你能帮我理解配置的问题吗?

EN

回答 2

Stack Overflow用户

发布于 2021-07-07 17:24:45

您应该在symadmin sync-triggers上运行postgres01命令来构建触发器。检查日志,看看是否有任何错误。如果触发器已成功创建,则应在sym_trigger_hist表中填充postgres01。

要执行以生成触发器的命令是:

代码语言:javascript
复制
symadmin sync-triggers -e postgres01
票数 4
EN

Stack Overflow用户

发布于 2021-07-07 17:39:54

“同步触发器”进程应该在注册后立即自动运行,并在sym_trigger_hist中为复制的每个SYM表放置一个条目。这些条目是像初始加载这样的操作所需要的。如果sym_trigger_hist是空的,那么运行“同步触发器”就出了问题。如果成功,日志记录将如下所示:

代码语言:javascript
复制
2021-07-07 13:21:42,799 INFO [postgres01] [RegistrationService] [qtp2060037930-34] Completed registration of node primary:postgres02
2021-07-07 13:21:46,598 INFO [postgres02] [TriggerRouterService] [postgres02-job-2] Synchronizing triggers
2021-07-07 13:21:48,668 INFO [postgres02] [PostgreSqlSymmetricDialect] [postgres02-sync-triggers-1] Creating SYM_ON_I_FOR_SYM_ND_SCRTY_CLNT trigger for SYM_NODE_SECURITY
2021-07-07 13:21:48,679 INFO [postgres02] [PostgreSqlSymmetricDialect] [postgres02-sync-triggers-1] Creating SYM_ON_U_FOR_SYM_ND_SCRTY_CLNT trigger for SYM_NODE_SECURITY
2021-07-07 13:21:48,690 INFO [postgres02] [PostgreSqlSymmetricDialect] [postgres02-sync-triggers-1] Creating SYM_ON_D_FOR_SYM_ND_SCRTY_CLNT trigger for SYM_NODE_SECURITY
...
2021-07-07 13:21:48,701 INFO [postgres02] [TriggerRouterService] [postgres02-job-2] Done synchronizing triggers
2021-07-07 13:21:49,439 INFO [postgres02] [RegistrationService] [postgres02-job-2] Successfully registered node [id=postgres02]

您应该能够回到日志中,看看它在注册过程中遇到了什么错误。您可以通过重新启动SymmetricDS来修复它,这将导致它再次运行“同步触发器”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68213144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档