SymmetricDS双向同步异常:客户端到主端正常,主端到客户端同步失败
SymmetricDS双向(Active-Active)同步问题排查:主端操作无法同步到客户端
问题场景
- 双向同步配置中,客户端服务器的增删改操作可正常同步到主端,但主端的增删改操作无法同步到客户端
- 服务器网络情况:
- 主端服务器拥有公网IP
- 客户端服务器仅拥有局域网IP
配置与操作记录
主端gt2_master.properties配置
db.connection.properties= sync.url=http\://{cloudip}\:31415/sync/gt2_master group.id=gt2 db.init.sql= db.driver=org.postgresql.Driver db.user=dbuser db.password=dbpass engine.name=gt2_master external.id=1 db.validation.query=select 1 cluster.lock.enabled=false registration.url= db.url=jdbc\:postgresql\://{cloudip}:5432/gt2?protocolVersion\ =3&stringtype\=unspecified&socketTimeout\=300&tcpKeepAlive\=true job.purge.period.time.ms=7200 job.routing.period.time.ms=1000 job.push.period.time.ms=1000 job.pull.period.time.ms=1000 auto.registration=true initial.load.create.first=true
客户端gt2_client.properties配置
db.connection.properties= sync.url=http\://192.168.100.203\:31415/sync/gt2_client group.id=gt2 db.init.sql= db.driver=org.postgresql.Driver db.user=dbuser db.password=dbpass engine.name=gt2_client external.id=2 db.validation.query=select 1 cluster.lock.enabled=false registration.url=http\://{cloudip}\:31415/sync/gt2_master db.url=jdbc\:postgresql\://192.168.100.203:5432/gt2?protocolVersion\ =3&stringtype\=unspecified&socketTimeout\=300&tcpKeepAlive\=true job.routing.period.time.ms=1000 job.push.period.time.ms=1000 job.pull.period.time.ms=1000 auto.registration=true
执行的PostgreSQL配置命令
INSERT INTO sym_node_group_link (source_node_group_id,target_node_group_id,data_event_action) VALUES ('gt2','gt2','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 ('gt2_2_gt2', 'gt2', 'gt2', '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', 'gt2_2_gt2', 1, 10, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
执行的SymmetricDS管理命令
bin/symadmin open-registration --engine gt2_master gt2 gt2_client bin/symadmin send-schema --engine gt2_master -n gt2_client
错误日志
主端服务器警告日志:
WARN [gt2_master] [PushService] [gt2_master-push-default-41] Could not communicate with gt2:2:2 at http://192.168.100.203:31415/sync/gt2_client because exception org.jumpmind.exception. IoException: java.net.SocketTimeoutException: Connect timed out
问题根源与解决方案
核心问题
主端服务器在公网环境,无法直接访问客户端的局域网IP(192.168.100.203),导致主端的Push服务无法连接到客户端的SymmetricDS节点,数据无法推送。
具体修复步骤
修正客户端的
sync.url配置
客户端的sync.url必须设置为主端能够访问的地址,可选两种方案:- 方案一:端口映射:在客户端所在局域网的路由器上,将31415端口转发到客户端的局域网IP(192.168.100.203)和31415端口,然后将客户端的
sync.url修改为:sync.url=http\://{客户端公网IP或主端公网IP(如果用主端端口转发)}\:31415/sync/gt2_client - 方案二:优先使用Pull模式:由于客户端能主动访问主端(注册时已连接主端公网IP),可以让客户端主动从主端拉取数据,替代主端推送:
- 保持客户端的
job.pull.period.time.ms=1000不变,将主端的job.push.period.time.ms调大(如3600000)或设置为-1禁用推送 - 修改节点组链接的
data_event_action为W(等待客户端拉取):UPDATE sym_node_group_link SET data_event_action = 'W' WHERE source_node_group_id='gt2' AND target_node_group_id='gt2';
- 保持客户端的
- 方案一:端口映射:在客户端所在局域网的路由器上,将31415端口转发到客户端的局域网IP(192.168.100.203)和31415端口,然后将客户端的
更新主端
sym_node表中的客户端URL
客户端注册时已将局域网URL上报给主端,需要手动更新主端数据库的sym_node表:UPDATE sym_node SET sync_url = 'http://{主端可访问的客户端地址}:31415/sync/gt2_client' WHERE external_id = '2';完成后重启主端SymmetricDS服务,或执行刷新命令:
bin/symadmin refresh-node --engine gt2_master 2验证网络连通性
在主端服务器执行以下命令,确认能访问客户端的SymmetricDS服务:telnet {客户端可访问地址} 31415 # 或使用curl测试 curl http://{客户端可访问地址}:31415/sync/gt2_client如果连接失败,检查路由器端口映射、客户端防火墙、SymmetricDS服务是否正常运行。
说明
你之前的PostgreSQL配置命令没有问题,问题完全出在网络可达性和节点URL配置上,调整后即可实现双向同步。
内容的提问来源于stack exchange,提问作者Hengky Liwandouw
相关产品推荐
相关产品推荐

