Versión corta¿Buscar en fragmentos?
Si se separaron mis usuarios en fragmentos, ¿cómo puedo ofrecer una "búsqueda de usuario"? Obviamente, no quiero que todas las búsquedas lleguen a todos los fragmentos.
versión larga
Por fragmento, quiero decir tiene múltiples bases de datos, donde cada uno contiene una fracción de los datos totales. Para un ejemplo (ingenuo), las bases de datos UserA, UserB, etc. pueden contener usuarios cuyos nombres comiencen con "A", "B", etc. Cuando un nuevo usuario se registra, simplemente examino su nombre y lo coloco en el correcto base de datos. Cuando un usuario que regresa inicia sesión, vuelvo a mirar su nombre para determinar la base de datos correcta de donde extraerá su información.
La ventaja de sharding vs read replication es que la replicación de lectura no escala sus escrituras. Todas las escrituras que van al maestro tienen que ir a cada esclavo. En cierto sentido, todos llevan la misma carga de escritura, a pesar de que la carga de lectura se distribuye.
Mientras tanto, a los fragmentos no les importan las escrituras de los demás. Si Brian se registra en el fragmento de UserB, el fragmento de UserA no necesita saber al respecto. Si Brian envía un mensaje a Alex, puedo registrar ese hecho en los fragmentos UserA y UserB. De esta forma, cuando Alex o Brian inician sesión, puede recuperar todos sus mensajes enviados y recibidos desde su propio fragmento sin consultar todos los fragmentos.
Hasta ahora, todo bien. ¿Qué hay de las búsquedas? En este ejemplo, si Brian busca "Alex", puedo marcar UserA. Pero, ¿y si busca a Alex por su apellido, "Smith"? Hay Smith en todos los fragmentos. Desde aquí, veo dos opciones:
- Haga que la aplicación busque Smiths en cada fragmento. Esto se puede hacer lentamente (consultar cada fragmento en sucesión) o rápidamente (consultar cada fragmento en paralelo), pero de cualquier forma, cada fragmento debe estar involucrado en cada búsqueda. De la misma manera que la replicación de lectura no escala las escrituras, hacer que las búsquedas accedan a cada fragmento no escala sus búsquedas. Puede llegar a un momento en que el volumen de búsqueda sea lo suficientemente alto como para abrumar a cada fragmento, y agregar fragmentos no lo ayuda, ya que todos obtienen el mismo volumen.
- Algún tipo de indización que en sí es tolerante a la fragmentación. Por ejemplo, digamos que tengo un número constante de campos por los cuales quiero buscar: nombre y apellido. Además de UserA, UserB, etc. También tengo IndexA, IndexB, etc. Cuando un nuevo usuario se registra, lo adjunto a cada índice en el que quiero que se encuentre. Así que puse a Alex Smith en IndexA e IndexS, y se lo puede encontrar en "Alex" o "Smith", pero no en las subcadenas. De esta forma, no necesita consultar cada fragmento, por lo que la búsqueda puede ser escalable.
Entonces, ¿se puede escalar la búsqueda? Si es así, ¿este enfoque de indexación es el correcto? Hay alguna otra?
Gracias. De hecho, he leído ese sitio extensivamente. Intenté aclarar mi pregunta anterior; lo cual, con suerte, va más allá del artículo que vinculaste de manera útil. –