为FIWARE Orion ContextBroker启用MongoDB分片

问题描述 投票:1回答:1

我正在尝试为Orion ContextBroker和IotAgent-Json设置MongoDB分片,我能够在分片之间的MongoDb中分发设备配置和服务数据,但是每当我发送实际的设备数据时,它都会产生以下错误:

{“ name”:“ ENTITY_GENERIC_ERROR”,“ message”:“错误访问设备的实体数据:类型为DeviceEntity1的DeviceEntity1”}

我正在使用以下命令对集合进行分片:sh.shardCollection("orion-fiwareiot.entities",{"_id.servicePath": 1, "_id.id": 1, "_id.type": 1})

ContextBroker日志的拦截:

time =星期三9月25日06:54:22 2019.729Z | lvl =错误| corr = 4e22de66-df61-11e9-aa53-3464a92017cd | trans = 1569393389-597-00000000007 |从= 127.0.0.1 | srv = fiwareiot | subsrv = / raw | comp = Orion | op = AlarmManager.cpp [211]:dbError | msg =引发警报DatabaseError:集合:orion-fiwareiot.entities-update():-异常:OperationException:{索引:0,代码:61,errmsg:“更新{q:{_id.id:“ DeviceEntity1”,_id.type:“ DeviceEntity”,_id.servicePath:{$ in:[/ ^ / raw $ /]}},u:{$ set:{attrs.deviceName :{v ...“,op:{q:{_id.id:” DeviceEntity1“,_id.type:” DeviceEntity“,_id.servicePath:{$ in:[/ ^ / raw $ /]}},u :{$ set:{attrs.deviceName:{值:“ FR”,类型:“ string”,md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”} },mdNames:[“ TimeInstant”],creDate:1569384878,modDate:1569385065},attrs.locationType:{值:“ O”,t ype:“ string”,md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”}},mdNames:[“ TimeInstant”]],creDate:1569384878,modDate:1569385065 },attrs.locationName:{值:“孟买”,类型:“ string”,md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”}},mdNames: [“ TimeInstant”],日期:1569384878,modDate:1569385065},attrs.deviceType:{值:“ FR”,类型:“ string”,md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09 -25T04:17:45.645Z“}},mdNames:[” TimeInstant“],creDate:1569384878,modDate:1569385065},attrs.deviceMacAddress:{值:” 84:24:8D:F8:B2:B2“,类型:“ string”,md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”}},mdNames:[“ TimeInstant”],creDate:1569384878,modDate:1569385065} ,attrs.TimeInstant:{值:1569385065.0,类型:“ ISO8601”,mdNames:[],creDate:1569384878,modDate:1569385065},modDate:1569385065,lastCorrelator:“ 6d0aa4fa-df4b-11e9-8293-3464a92017cd”},未设置:{位置: 1,expDate:1}},multi:false,upsert:false}}

我也尝试过手动更新文档,日志为:

更新{q:{_id.id:“DeviceEntity1”,_ id.type:“ DeviceEntity”,_ id.servicePath:{$ in:[/ ^ / raw $ /]}},u:{$ set:{attrs .deviceName:{值:“ FR”,类型:“ string”,md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”}},mdNames:[“ TimeInstant “],creDate:1569384878.0,modDate:1569385065.0},attrs.locationType:{值:” O“,类型:” string“,md:{TimeInstant:{类型:” ISO8601“,值:” 2019-09-25T04: 17:45.645Z“}},mdNames:[” TimeInstant“],creDate:1569384878.0,modDate:1569385065.0},attrs.locationName:{value:” Mumbai“,type:” string“,md:{TimeInstant:{type: “ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”}},mdNames:[“ TimeInstant”],creDate:1569384878.0,modDate:1569385065.0},attrs.deviceType:{值:“ FR”,类型:“ string”,md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”}},mdNames:[“ TimeInstant”],creDate:1569384878.0,modDate:1569385065.0} ,attrs.deviceMacId:{值:“ 84:24:8D:F8:B2:B2”,键入:“ string”, md:{TimeInstant:{类型:“ ISO8601”,值:“ 2019-09-25T04:17:45.645Z”}},mdNames:[“ TimeInstant”],creDate:1569384878.0,modDate:1569385065.0},attrs.TimeInstant: {值:1569385065.0,类型:“ ISO8601”,mdNames:[],creDate:1569384878.0,modDate:1569385065.0},modDate:1569385065.0,lastCorrelator:“ 6d0aa4fa-df4b-11e9-8293-3464a92017cd”},$ unset:{位置: 1.0,expDate:1.0}},multi:false,upsert:false}不包含模式{_id.servicePath:1.0,_id.id:1.0,_id.type:1.0}

的_id或分片键

为了遵循复合文档ID,我应该遵循哪种MongoDB分片密钥策略,_id.id_id.servicePath可能有多个文档。我想在两个MongoDB分片中使用"_id.id": "DeviceEntity1""_id.id": "DeviceEntity2"分发数据。

    "_id" : {
        "id" : "DeviceEntity1",
        "type" : "DeviceEntity",
        "servicePath" : "/raw"
    },... 

谢谢。

mongodb fiware fiware-orion
1个回答
0
投票

我不确定(自从我上次建立MongoDB分片以来已经很长时间了:),但我建议先尝试使用更简单的分片密钥。例如:

db.shardCollection("orion-fiwareiot.entities", {"_id.id": 1})

并查看进展情况。

关于:

我想在两个MongoDB分片中使用"_id.id": "DeviceEntity1""_id.id": "DeviceEntity2"分发数据。

也许我记不清了,或者它在最近的MongoDB版本中已更改,但是据我所知,您无法选择特定文档的存放位置。您设置了一个分片密钥,MongoDB分片系统将根据密钥范围,尽一切办法在分片之间分发文档。但是您不能确保特定文档在给定时间内以特定分片结尾。

© www.soinside.com 2019 - 2024. All rights reserved.