2012-06-01 17 views
5

En mi proyecto actual, tengo PostgreSQL como mi base de datos maestra y Redis como una especie de esclavo, por ejemplo, cuando un usuario agrega a otro como amigo, primero la relación se almacena en PostgreSQL y luego aparece una lista de amigos en Redis. estar actualizado. Cuando se solicita la lista de amigos de algún usuario, se eliminará de Redis en lugar de PostgreSQL.¿Debo confiar en Redis para la integridad de los datos?

La pregunta es: cuando actualizo la lista de amigos en Redis, debería obtener una copia nueva de PostgreSQL, y reemplazar la lista anterior en Redis por la nueva o debería conservar la lista anterior y simplemente SADD el ID de usuario en ¿la lista? Este último es, por supuesto, mejor para el rendimiento, pero intuitivamente el primero hace un mejor trabajo para mantener la integridad de los datos. Y si se usa algo así como Apio, ¿vale la pena el segundo método?

Respuesta

4

Esto no tiene nada que ver con Redis. Cuando escribe en dos bases de datos, muchas cosas pueden salir mal incluso si ambas garantizan individualmente la integridad de los datos.

Con el objetivo de debatir, reemplace Redis con MySQL en su pregunta, y pregúntese: ¿se verá comprometida la integridad de los datos?

Puede haber escrito en Postgres y luego su proceso puede morir sin escribir en MySQL. O tal vez hay un corte de red. O tal vez MySQL está caído. En todos estos casos, Postgres y MySQL comenzarían a diferir.

No importa si reemplaza el registro completo o simplemente agrega una fila. Ambos pueden conducir a la corrupción de datos.

Si le preocupa la integridad de los datos, guarde los datos en un solo sistema autoritativo. De lo contrario, necesitaría un two phase commit protocol

+1

+1 - estoy de acuerdo ... y además señalo/advierto que la opción de usar redis como el esclavo en lugar del maestro en este escenario me parece extraña. si la escalabilidad supera los requisitos de coherencia en este escenario, ¿por qué no utilizar redis como fuente autorizada (configuración de espacios de claves verticalmente fragmentados si un solo servidor no manejará la carga) y luego replicar a cassandra o algún otro almacén escalable horizontalmente? – codemonkey

+0

@Sripathi, soy plenamente consciente del problema que mencionas, no importa el método que elija, la corrupción de datos ocurrirá al mismo ritmo, pero ¿es este el único lugar donde ocurre la corrupción? Dado que Redis no cumple con el ACID, me gustaría saber con qué frecuencia debo reconstruir sus datos del maestro, o es práctico tratarlo como ACID (en este caso específico, por supuesto). – Jiaji

+0

@codemonkey De hecho, necesito consistencia, así que elijo Postgres como maestro, ya que los datos de Redis se pueden reconstruir a partir de él, en teoría los datos enviados a los usuarios se pueden hacer 'casi' consistentes. – Jiaji

1

Debería evaluar qué tan importante es la consistencia para su aplicación y tomar las cosas desde allí. No suena como el llanto de nadie si pierdes un compromiso. Puede tener un proceso en segundo plano que lea datos de PostgreSQL y los vuelva a enviar a Redis, y eventualmente eliminará cualquier incoherencia. Alternativamente, podría ver las instancias de lectura de esclavos PostgreSQL replicando desde el maestro de escritura. Esto le haría leer mejor la escalabilidad usando la tecnología de sincronización bien probada.

+0

Sí, quiero hacer un intercambio entre consistencia y rendimiento , es por eso que elijo a Redis para ser el esclavo. Hacer una iteración/reconstrucción de datos constante parece seguro pero un poco exigente con los recursos. De hecho, lo mal que Redis necesita esto es la respuesta que quiero saber. – Jiaji

Cuestiones relacionadas