Red de conocimiento informático - Material del sitio web - Cómo utilizar zookeeper para reiniciar el programa

Cómo utilizar zookeeper para reiniciar el programa

Apache Zookeeper es la tecnología más interesante que he encontrado recientemente. La descubrí mientras investigaba las funciones de la nube de Solr. Simplemente abre una nueva instancia y aparecerá automáticamente en Solr Cloud. Se asigna a sí mismo a un fragmento y determina si es el líder (fuente) o una réplica. Pronto podrás consultarlo en tu servidor. Sigue funcionando incluso si algunos servidores caen. Muy dinámico, inteligente y genial.

Ejecutar múltiples aplicaciones como un programa lógico no es nada nuevo. De hecho, escribí un software similar hace unos años. La arquitectura de aquella época era bastante confusa y muy laboriosa de utilizar. Por lo tanto, Apache Zookeeper proporciona un conjunto de herramientas para administrar dicho software.

¿Por qué se llama Zoológico? "Porque el sistema distribuido a coordinar es un zoológico".

En este artículo, explicaré cómo instalar e integrar Apache ZooKeeper usando PHP. Usaremos un servicio para coordinar los distintos scripts PHP y hacer que se pongan de acuerdo sobre qué script se convierte en líder (de ahí el nombre de elección de líder).

ZooKeeper es un servicio neutral que se utiliza para gestionar información de configuración, denominación, proporcionar sincronización distribuida y servicios de composición.

Todos estos tipos de servicios se utilizarán en aplicaciones distribuidas. Escribir estos servicios implica mucha corrección de errores y competencia en todo momento. Debido a la dificultad de escribir estos servicios, a menudo se ignoran, lo que dificulta la gestión de la aplicación a medida que cambia. Incluso cuando se hace correctamente, las diferentes implementaciones de estos servicios pueden dificultar la gestión de la implementación de una aplicación.

Aunque ZooKeeper es una aplicación Java, también se puede utilizar el lenguaje C. Existe una extensión PHP creada y mantenida por Andrei Zmievski en 2009. Puede descargarlo desde PECL u obtener PHP-ZooKeeper directamente desde GitHub.

Para utilizar esta extensión, primero necesitas instalar ZooKeeper.

$ tar zxfv zookeeper-3.4.5.tar.gz

$ cd zookeeper-3.4.5/src/c

$ ./configure -- prefix=/usr/

$ make

$ sudo make install

Esto instalará la biblioteca ZooKeeper y los archivos de encabezado. Ahora estás listo para compilar la extensión PHP.

$ cd$ git clone /andreiz/php-zookeeper.git

$ cd php-zookeeper

$ phpize

$ . /configure

$ make

$ sudo make install

Agregue "zookeeper.so" a la configuración de PHP.

$ vim /etc/php5/cli/conf.d/20-zookeeper.ini

Como no necesito ejecutar en un entorno de servicio de red, solo edité el Configuración CLI aquí. Copie las siguientes líneas en el archivo ini.

extension=zookeeper.so

Utilice el siguiente comando para determinar si la extensión es válida.

$ php -m | grep zookeeper

zookeeper

Ahora es el momento de ejecutar ZooKeeper.

Lo único que no he hecho todavía es la configuración. Cree un directorio para todos los datos del servicio.

$ mkdir /home/tu-cuenta/zoo

$ cd$ cd zookeeper-3.4.5/

$ cp conf/zoo_sample.cfg conf/ zoo.cfg

$ vim conf/zoo.cfg

Busque la propiedad denominada "dataDir" y apúntela al directorio "/home/you-account/zoo".

$ bin/zkServer.sh start

$ bin/zkCli.sh -server 127.0.0.1:2181[zk: 127.0.0.1:2181(CONECTADO) 14] crear /prueba 1

Creado/test[zk: 127.0.0.1:2181(CONNECTED) 19] ls /[test, zookeeper]

En este punto, se ha conectado exitosamente a ZooKeeper y ha creado a Un znode llamado "/test" (lo usaremos más adelante). ZooKeeper almacena datos en una estructura de árbol. Esto es muy similar a un sistema de archivos y una "carpeta" es muy similar a un archivo. Un znode es la entidad donde ZooKeeper almacena datos. Abra una nueva ventana y cree un archivo zookeeperdemo1.php.

lt;?php

clase ZookeeperDemo extiende Zookeeper {

observador de funciones públicas( $i, $tipo, $clave ) {

echo "Insider Watcher\n" ;

//El monitor se consumirá, por lo que necesitamos configurar un nuevo monitor

$this-gt; ', array($this, 'observador' ));

}

}

$zoo = new ZookeeperDemo('127.0.0.1:2181') ; $zoo-gt; get( '/prueba', matriz($zoo, 'observador' ) );

mientras( verdadero ) {

echo '.' p>

sleep(2);}

Ahora ejecute el script.

$ php zookeeperdemo1.php

Esto debería generar un punto cada 2 segundos. Ahora cambie al cliente ZooKeeper y actualice el valor "/test".

[zk:127.0.0.1:2181(CONNECTED) 20] set /test foo

Esto activará silenciosamente el mensaje "Insider Watcher" en el script PHP. ¿Cómo sucedió esto?

ZooKeeper proporciona monitores que se pueden vincular a znodes. Si el monitor detecta un cambio de znode, el servicio notifica inmediatamente a todos los clientes relevantes. El segundo parámetro del método Zookeeper::get es la función de devolución de llamada. Cuando se activa el evento, el monitor se consumirá, por lo que debemos configurar el monitor nuevamente en la función de devolución de llamada.

