Skip to content

Escalabilidad horizontal

exos edited this page Jun 12, 2012 · 2 revisions

HybridCache soporta escalabilidad del tipo horizontal, gracias a la abstraccion de los storages medias. Se puede agregar tantos storages medias como uno quiera, e HybridCache se encargara de balancear el uso.

Escalabilidad Horizontal vs Vertical

Cuando hablamos de escalabilidad, normalmente nos referimos a la vertical, que es escalar hacia arriba, osea escalar un nodo en particular levantando mas procesos, memoria, subnodos, etc. Esto está limitado por el servicio en si, y no todos soportan escalabilidad vertical, como es el caso de memcache.

Ahora cuando hablamos de escalabilidad horizontal, no vamos hacia arriba, sino hacia los costados, y es que ya no depende del servicio en sí, sino que lo manejamos nosotros, pudiendo balancear entre varios nodos.

Balanceo de storages medias

Al contar con un array de storages medias, a la hora de utilizar alguno, HybridCache puede utilizar 2 formas de decidir cual, una es simplemente al azar (util para Replicacion) y generando codigos hash de los identificadores o internamente keys de la data cacheada, se puede ver mas en metodos de balanceo.

Para escalar vamos a usar el modo por hash, que igual es el default.

Escalando entre varios nodos

Vamos a poner un escenario de ejemplo, y es poniendo varios servidores Memcached, de esta forma podemos ir incorporando nodos al array al tiempo que lo vallamos necesitando. Un buen esquema puede ser:

Escalando memcache

Para implementar esto, primero tenemos que trabajar con el metodo de balanceo por hash, este viene por defecto pero puede ser seteado a mano para garantizar funcionamiento con versiones futuras o distintas configuraciones en el mismo script:

<?php

// Metodo por define
define('CACHE_BALANCE_METHOD',Cache::B_HASH);
 
// o tambien en cada instancia
$cache->balanceMethod = Cache::B_HASH;

Luego simplemente podemos agregar los storages medias:

<?php
use Hybrid\Storages\Memcache as MemcacheStorage;
 
Cache::addStorageMedia( new MemcacheStorage('10.1.30.1') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.2') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.3') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.4') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.5') );

De esa forma, cada vez que se requiera un recurso de cache, se leera y grabara en uno de los nodos del array.

Modificando el array

Es obvio que si cambiamos el orden del array o lo modificamos cambiara el modo en que balancee los valores, asi que si metemos otro nodo o simplemente modificamos el array, podemos esperar a que la vieja cache caduque o simplemente reiniciar los servicios.