2008-11-27 9 views
10

Estoy buscando construir una aplicación Rails que tenga algunas bonitas tablas grandes con más de 500 millones de filas. Para mantener las cosas ágiles Actualmente estoy investigando cómo se puede dividir una tabla grande en más fragmentos manejables de . Veo que a partir de MySQL 5.1 hay una opción de partición y esa es una opción posible, pero no me gusta la forma en que la columna que determina el particionamiento debe ser parte de la clave primaria en en la tabla.Estrategia para tratar con grandes tablas db

Lo que realmente me gustaría hacer es dividir la tabla que un modelo AR escribe a basado en los valores escritos, pero por lo que yo soy consciente de que no hay manera de hacer esto - ¿alguien tiene alguna sugerencia en cuanto a cómo podría implementar esta o cualquier otra estrategia alternativa?

Gracias

Arfon

Respuesta

5

columnas de partición en MySQL no se limitan a las claves primarias. De hecho, una columna de partición no tiene que ser una clave en absoluto (aunque se creará una para ella de forma transparente). Puede dividir por RANGE, HASH, KEY y LIST (que es similar a RANGE solo que es un conjunto de valores discretos). Lea el manual de MySQL para an overview de los tipos de partición.

Existen soluciones alternativas como HScale, un complemento de middleware que divide las tablas de manera transparente según ciertos criterios. HiveDB es un marco de código abierto para partición horizontal para MySQL.

Además de sharding y partioning debe emplear algún tipo de agrupamiento. La configuración más simple es una configuración basada en la replicación que le ayuda a distribuir la carga en varios servidores físicos. También debería considerar soluciones de clúster más avanzadas, como el clúster MySQL (probablemente no sea una opción debido al tamaño de su base de datos) y el middleware de clúster, como Sequioa.

En realidad, hice una pregunta relevante con respecto a scaling with MySQL aquí en stack-overflow hace algún tiempo, que terminé respondiéndome a mí mismo varios días después después de reunir mucha información sobre el tema. Puede ser relevante para ti también.

1

Si desea dividir sus datos por tiempo, la siguiente solución puede ajustarse a su necesidad. Probablemente pueda usar tablas MERGE;

Supongamos que su mesa se llama MiTabla y que necesita una tabla por semana

  1. Su aplicación siempre registra en la misma tabla
  2. Un trabajo semanal renombra atómicamente su mesa y recrea un vacío una: MiTabla se renombra a MyTable-Year-WeekNumber, y se crea una nueva MyTable vacía
  3. Las tablas de fusión se eliminan y vuelven a crear.

Si desea obtener todos los datos de los últimos tres meses, cree una tabla de fusión que incluirá solo las tablas de los últimos 3 meses. Cree tantas tablas de combinación como necesite períodos diferentes.Si puede no incluir la tabla en la que se encuentran actualmente datas más insertan (MiTabla en nuestro ejemplo), podrás ser aún más feliz, ya que no tendrá ningún concurrencia de lectura/escritura

1

Usted puede manejar esto en su totalidad en Active Record usando DataFabric.

No es tan complicado implementar un comportamiento similar si eso no es adecuado. Google sharding para mucha discusión sobre el patrón arquitectónico de manipulación de particiones de tabla dentro del nivel de la aplicación. Tiene las ventajas de evitar middleware o dependiendo de las características específicas de db vendedor. Por otro lado, es más código en tu aplicación de la que eres responsable.

Cuestiones relacionadas