Назад | Перейти на главную страницу

mongodb время от времени регистрирует весь документ даже с самым низким уровнем детализации

Мы используем mongodb версии 3 в среде AWS с AMI Linux.

Изначально mongo вел журнал всего документа. Затем мы снизили многословность в ямле. Похоже, из-за этого большинство (99%) документов не регистрировались. Однако мы по-прежнему обнаруживаем, что иногда запись все еще сохраняется. Кажется, что выполняется WRITE, а затем COMMAND, и оба содержат всю запись.

Есть ли способ гарантировать, что документ никогда не будет записан в журнал, при этом сохраняя полезное ведение журнала?

Спасибо

systemLog:
  quiet: true
  destination: file
  path: /var/log/mongodb.log
  logAppend: true
  logRotate: rename
  traceAllExceptions: false
  timeStampFormat: iso8601-utc
  verbosity: 1 # This will be inherited by any component with verbosity -1
  component:
    accessControl:
      verbosity: -1 # NOTE: Negative one (-1) means "inherit"
    command:
      verbosity: 0 # MUST BE ZERO!!! Otherwise, inserted/updated records (all the data) will get logged.
    control:
      verbosity: -1
    geo:
      verbosity: 0
    index:
      verbosity: -1
    network:
      verbosity: -1
    query:
      verbosity: -1
    replication:
      verbosity: -1
    sharding:
      verbosity: 0
    storage:
      verbosity: -1
    write:
      verbosity: 0 # MUST BE ZERO!!! Otherwise, inserted/updated records (all the data) will get logged.

Версия и Журналы выглядят так. Обратите внимание, что я ввел данные, поэтому любые недопустимые json или опечатки связаны со мной, а не с mongo.

Версия 3.0.6

TIMESTAMP I WRITE [conn0001] insert project.collection query {<insert our json document here>}
ninserted:1 
keyUpdates:0
writeConflicts:0
numYields:0
locks:{Global: {acquireCount: {r: 2, w: 2}}, MMAPV1Journal: {acquireCount: {w:2},aquireWaitCount: {w:2}, 
timeAquiringMicros: {w: 119326}}, Database: {acquireCount:w: 2}}, Collection" {acquireCount: {W:1}}, oplog: {acquireCount: {w: 1}}} 119ms



TIMESTAMP I COMMAND [conn0001] insert project.$cmd command:  insert {<insert our json document here>}
ninserted:1 
keyUpdates:0
writeConflicts:0
numYields:0
reslen: 80
locks:{Global: {acquireCount: {r: 2, w: 2}}, MMAPV1Journal: {acquireCount: {w:2},aquireWaitCount: {w:2}, 
timeAquiringMicros: {w: 119326}
timeAquiringMicros: {w: 119326}}, Database: {acquireCount:w: 2}}, Collection" {acquireCount: {W:1}}, oplog: {acquireCount: {w: 1}}} 119ms

Ваши запросы вставки регистрируются, потому что они считаются медленными запросами - занимают больше времени, чем по умолчанию operationProfiling.slowOpThresholdMs значение 100 мс. Как и в MongoDB 3.2, нет какой-либо конфигурации того, какие детали должны регистрироваться при медленных запросах, поскольку этот контекст полезен для понимания того, почему запрос медленный.

Вы можете избежать регистрации медленных вставок / команд, увеличив slowOpThresholdMs в твоем mongod Файл конфигурации. Например, установка более высокого slowOpThresholdMs 250 мс может быть достаточно, чтобы гарантировать, что большинство вставок не регистрируются (хотя действительно медленные все еще могут быть):

operationProfiling:
    slowOpThresholdMs: 250

Если вы хотите, чтобы медленные операции никогда не регистрировались, вы можете установить гораздо более высокое значение, но это может скрыть детали, которые могут иметь отношение к производительности вашего развертывания.

Есть ли способ гарантировать, что документ никогда не будет записан в журнал, при этом сохраняя полезное ведение журнала?

Как правило, полезное ведение журнала для устранения неполадок включает в себя подробную информацию о медленных запросах, а также информацию о подключении / репликации / аутентификации (которую вы подавили с помощью quiet:true).

Без регистрации этих данных у вас могут возникнуть трудности с настройкой и поддержкой производственной среды.

Если вас беспокоит доступ к частной информации в mongod log файлы, я бы позаботился о том, чтобы вы правильно ограничили доступ к файлам журналов с помощью разрешений O / S и файловой системы и либо зашифруете свои резервные копии, либо исключите конфиденциальные файлы журнала. Доступ к просмотру mongod журналы сервера требуют большего разрешения, чем просто вход через mongo shell, и любой, у кого есть разрешение на просмотр журналов сервера, предположительно, также может иметь доступ для копирования файлов данных.

Поскольку ваше развертывание выполняется на AWS, вы можете рассмотреть Шифрование Amazon EBS который зашифрует данные, находящиеся внутри тома, данные, перемещаемые между томом и экземпляром, и все моментальные снимки, созданные из тома.

Другой вариант, который следует рассмотреть, - это шифрование конфиденциальных полей в вашем приложении, чтобы они никогда не передавались, не регистрировались или не сохранялись в открытом виде.

Для получения дополнительных сведений о безопасности развертывания см. Контрольный список безопасности MongoDB.