如何配置同Docker容器内的Typesense使用内置MongoDB的数据
Typesense本身是独立的搜索引擎服务,不会自动读取同网络内部署的MongoDB数据。你当前的配置只启动了三个独立服务,没有搭建MongoDB到Typesense的数据同步链路,Typesense内没有写入任何业务数据,调用接口返回num_documents: 0是正常现象。
你已经完成了MongoDB副本集配置,满足同步的前置要求,按以下步骤配置即可实现数据自动同步:
- 第一步:更新docker-compose配置
你当前使用的Typesense 0.21.0版本过旧,存在较多同步相关的已知bug,先升级到稳定版,同时新增官方MongoDB同步连接器服务,负责全量拉取存量数据、监听增量变更同步到Typesense。完整配置参考如下:
version: "3.9" services: database: image : 'mongo' container_name: 'container-name' environment: - PUID=1000 - PGID=1000 volumes: - ./database:/data/db entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ] ports: - 27017:27017 restart: unless-stopped healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 10s timeout: 5s retries: 5 mongo-express: image: mongo-express:1.0.2 ports: - "8081:8081" environment: ME_CONFIG_MONGODB_SERVER: database depends_on: database: condition: service_healthy restart: unless-stopped typesense: image: typesense/typesense:26.0 ports: - "8108:8108" environment: TYPESENSE_API_KEY: xyz TYPESENSE_DATA_DIR: /data/typesense TYPESENSE_ENABLE_CORS: "true" volumes: - ./typesense:/data/typesense restart: unless-stopped healthcheck: test: curl -f http://localhost:8108/health interval: 10s timeout: 5s retries: 5 typesense-mongodb-connector: image: typesense/typesense-mongodb-connector:latest depends_on: database: condition: service_healthy typesense: condition: service_healthy environment: MONGODB_URI: "mongodb://database:27017/?replicaSet=rs0" TYPESENSE_API_KEY: "xyz" TYPESENSE_HOST: "typesense:8108" TYPESENSE_PROTOCOL: "http" # 同步规则配置,替换为自己的实际库表信息 SYNC_CONFIG: | { "替换为你的MongoDB库名": { "替换为你要同步的MongoDB集合名": { "typesense_collection_name": "替换为对应Typesense集合名", "fields": [ {"name": ".*", "type": "auto"} ] } } } restart: unless-stopped
上述配置中新增的健康检查是为了保证MongoDB、Typesense完全启动后再启动同步连接器,避免启动时连接报错。fields配置中{"name": ".*", "type": "auto"}表示自动同步集合下所有字段、自动识别字段类型,也可以根据业务需要手动指定字段映射规则。如果不需要同步历史存量数据,只同步启动后的增量变更,可以给连接器新增环境变量FULL_SYNC: "false"。
第二步:初始化MongoDB副本集
首次启动MongoDB容器后,需要手动进入容器完成副本集初始化,否则MongoDB变更流无法正常工作:- 进入MongoDB shell:
docker exec -it container-name mongosh - 执行副本集初始化命令:
rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "database:27017" }] })- 等待10秒左右,执行
rs.status(),返回结果中成员状态显示为PRIMARY即代表初始化完成,退出shell即可。
- 进入MongoDB shell:
第三步:启动服务验证同步
执行docker compose up -d重启所有服务,等待1-2分钟让全量同步完成后,再调用Typesense的集合文档查询接口,就能看到num_documents数值和MongoDB中对应集合的文档数量一致。后续MongoDB中的数据增删改操作都会自动实时同步到Typesense。
注意:如果同步后文档数量为0,先检查同步规则里的库名、集合名是否填写正确,再查看连接器日志确认是否有连接报错、权限报错。
内容的提问来源于stack exchange,提问作者Anderson Mendes de Almeida

