本文介绍基于火山引擎缓存数据库 Redis 企业版和文档数据库 MongoDB 版构建 MongoDB 二级缓存访问实时数据的解决方案。
本解决方案旨在通过 RedisAnt 应用实现实时缓存 JSON 数据,实时连接同步 MongoDB 数据库,同时支持自动向本地缓存写入数据来维持数据实时一致性。
RedisAnt 应用程序可以让自动化维护本地缓存变得非常容易。它免去了人工维护添加或更新数据的逻辑,只需要您为应用系统的目标客户定义数据来源, RedisAnt 就能自动完成本地缓存相关的其余操作。
这种基于火山引擎缓存数据库 Redis 企业版和文档数据库 MongoDB 版构建 MongoDB 二级缓存来实现实时数据客户端访问的能力,在游戏场景中具备很高的实际应用价值。
RedisAnt 架构主要包含服务端(RedisAnt server)和客户端(RedisAnt client)两个部分,其中:
RedisAnt server
建立在 MongoDB 数据库之上的 RedisAnt server 会监控 MongoDB 的 OpLogs, 并将变更数据通过 Redis Pub/Sub 发布到 RedisAnt client。
RedisAnt client
客户端启动时会从 MongoDB 数据库中拉取全量数据,并通过 Redis Pub/Sub 实时订阅数据更新,然后将变更数据写入 Redis 缓存中,便于前端服务通过 RedisJson 模块读取 JSON 数据。
RedisAnt 应用系统的架构设计如下图所示。
您需要提前准备如下资源并为各资源设置相关配置。
资源分类 | 所需配置 |
---|---|
ECS | 在本文解决方案中需要准备如下 ECS 相关资源:
|
Redis | 在本文解决方案中,RedisAnt server 和 RedisAnt client 均需使用 Redis 实例。因此您需要分别为 server 和 client 准备对应的 Redis 资源,其中:
说明
|
MongoDB | 在本文解决方案中需要准备如下 MongoDB 相关资源:
说明
|
登录已安装了对应 Go 和 Make 环境的 ECS 实例。
在 ECS 的命令行窗口或命令终端工具中,执行如下命令克隆代码。
git clone https://github.com/redis-developer/redis-ant.git
进入 RedisAnt 项目(本文示例中 RedisAnt 项目目录的名称为 redis-ant,后续操作步骤均使用该目录),并在该项目的根目录下执行如下命令添加 Make 依赖。
make setup
在 RedisAnt 项目中找到如下 4 个配置文件,并根据您的 Redis 和 MongoDB 实例的实际情况修改对应配置。
redis-ant/cmd/redis-ant-server/main.go
文件
文档数据库 MongoDB 版实例不支持 SRV 的连接方式,因此需要在 main.go
文件中的 mongoSTR
位置(文件中第 47 行代码),删除MongoDB 连接地址字符串中的 +srv
部分。
修改前后的代码示例对比如下(如下代码仅展示了设置 MongoDB 连接地址的相关部分):
mongoSTR := "mongodb+srv://" + config.Config.MongoUser + ":" + config.Config.MongoPass + "@" + config.Config.MongoURI
mongoSTR := "mongodb://" + config.Config.MongoUser + ":" + config.Config.MongoPass + "@" + config.Config.MongoURI
redis-ant/internal/mdb/mongoClient.go
文件
需要在 mongoClient.go
文件中进行如下修改:
mongoClient.go
文件中的 connectionURI
位置(文件中第 39 行代码),删除MongoDB 连接地址字符串中的 +srv
部分。mongoClient.go
文件中的 connectionURI
位置(文件中第 39 行代码),在MongoDB 连接地址字符串的末尾增加 authSource=admin
字段。修改前后的代码示例对比如下(如下代码仅展示了设置 MongoDB 连接地址的相关部分):
func OpenConnection(URI, username, password string) *mongo.Client { // Step: Get the context with timeout ctx, cancel := context.WithTimeout(context.Background(), connectTimeout*time.Second) defer cancel() // Step: Create a connection string using credentials connectionURI := fmt.Sprintf("mongodb+srv://%s:%s@%s/test?retryWrites=true&w=majority", username, password, URI)
func OpenConnection(URI, username, password string) *mongo.Client { // Step: Get the context with timeout ctx, cancel := context.WithTimeout(context.Background(), connectTimeout*time.Second) defer cancel() // Step: Create a connection string using credentials connectionURI := fmt.Sprintf("mongodb://%s:%s@%s/test?retryWrites=true&w=majority&authSource=admin", username, password, URI)
redis-ant/env
文件
在 env
文件中,分别为您的 MongoDB 实例、Redis 社区版实例(作为 RedisAnt server)、和Redis 企业版实例(作为 RedisAnt client)设置对应连接信息。
export GLOBAL_REDIS_URL=<Redis 社区版实例的连接地址>:<Redis 社区版实例的端口,默认为 6379> export GLOBAL_REDIS_PASS=<Redis 社区版实例 default 账号的密码> export GLOBAL_REDIS_PORT=<Redis 社区版实例的端口,默认为 6379> export MONGO_URI=<MongoDB 实例完整连接地址串,包括域名和端口号信息> export MONGO_USER=<MongoDB 数据库账号,默认为 root> export MONGO_PASS=<MongoDB 数据库账号对应的密码> export client_REDIS_URL=<Redis 企业版实例的连接地址>:<Redis 企业版实例的端口,默认为 6379> export client_REDIS_PASS=<Redis 企业版实例 default 账号的密码> export client_REDIS_PORT=<Redis 企业版实例的端口,默认为 6379>
代码示例如下。
export GLOBAL_REDIS_URL=redis-cnlfqfxzk8zxt****.redis.volces.com:6379 export GLOBAL_REDIS_PASS=Pwd_test**** export GLOBAL_REDIS_PORT=6379 export MONGO_URI=mongoshard40518f13****0.mongodb.volces.com:3717,mongoshard40518f13****1.mongodb.volces.com:3717 export MONGO_USER=root export MONGO_PASS=Pwd_test**** export client_REDIS_URL=redis-cnlftomq75f8p****.redis.volces.com:6379 export client_REDIS_PASS=Pwd_test**** export client_REDIS_PORT=6379
redis-ant/ant_source.yml
文件
在 ant_source.yml
文件中,将代码中的相关配置替换为您 MongoDB 数据库的真实设置。
database: "<MongoDB 所用数据库的名称>" collection: "<MongoDB 所用集合的名称>" key_field: "<MongoDB 所用集合的索引字段>"
代码示例如下。
database: "users" collection: "devices" key_field: "user_id"
在 RedisAnt 项目目录下,分别执行如下命令完成对应操作:
make build
命令编译文件。redis-ant-client
和 redis-ant-server
。env
文件中设置的环境变量。source ./env
nohup ./bin/redis-ant-client &
nohup ./bin/redis-ant-server &
说明
后续再次使用 RedisAnt 应用时,仅需在 RedisAnt 项目下通过最后两个命令分别启动 RedisAnt client 和 RedisAnt server 服务即可。
成功启动 RedisAnt client 和 RedisAnt server 服务后,您可以参考如下操作步骤进行数据验证:
连接 MongoDB 实例并在目标数据库中写入测试数据。
具体操作步骤如下:
use <数据库名称>
命令进入目标数据库。users
数据库为例,示例如下。use users
返回示例如下。db.devices.insert({"user_id": 1, "device_id": "Test", "consent": true})
连接 RedisAnt client 所用的 Redis 企业版实例,并验证是否能查询到 MongoDB 中刚写入的测试数据。
具体操作步骤如下:
json.get 1
名称查询数据,查看并对比返回结果是否与 MongoDB 中写入的测试数据一致。