Backend de almacenamiento de datos adecuado para la aplicación Erlang cuando los datos no se ajustan a la memoria

StackOverflow https://stackoverflow.com/questions/287233

Pregunta

Estoy investigando posibles opciones para organizar el almacenamiento de datos para una aplicación Erlang. Los datos que se supone que debe usar son básicamente una gran colección de blobs binarios indexados por identificadores de cadenas cortas. Cada blob tiene menos de 10 Kb, pero hay muchos de ellos. Esperaría que en total tuvieran un tamaño de hasta 200 Gb, por lo que obviamente no cabe en la memoria. La operación típica en estos datos es leer un blob por su id o actualizar un blob por su id o agregar uno nuevo. En cada período del día, solo se está utilizando un subconjunto de identificadores, por lo que el rendimiento del acceso al almacenamiento de datos podría beneficiarse de la memoria caché en memoria. Hablando de rendimiento, es bastante crítico. El objetivo es tener alrededor de 500 lecturas y 500 actualizaciones por segundo en hardware básico (digamos en EC2 VM).

¿Alguna sugerencia de qué usar aquí? Según tengo entendido, dets está fuera de discusión ya que está limitado a 2G (¿o fue 4G?). Mnesia probablemente fuera de discusión también; Mi impresión es que fue diseñado principalmente para casos en que los datos se ajustan a la memoria. Estoy considerando probar el controlador Berkeley DB de EDTK para la tarea. ¿Funcionaría en el escenario anterior? ¿Alguien tiene experiencia usándolo en la producción en condiciones similares?

¿Fue útil?

Solución

tcerl salió de enfrentar el mismo límite de tamaño. No estoy usando Erlang en estos días, pero parece lo que estás buscando.

Otros consejos

¿Has visto lo que está haciendo CouchDB? Puede que no sea exactamente lo que busca como una caída en el producto, pero hay un montón de código erlang para almacenar datos. También se habla de proporcionar una interfaz erlang nativa en lugar de la API REST.

¿Hay alguna razón por la que no puede simplemente usar un sistema de archivos, tratando el nombre del archivo como su ID de cadena y el contenido del archivo como un blob binario? Puede elegir uno (sistema de archivos) que se ajuste a sus requisitos de rendimiento, y debería obtener el almacenamiento en caché básicamente de forma gratuita, proporcionado por su sistema operativo.

Mnesia puede almacenar datos en el disco muy bien. También hay dets (almacenamiento de términos basado en disco) que es más o menos análogo a Berkeley DB. Está en la biblioteca estándar: http://www.erlang.org/doc/ apps / stdlib / index.html

Recomendaría Apache CouchDB.

Es una excelente opción para Erlang, y por lo que parece (mencionas blobs basados ??en ID y no mencionas ningún requisito relacional) estás buscando una base de datos orientada a documentos.

Dado que la interfaz es REST, simplemente puede agregar un caché HTTP básico frente a ella si necesita almacenamiento en caché.

La documentación para CouchDB es de muy alta calidad.

También tiene incorporado Map-Reduce :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top