oplogtoredis 是一个监听Mongo服务器oplog(操作日志)并将更改发布到Redis的工具,专为配合 https://github.com/cult-of-coders/redis-oplog 设计。与redis-oplog默认行为(要求所有写入Mongo的操作需手动发布Redis通知)不同,结合oplogtoredis与redis-oplog的externalRedisPublisher选项,可确保所有写入Mongo的更改自动发布到Redis。
该项目目前稳定,已在Tulip的生产环境中使用。在生产环境使用前,请查看以下已知限制,并在 staging 环境中测试。
使用externalRedisPublisher选项时,redis-oplog的部分功能暂不支持,因此与oplogtoredis配合使用时这些功能无法工作。这些功能属于 https://github.com/cult-of-coders/redis-oplog/blob/master/docs/finetuning.md%E3%80%82%E8%8B%A5%E4%B8%8D%E4%BD%BF%E7%94%A8%E8%BF%99%E4%BA%9B%E7%B2%BE%E7%BB%86%E8%B0%83%E4%BC%98%E9%80%89%E9%A1%B9%EF%BC%8C%E5%88%99%E4%B8%8D%E4%BC%9A%E9%81%87%E5%88%B0%E4%BB%A5%E4%B8%8B%E9%99%90%E5%88%B6%EF%BC%9A
要将其与redis-oplog配合使用,需配置redis-oplog:
externalRedisPublisher: trueglobalRedisPrefix: "<Mongo数据库名称>."例如,若Meteor的MONGO_URL为mongodb://mymongoserver/mydb,配置如下:
json{ "redisOplog": { "redis": { "port": 6379, "host": "myredisserver" }, "globalRedisPrefix": "mydb.", "externalRedisPublisher": true } }
可通过go build .从源码构建oplogtoredis,生成静态链接二进制文件运行。也可使用https://hub.docker.com/r/tulip/oplogtoredis/tags/%E3%80%82
必须设置以下环境变量:
OTR_MONGO_URL:必填。用于读取oplog的Mongo URL,需指向Mongo服务器的local数据库,与Meteor服务器的MONGO_OPLOG_URL一致。
OTR_REDIS_URL:必填。用于发布更新的Redis URL。通过TLS连接时,URL协议需指定为rediss://,否则使用redis://。
可选环境变量(配置日志级别):
OTR_LOG_DEBUG:可选。启用详细的调试日志,详见lib/log/main.go。
OTR_LOG_QUIET:不输出任何日志,适用于单元测试。
其他可用于调优性能和可靠性的环境变量,详见https://godoc.org/github.com/tulip/oplogtoredis/lib/config%E3%80%82
使用Docker运行oplogtoredis:
bashdocker run -d \ -e OTR_MONGO_URL="mongodb://mymongoserver:27017/local?replicaSet=rs0" \ -e OTR_REDIS_URL="redis://myredisserver:6379" \ --name oplogtoredis \ tulip/oplogtoredis
oplogtoredis包含多项功能,支持在关键生产场景中使用。
oplogtoredis使用Redis进行消息去重,因此可安全运行多个实例(建议2-3个),以确保部分故障或崩溃时的可用性。多个实例会处理相同的oplog消息并发送到Redis,通过Lua脚本去重。注意:实例数量增加会线性增加Mongo和Redis的负载。
oplogtoredis使用Redis记录最后处理的消息。启动时会检查上次处理位置,并从该时间戳恢复监听oplog(不会回溯过久,避免过载Redis或Meteor服务器)。调优细节详见https://godoc.org/github.com/tulip/oplogtoredis/lib/config%EF%BC%8C%E7%A1%AE%E4%BF%9D%E5%8D%B3%E4%BD%BF%E6%89%80%E6%9C%89%E5%AE%9E%E4%BE%8B%E7%9F%AD%E6%9A%82%E4%B8%8B%E7%BA%BF%EF%BC%8C%E7%B3%BB%E7%BB%9F%E4%BB%8D%E8%83%BD%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C%E3%80%82
oplogtoredis暴露HTTP服务器用于监控,默认监听0.0.0.0:9000,可通过环境变量OTR_HTTP_SERVER_ADDR修改。
健康检查端点:/healthz。检查Mongo和Redis连接,返回200。若请求超时或返回非200状态超过10-15秒,需重启程序(可通过Kubernetes存活探针、Icinga健康检查等实现)。
Prometheus指标端点:/metrics。Prometheus可抓取该端点收集指标。特别地,若指标otr_redispub_processed_messages(标签status=sent)的值低于Mongo写入量,可能表明oplogtoredis存在问题。
默认情况下,oplogtoredis以JSON格式输出信息、警告和错误日志,便于结构化日志系统处理。调试时可设置OTR_LOG_DEBUG=true,输出更详细的人类可读日志。
可使用go build构建和测试oplogtoredis,或使用docker-compose环境(docker-compose up),该环境包含Mongo、Redis和oplogtoredis:
oplogtoredis:运行oplogtoredis的容器,源代码变更时自动重载(通过https://github.com/pilu/fresh%EF%BC%89%E3%80%82
mongo:MongoDB服务器,其他容器使用dev数据库。通过docker-compose exec mongo mongo dev连接。
redis:Redis服务器。通过docker-compose exec redis redis-cli连接,使用monitor命令查看发布内容。
可选通过docker-compose -f docker-compose.yml -f docker-compose.meteor.yml启动两个Meteor应用服务器,运行简单待办应用,使用redis-oplog并连接相同的Mongo和Redis。首次运行需5-10分钟(Meteor初始下载/构建),后续启动更快。
额外的docker-compose.meteor.yml包含:
meteor1和meteor2:两个Meteor服务器,提供testapp/应用,分别监听localhost:9091和localhost:9092。正常工作时,一个服务器的客户端更改(或直接Mongo修改)应实时同步到另一个服务器的客户端。oplogtoredis有多种测试工具和套件,Travis会在每次提交时运行。本地可通过scripts/runAllTests.sh运行所有测试。
使用gometalinter检测风格和正确性问题,运行scripts/runLint.sh。需安装gometalinter及其依赖:go get github.com/alecthomas/gometalinter; gometalinter --install。
使用标准go test工具,通过scripts/runUnitTests.sh包装,设置超时并启用竞态检测器。
测试生产就绪的oplogtoredis Docker构建,通过docker-compose运行生产容器、Mongo和Redis,测试整个系统行为。在不同Mongo和Redis版本下,启用/禁用竞态检测器运行。通过scripts/runIntegrationAcceptance.sh运行(耗时较长),scripts/runIntegrationAcceptanceSingle.sh可快速单配置运行。
观察oplogtoredis在故障条件下的行为(如崩溃重启、Mongo/Redis临时不可用)。使用编译后的二进制而非Docker镜像,在单个Docker容器内由测试工具控制启停组件。通过scripts/runIntegrationFaultInjection.sh运行。
通过docker-compose启动oplogtoredis、Mongo、Redis和两个Meteor服务器(运行./testapp应用),通过websockets/DDP连接Meteor服务器,观察网络流量以验证oplogtoredis与redis-oplog配合是否正常。通过scripts/runIntegrationMeteor.sh运行。
环境类似验收测试,但仅针对单个Mongo和Redis版本,禁用竞态检测器。运行两个测试:批量写入Mongo(不等待通知)和批量写入并等待Redis通知。两者差异为oplogtoredis的延迟开销上限,超过35%则测试失败。通过scripts/runIntegrationPerformance.sh运行。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务