Comprobar una migración con recuentos y hashes

TeselaDB

TeselaDB

Equipo de TeselaDB

25 minIntermedio

Compara cada colección de MongoDB y de TeselaDB con su recuento, una suma y un hash de todos sus documentos.

Antes de mover el tráfico a TeselaDB, comprueba que cada colección tiene los mismos documentos que en MongoDB. Lanzas las mismas consultas de solo lectura contra los dos y comparas lo que devuelven.

Lo que vas a construir

Un script de mongosh que da, para cada colección, su recuento, la suma de un campo numérico y un hash SHA-256 de todos sus documentos en orden de _id. Si los tres valores coinciden en MongoDB y en TeselaDB, la colección se copió entera.

Requisitos

  • mongosh y acceso de lectura a la base en MongoDB y en TeselaDB.
  • Que las escrituras en MongoDB estén paradas, o una copia hecha con --oplog y aplicada con --oplogReplay.

1. Recuento y suma

La suma de un campo numérico detecta documentos que faltan o que cambiaron, y cuesta una sola agregación:

JavaScript
db.pedidos.aggregate([{ $group: { _id: null, n: { $sum: 1 }, total: { $sum: "$total" } } }]);

2. Hash de cada colección

El hash recorre los documentos en orden de _id y los pasa a Extended JSON canónico, así que cambia si cambia cualquier campo de cualquier documento, aunque el recuento y la suma del paso anterior sigan coincidiendo:

const crypto = require("crypto");
const hash = crypto.createHash("sha256");
db.pedidos
  .find()
  .sort({ _id: 1 })
  .forEach((doc) => hash.update(EJSON.stringify(doc, { relaxed: false })));
print(hash.digest("hex"));

Con una colección vacía, el hash es el de una entrada vacía, el SHA-256 de cero bytes, que es lo que escribe el ejemplo cuando pedidos no tiene documentos:

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Probarlo

Lanza los dos bloques contra MongoDB y contra TeselaDB para cada colección. Los recuentos, las sumas y los hashes tienen que coincidir. Si un hash no coincide y el recuento sí, busca el documento distinto partiendo la colección por rangos de _id y comparando el hash de cada parte.

Limpiar

Las comprobaciones solo leen, así que no dejan nada en ninguna de las dos bases y no hay nada que limpiar.

Siguientes pasos