Skip to content

Instantly share code, notes, and snippets.

@luc0
Last active January 21, 2025 20:29
Show Gist options
  • Select an option

  • Save luc0/ffadeb660b6fa2a110dfc0f193251edd to your computer and use it in GitHub Desktop.

Select an option

Save luc0/ffadeb660b6fa2a110dfc0f193251edd to your computer and use it in GitHub Desktop.
DB Horizontal Scaling

bibliografia:

Replication

Se hace una replica de la main DB varias veces.

✅ High Availability (ya que esta replicado en varios servidores, por si falla 1)

Tipos:

  1. Lider -> Follower: se guarda solo en la lider, luego se replica en otras. Se lee en cualquiera
image
  1. Lider <-> Lider: se lee y guarda en cualquiera. Aca se generan conflictos y tenes que setear mecanismos para resolverlos.
image
  1. Creo que tambien hay una que es Liderless (dynamoDB) https://youtu.be/bI8Ry6GhMSE?si=ZL68Kau2_Y31lL4X&t=231

Async vs Sync:

Si es asincrona: Puede haber una request a la 1, y esta hace una request a la 2, pero la 1 ya devuelve un resultado. Mientras se procesa la 2. Mientras tanto hay una inconsistencia.

image
  • mejora el read performance y availavility.

mas avanzado: https://www.youtube.com/watch?v=bI8Ry6GhMSE solucionar si un leader se cae, etc. basicamente, tenes 2 db leaders por si una se cae. Porque sino creo que un follower es promocionado a leader cuando uno se cae, y no se si esta bueno.

sharding

Dividir la DB en DB mas pequeñas. (por ej por user_id, como hace Instagram) Se diferencia a particion en que sharding, cada shard es una DB completa.

Una fisical shard (el server donde se alojan), pueden contener varias logica shards (que seria las particiones/data chunks)

image

Tiene una shard key, la cual es la condicion por la que se asigna data a los shards.

image

en sql tenes que implementar la sharding logic por tu cuenta. Asi es la naturaleza de las DB relacionales.

sharding methods

image image image image La ultima "geo sharding" ademas tiene el beneficio que podes situar el server en una zona mas cercana para que tenga menos ping, lo malo es que no tiene una distribucion equitativa de data.

Evitar hotspots (que la data se acumule mas que nada en 1 shard)

Cardinality:

- buena distribucion (buena seleccion shard key)
- pensar en todos los valores posibles = cardinality.

Frequency

- considerar la frecuencia, en base a los valores que mas se van a usar (de la shard key)

monotonic change

- tener en cuenta del rate of change de shard key:
    si dividimos usuarios x cantidad de compras.
    el shard que tenga a los usuarios con mas cantidad de compras, va a seguir acumulando. (por ej si tenemos rows con compras del mes del usuario o algo asi)
    o capaz si tengo un timestamp que acumula un monton, (ej desde el 2024 y no creo mas condiciones)?

sharding vs replication

image

se pueden usar en combinación

Load balancer

"migrate" -> Mueve data de un shard a otro? para mantener el balance de la cantidad de data.

"split" -> divide el key range en 2. (crea 2 shards de uno)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment