Pregunta

A tienen un href="http://www.delorie.com/gnu/docs/gdbm/gdbm.html" rel="nofollow noreferrer"> GDBM base de datos clave-valor como el backend para una aplicación orientada al web con equilibrio de carga que está en implementado en C ++. Los datos servidos por la aplicación ha crecido muy grande, por lo que nuestros administradores han movido los archivos GDBM de almacenamiento "local" (en los servidores web, o muy cerca) a un sistema de archivos grande, compartida, remoto montado en NFS.

Esto ha afectado el rendimiento. Nuestras pruebas de rendimiento (en un entorno de prueba) mostrar la página tiempos de carga saltando de cientos de milisegundos (por disco local) hasta varios segundos (a través de NFS, red local), y en ocasiones obtener tan alto como 30 segundos. Creo que una gran parte del problema es que la aplicación hace un montón de lecturas aleatorias de los archivos GDBM, y que éstos son lentos a través de NFS, y esto será aún peor en la producción (en el front-end y back-end tienen aún más hardware de red entre ellos) y como nuestra base de datos es aún más grande.

Si bien esto no es una aplicación crítica, me gustaría mejorar el rendimiento, y tienen algunos recursos disponibles, incluyendo el tiempo de desarrollo de aplicaciones y administradores de Unix. Mi principal limitación es el tiempo sólo se dispone de los recursos durante unas pocas semanas.

Tal como lo veo, mis opciones son:

  1. Mejorar el rendimiento de NFS parámetros de ajuste. Mi instinto es que no conseguirá mucho de esto, pero he estado mal antes, y yo realmente no saber mucho acerca de la optimización de NFS.

  2. Mover a una base de datos clave-valor diferente, tal como memcachedb o Tokio Gabinete

  3. Reemplazar NFS con algún otro protocolo (iSCSI ha sido mencionado, pero no estoy familiarizado con él).

¿Cómo debería abordar este problema?

¿Fue útil?

Solución

No se obsesione con el “relacional frente a la no-relacional” comparación. Parece ser irrelevante para este problema.

La línea de su aplicación ha cruzado es otra: desde una pequeña base de datos en el almacenamiento de archivos rápida local, a una gran base de datos de acceso a través de la red . Cruzar esa línea significa que ahora está mejor servido por un servicio de red, sistema dedicado, gestión de base de datos. Si el servidor de administración gestiona bases de datos relacionales no es relevante para ese aspecto.

Para conseguir que en funcionamiento rápidamente, MariaDB (el sucesor de MySQL) es probablemente su mejor apuesta. Si se prevé que crece mucho más allá de donde está ahora, puede ser que también lo puso en PostgreSQL ya que es donde que tendrá que ir con el tiempo de todos modos: -)

Otros consejos

Esto parece no ser lo que quiere oír, pero sinceramente, si fuera tú lo lanzaría en una tabla de MySQL. No es como si fuera significativamente más difícil trabajar con, y se obtiene una gran cantidad de beneficios con ella, no menos importante un protocolo de acceso remoto que está efectivamente destinados a su situación, a diferencia de GDBM-sobre-NFS.

Si usted quiere meter a las bases de datos no relacionales que podría intentar BDB o de DJB BDC . He utilizado tanto hasta ahora y creo que cuando se trata de rendimiento que superan GDBM.

Sin embargo, mantener la respuesta de bignose en cuenta que yo también creo que el cuello de botella podría no ser la estructura de datos (GDBM) que está utilizando, pero su infraestructura.

Sistema de archivos de E / S con archivos planos través de una red no es una buena idea, pero se debe considerar escribir un servidor multi-hilo TCP que hace de E / S, consulta, etc. en esa máquina, a continuación, los resultados de espalda devuelve. Transferir pequeñas cantidades de datos no toda archivos db ..

Estoy diseñando un mecanismo de caché-persistencia para superar una problem.I alta disponibilidad cifrará que, en Python.

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