Monstache无法自动同步MongoDB至Elasticsearch问题求助
环境版本
- Monstache: 6.7.11
- Elasticsearch: 7.17
- MongoDB: 4.0
问题描述
MongoDB数据无法自动同步至Elasticsearch,仅在重启Monstache后才能完成同步。已尝试调整change-stream-namespaces配置,问题仍未解决。
当前monstache.toml配置
mongo-url = "mongodb://localhost:27017" elasticsearch-urls = ["http://localhost:9200"] elasticsearch-max-conns = 100 replay = true resume = true resume-name = "andes" resume-strategy = 1 config-database-name = "andes" enable-oplog = false direct-read-namespaces = ["andes.SS_AA_Test","andes.qmf__source","andes.qmf__dashboard"] change-stream-namespaces = ["andes.SS_AA_Test","andes.qmf__source","andes.qmf__dashboard"] index-as-update = true gzip = false verbose = true cluster-name = 'andes' exit-after-direct-reads = false [[mapping]] namespace = "andes.SS_AA_Test" index = "SS_AA" [[mapping]] namespace = "andes.qmf__dashboard" index = "andes" [[mapping]] namespace = "andes.qmf__message" index = "andes" [[mapping]] namespace = "andes.qmf__notification" index = "andes" [[mapping]] namespace = "andes.qmf__package" index = "andes" [[mapping]] namespace = "andes.qmf__query" index = "andes" [[mapping]] namespace = "andes.qmf__resource" index = "andes" [[mapping]] namespace = "andes.qmf__schedule" index = "andes" [[mapping]] namespace = "andes.qmf__slog" index = "andes" [[mapping]] namespace = "andes.qmf__source" index = "andes" [[mapping]] namespace = "andes.qmf__story" index = "andes" [[mapping]] namespace = "andes.qmf__subset" index = "andes" [logs] info = "C:/Users/dsureshbhirud/Desktop/Elasticsearch_7.17/Mon_longs/monstache/logs/info.log" warn = "C:/Users/dsureshbhirud/Desktop/Elasticsearch_7.17/Mon_longs/monstache/logs/warn.log" error = "C:/Users/dsureshbhirud/Desktop/Elasticsearch_7.17/Mon_longs/monstache/logs/error.log" trace = "C:/Users/dsureshbhirud/Desktop/Elasticsearch_7.17/Mon_longs/monstache/logs/trace.log"
解决方案建议
检查MongoDB变更流有效性
MongoDB 4.0变更流存在限制:无法监听跨分片集合(分片集群场景),若集合被删除重建,已有的变更流会失效且Monstache不会自动重建。确认change-stream-namespaces中的集合均存在,同时查看MongoDB日志,排查变更流是否有中断或报错。调整恢复策略
将resume-strategy = 1(时间戳恢复)改为resume-strategy = 2(令牌恢复),令牌恢复是更可靠的变更流恢复方式,可避免时间戳漂移导致的同步中断。同时确保config-database-name指定的andes数据库未被清理,Monstache需在此存储恢复令牌和同步状态。分析Monstache日志
查看trace.log和error.log,重点关注change stream closed、resume failed这类关键字段,定位同步中断原因(如ES连接超时、MongoDB权限不足等)。若日志显示变更流因超时中断,可添加change-stream-max-wait-time = 30000调整等待时长。移除冲突配置
当前同时启用direct-read-namespaces和change-stream-namespaces,直接读取过程可能占用资源阻塞变更流线程。可临时注释direct-read-namespaces,仅保留变更流配置测试自动同步效果;若已完成初始同步,将replay改为false,避免历史变更重播影响实时同步。验证MongoDB权限
确保Monstache使用的MongoDB用户拥有read和changeStream权限,可通过以下MongoDB shell命令验证:db.getSiblingDB('admin').runCommand({ usersInfo: { user: 'your-monstache-user', db: 'admin' }, showPrivileges: true })升级Monstache版本
Monstache 6.7.11存在变更流相关已知bug,建议升级至6.x系列最新稳定版(如6.10.x),修复兼容性问题。
内容的提问来源于stack exchange,提问作者Dnyansudha Bhirud

