SymmetricDS双向同步异常:仅Slave到Master单向生效求助
PostgreSQL双向SymmetricDS同步配置缺失问题解决
问题背景
尝试在两个PostgreSQL数据库间搭建SymmetricDS双向同步,目前仅实现Slave到Master的单向同步,Master端变更无法同步到Slave。现有配置如下:
Master引擎配置
sync.url=http\://192.168.1.199\:31415/sync/symmetricdsmwdb0 registration.url=http\://192.168.1.199\:31415/sync/symmetricdsmwdb0 group.id=primary db.init.sql= db.driver=org.postgresql.Driver db.user=user db.password=password db.url=jdbc\:postgresql\://mw-db\:5432/mw?protocolVersion\=3&stringtype\=unspecified&socketTimeout\=300&tcpKeepAlive\=true engine.name=symmetricdsmwdb0 external.id=symmetricdsmwdb0 db.validation.query=select 1 cluster.lock.enabled=false auto.registration=true auto.reload=true
Slave引擎配置
sync.url=http\://192.168.1.84\:31415/sync/symmetricdsmwdb1 group.id=primary db.init.sql= registration.url=http\://192.168.1.199\:31415/sync/symmetricdsmwdb0 db.driver=org.postgresql.Driver db.user=user db.password=password db.url=jdbc\:postgresql\://mw-db\:5432/mw?protocolVersion\=3&stringtype\=unspecified&socketTimeout\=300&tcpKeepAlive\=true engine.name=symmetricdsmwdb1 external.id=symmetricdsmwdb1 db.validation.query=select 1 cluster.lock.enabled=false
现有触发器与路由配置
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, sync_on_incoming_batch) VALUES ('public.tables', 'public', '*', 'default', 1, 1, 1, '1=1', '1=1', '1=1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1); INSERT INTO sym_trigger_router (trigger_id, router_id, enabled, initial_load_order, create_time, last_update_time) VALUES ('public.tables', 'primary to primary', 1, 10, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
缺失配置与修复步骤
1. 补全双向路由规则定义
当前仅关联了触发器和路由,但缺少核心的双向路由规则配置。需要在sym_router表中添加允许primary组内节点互相同步的规则:
INSERT INTO sym_router (router_id, source_node_group_id, target_node_group_id, router_type, create_time, last_update_time) VALUES ('primary to primary', 'primary', 'primary', 'default', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
这条配置是双向同步的基础,允许同一组内的节点互相传递变更数据。
2. 确保Master节点的触发器生效
- 检查Master节点的触发器状态,确认已激活:
SELECT trigger_id, source_table_name, is_active FROM sym_trigger WHERE source_schema_name = 'public'; - 若触发器未激活,手动在Master节点执行触发器生成命令:
symadmin --engine symmetricdsmwdb0 create-triggers
3. 配置双向节点组链路
需要在sym_node_group_link表中添加双向的拉取/推送策略,确保节点间可以互相同步:
INSERT INTO sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action, create_time, last_update_time) VALUES ('primary', 'primary', 'P', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), ('primary', 'primary', 'W', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
P表示拉取:目标组节点从源组节点拉取数据W表示推送:源组节点主动将变更推送到目标组节点
4. 验证Slave节点的同步状态
- 在Master节点检查Slave节点是否已启用同步:
确保Slave节点的SELECT node_id, external_id, node_group_id, sync_enabled FROM sym_node;sync_enabled字段值为1。 - 若未启用,执行命令开启同步:
symadmin --engine symmetricdsmwdb0 enable-node symmetricdsmwdb1
5. 重启服务生效配置
完成上述配置后,分别重启Master和Slave节点的SymmetricDS服务:
# 重启Master服务 service symmetricds restart # 重启Slave服务 service symmetricds restart
验证双向同步
在Master端修改public schema下的表数据,查看Slave端是否同步;同时在Slave端修改数据,确认Master端同步正常。
内容的提问来源于stack exchange,提问作者Yonoss
相关产品推荐
相关产品推荐