Ahora estás listo para crear tu aplicación distribuida.

Un desafío es dejar que estos programas independientes decidan qué programa (es decir, el líder) coordina su trabajo y qué programa (es decir, el trabajador) necesita ejecutar. Este proceso se denomina elección de líder y puede verlo implementado en Recetas y soluciones de ZooKeeper.

En resumen, cada proceso (o servidor) vigila a sus procesos vecinos. Si un proceso monitoreado (es decir, el líder) sale o falla, el programa de vigilancia buscará su proceso adyacente (y más antiguo) como líder.

En aplicaciones reales, Leader asignará tareas a los trabajadores, supervisará el proceso y guardará los resultados. Aquí, me salto estas partes en aras de la simplicidad.

Cree un archivo llamado trabajador.php.

lt;?php

clase Trabajador extiende Zookeeper {

const CONTAINER = '/ cluster';

protected $acl = array(

array(

'perms' =gt; Zookeeper::PERM_ALL,

'esquema' =gt; 'mundo',

'id' =gt; 'cualquiera' );

privado $isLeader = false;

privado $ znode;

función pública __construct( $host = '', $watcher_cb = null, $recv_timeout = 10000) {

arent::__construct( $host, $watcher_cb, $recv_timeout );

}

registro de función pública() {

if( !$this-gt; existe( self::CONTENEDOR ) ){

$this-gt;create(self::CONTENEDOR, null, $this-gt;acl);

}

$this-gt;znode = $this -gt;create(self::CONTENEDOR.'/w-',

null,

$this-gt;acl,

Zookeeper::EFÍMERO | Zookeeper::SEQUENCE);

$this-gt;znode = str_replace(self:. CONTAINER .'/', '', $this-gt;znode);

printf( "Estoy registrado como: s\n", $this-gt; znode);

$watching = $this-gt; watchPrevious(); $ mirando == $this-gt; znode ) {

printf( "No hay nadie aquí, soy el líder\n"

$this-gt; }

else {

printf( "Estoy viendo s\n", $viendo

}

); }

función pública watchPrevious() {

$trabajadores = $this-gt; getChildren( self: .CONTAINER );

$tamaño = tamañode( $trabajadores ;

para( $i = 0 ; $i lt; $tamaño ; $i ) {

if( $this-gt;znode == $trabajo

rs[ $i ] ) {

if( $i gt; 0 ) {

$this-gt; get( self:: CONTENEDOR .'/' . $trabajadores[ $ i - 1 ], matriz( $this, 'watchNode' )

return $trabajadores[ $i - 1 ]

}

return $ trabajadores[ $i ];

}

}

}

}

lanza una nueva excepción (sprintf ( "¡Algo salió muy mal! No pude encontrarme: s/s",

self::CONTAINER,

$this-gt;znode) );

}

función pública watchNode( $i, $tipo, $nombre ) {

$observando = $this-gt;

if( $observando == $this-gt; znode ) {

printf( "¡Soy el nuevo líder!\n" );

$this-gt; setLeader( true );

}

else {

printf( "Ahora estoy viendo s\n", $ viendo }

}

función pública isLeader() {

return $this-gt;isLeader;

}

función pública setLeader($bandera) {

$this-gt; isLeader = $bandera

}

función pública ejecutar() {

$this-gt; registrarse();

mientras( verdadero ) {

if( $this-gt; isLeader() ){

$this-gt;doLeaderJob();

}

else {

$this-gt;doWorkerJob();

}

dormir( 2 );

}

}

función pública doLeaderJob() {

echo "Leading\n";

}

función pública doWorkerJob() {

echo "Trabajando\n"

;

}

}

$trabajador = nuevo trabajador( '127.0.0.1:2181' ); $trabajador-gt; Abra al menos 3 terminales y ejecute el siguiente script en cada terminal:

# term1

$ php trabajador.php

Estoy registrado como: w- 0000000001Nadie aquí

, soy el líder

Líder

# term2

$ php trabajador.php

Estoy registrado como: w- 0000000002Estoy viendo w-0000000001

Trabajando

# term3

$ php trabajador.php

Estoy registrado como: w -0000000003Estoy viendo w-0000000002

Trabajando

Ahora simule un bloqueo de Leader. Utilice Ctrl c u otros métodos para salir del primer script. Inicialmente nada cambiará y el Trabajador podrá seguir trabajando. Más tarde, ZooKeeper notará el tiempo de espera y elegirá un nuevo líder.

Aunque estos scripts son fáciles de entender, es necesario comentar las opciones de Zookeeper que se utilizan.

$this-gt;znode = $this-gt;create(self::CONTAINER.'/w-', null, $this-gt;acl, Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );

Cada znode es EFÍMERO y SECUENCIA.

EPHEMRAL significa eliminar el znode cuando el cliente pierde la conexión, razón por la cual el script PHP conoce el tiempo de espera. SECUENCIA significa agregar un identificador de secuencia después de cada nombre de znode. Usamos estos identificadores únicos para etiquetar a los trabajadores.

Hay algunas cuestiones a las que se debe prestar atención en la parte de PHP. La extensión aún está en versión beta, por lo que es propensa a fallas de segmentación si se usa incorrectamente; por ejemplo, no puede pasar una función normal como devolución de llamada, debe pasar un método. Espero que más miembros de la comunidad PHP vean los beneficios de Apache ZooKeeper y que la extensión obtenga más soporte.

ZooKeeper es un potente software con una API limpia y concisa que facilita a cualquiera escribir software distribuido gracias a su excelente documentación y ejemplos. Empecemos, esto va a ser divertido.