Включение шардинга MongoDB для FIWARE Orion ContextBroker - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь настроить сегментирование MongoDB для Orion ContextBroker и IotAgent-Json, я могу распределять данные обеспечения и обслуживания устройства в MongoDb между шардами, но всякий раз, когда я отправляю фактические данные устройства, выдается следующая ошибка:

{"name": "ENTITY_GENERIC_ERROR", "message": "Ошибка доступа к данным объекта для устройства: DeviceEntity1 типа: DeviceEntity1"}

Я использую следующую командудля ограждения коллекции:
sh.shardCollection("orion-fiwareiot.entities",{"_id.servicePath": 1, "_id.id": 1, "_id.type": 1})

Перехват журнала ContextBroker:

время = среда, 25 сентября 06:54:22 2019.729Z |lvl = ОШИБКА |corr = 4e22de66-df61-11e9-aa53-3464a92017cd |транс = 1569393389-597-00000000007 |от = 127.0.0.1 |srv = fiwareiot |subsrv = / raw |comp = Orion |op = AlarmManager.cpp [211]: dbError |msg = Срабатывание тревоги DatabaseError: collection: orion-fiwareiot.entities - update (): <{_id.id: "DeviceEntity1", _id.type: "DeviceEntity", _id.servicePath: {$ in: [/ ^ / raw $/]}}, {$ set: {attrs.deviceName: {value: "FR", тип: "string", md: {TimeInstant: {type: "ISO8601", значение: "2019-09-25T04: 17:45.645Z "}}, mdNames: [" TimeInstant "], creDate: 1569384878, modDate: 1569385065}, attrs.locationType: {value:" O ", тип:" string ", md: {TimeInstant: {type:" ISO8601", значение:" 2019-09-25T04: 17: 45.645Z "}}, mdNames: [" TimeInstant "], creDate: 1569384878, modDate: 1569385065}, attrs.locationName: {value:" Mumbai ", type:"строка ", md: {TimeInstant: {тип:" ISO8601 ", значение:" 2019-09-25T04: 17: 45.645Z "}}, mdNames: [" TimeInstant "], creDate: 1569384878, modDate: 1569385065}, атрибуты.deviceType: {значение: "FR", тип: "строка", 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"}, $ unset: {location: 1, expDate: 1}}> - исключение: OperationException: {index: 0, код: 61, errmsg: "update {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: {value: "FR", тип: "string", md: {TimeInstant: {type: "ISO8601", значение: "2019-09-25T04: 17: 45.645Z"}}, mdNames: ["TimeInstant"], creDate: 1569384878, modDate: 1569385065}, attrs.locationType: {value: "O", type: "строка", md: {TimeInstant: {тип: "ISO8601", значение: "2019-09-25T04: 17: 45.645Z"}}, mdNames: ["TimeInstant"], creDate: 1569384878, modDate: 1569385065}, attrs.locationName: {value: "Mumbai", тип: "string", md: {TimeInstant: {type: "ISO8601", значение: "2019-09-25T04: 17: 45.645Z"}}, mdNames:["TimeInstant"], creDate: 1569384878, modDate: 1569385065}, attrs.deviceType: {value: "FR", тип: "string", md: {TimeInstant: {type: "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-829201-cd649" d9a9unset: {местоположение:1, expDate: 1}}, multi: false, upsert: false}}

Я также пытался обновить документ вручную, журнал:

update {q: {_id.id: "DeviceEntity1", _id.type: "DeviceEntity", _id.servicePath: {$ in: [/ ^ / raw $ /]}}, u: {$ set: {attrs.deviceName: {значение: "FR", тип: "строка", 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 ", тип:" 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: {type: "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}, атрибуты.TimeInstant: {значение: 1569385065.0, тип: «ISO8601», mdNames: [], creDate: 1569384878.0, modDate: 1569385065.0}, modDate: 1569385065.0, lastCorrelator: «6d0aa4fa-df4b-11e9-829201-cd»: 9649d64a{location: 1.0, expDate: 1.0}}, multi: false, upsert: false} не содержит _id или ключ шарда для шаблона {_id.servicePath: 1.0, _id.id: 1.0, _id.type: 1.0}

Какой стратегии ключа шарда MongoDB следует следовать, для следующего идентификатора составного документа может быть несколько документов для _id.id и _id.servicePath.Я хочу распределить данные с "_id.id": "DeviceEntity1" и "_id.id": "DeviceEntity2" в двух осколках MongoDB.

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

Спасибо.

1 Ответ

0 голосов
/ 26 сентября 2019

Я не до конца уверен (прошло много времени с тех пор, как я установил последний шардинг MongoDB :), но я бы предложил сначала попробовать более простой ключ шардинга.Например:

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

и посмотрите, как это будет.

Что касается:

Я хочу распределить данные с "_id.id": "DeviceEntity1" и "_id.id": "DeviceEntity2"в двух осколках MongoDB.

Возможно, я не помню правильно, или это изменилось в последней версии MongoDB, но, насколько я знаю, вы не можете выбрать, где вы конкретный документы идут.Вы устанавливаете ключ шардинга, и система шардинга MongoDB делает все волшебство, чтобы распределить ваши документы между шардами, основываясь на диапазоне ключей.Но вы не можете гарантировать, что конкретный документ оканчивается конкретным осколком в данный момент времени.

...