php redis realiza el almacenamiento en caché de mysql, cómo sincronizar redis asíncrono con la base de datos mysql
Para datos que cambian muy rápidamente, si aún elige el método de caché estático tradicional (Memocached, sistema de archivos, etc.) para mostrar los datos, puede haber una gran sobrecarga en el acceso a la caché, y no puede satisfacer muy bien las necesidades, y las bases de datos NoSQL basadas en memoria como Redis son muy adecuadas para servir como contenedores de datos en tiempo real.
Sin embargo, a menudo existe una demanda de confiabilidad de los datos. El uso de MySQL como almacenamiento de datos no causará pérdida de datos debido a problemas de memoria. Al mismo tiempo, también puede utilizar las características de las bases de datos relacionales para implementar muchas. funciones.
Por lo tanto, es natural pensar si MySQL se puede utilizar como motor de almacenamiento de datos y Redis como caché. Actualmente no existen soluciones o herramientas particularmente maduras para este requisito, por lo que se utiliza una combinación de Gearman+PHP+MySQL UDF para implementar de forma asíncrona la replicación de datos de MySQL a Redis.
Solución de replicación de datos de MySQL a Redis
Tanto MySQL como Redis tienen su propio mecanismo de sincronización de datos. El modo Maestro/Esclavo de MySQL más utilizado es analizar el lado Maestro en el lado Esclavo. Se implementa mediante binlog. Este tipo de replicación de datos es en realidad un proceso asincrónico, pero cuando todos los servidores están en la misma intranet, el retraso asincrónico es casi insignificante.
En teoría, también puedes utilizar el mismo método para analizar el archivo binlog de MySQL e insertar los datos en Redis. Sin embargo, esto requiere una comprensión muy profunda de los archivos binlog y MySQL. Al mismo tiempo, dado que binlog existe en varias formas, como Declaración/Fila/Nivel mixto, la carga de trabajo de analizar binlog para lograr la sincronización es muy grande.
Así que aquí elegimos una forma más económica de desarrollar: tomamos prestada la UDF de MySQL ya relativamente madura, primero colocamos los datos de MySQL en Gearman y luego sincronizamos los datos a través de un PHP Gearman Worker escrito por nosotros mismos con Redis. En comparación con el método de análisis binlog, agrega muchos procesos, pero el costo de implementación es menor y es más fácil de operar.
Instalación y uso de Gearman
Gearman es un marco de distribución de tareas que admite la distribución distribuida. El diseño es sencillo y tiene un soporte muy amplio. Una aplicación Gearman típica incluye las siguientes partes:
Gearman Job Server: programa principal de Gearman, que debe compilarse, instalarse y ejecutarse en segundo plano como un proceso demonio
Cliente Gearman: puede entenderse como una tarea. Por ejemplo, para realizar una tarea de envío de correos electrónicos en segundo plano, puede llamar a un cliente Gearman en el programa y pasar la información del correo electrónico, y luego los resultados de la ejecución se pueden mostrar al usuario inmediatamente, mientras la tarea en sí se ejecutará lentamente en segundo plano.
Gearman Worker: el verdadero ejecutor de la tarea generalmente necesita escribir una lógica específica por sí mismo y ejecutarla a través de un proceso demonio. Después de que Gearman Worker reciba el contenido de la tarea pasado por el cliente Gearman, lo procesará. en orden.
Ya se ha presentado anteriormente un proyecto similar de procesamiento de tareas en segundo plano, Resque. Los diseños de los dos son en realidad muy parecidos. Una analogía simple puede ser la siguiente:
Gearman Job Server: corresponde a la parte Redis de Resque
Gearman Client: corresponde a la cola. operación de Resque
Gearman Worker: Trabajador y Trabajo correspondientes a Resque
La razón por la que se elige Gearman en lugar de Resque es porque Gearman proporciona una UDF MySQL relativamente fácil de usar y tiene una carga de trabajo menor.
Instalar Gearman y la extensión PHP Gearman
A continuación se utiliza Ubuntu 12.04 como ejemplo.
apt-get install gearman gearman-server libgearman-dev
Comprueba el estado de ejecución de Gearman:
/etc/init.d/gearman-job- estado del servidor
* Gearmand se está ejecutando
Indica que Gearman se ha instalado correctamente.
La extensión Gearman de PHP se puede instalar directamente a través de pecl
pecl install gearman
echo "extension=gearman.so">/etc/php5/conf.d /gearman.ini
reinicio del servicio php5-fpm
Sin embargo, las pruebas reales encontraron que la versión de Gearman instalada de forma predeterminada en Ubuntu es demasiado baja y ejecutar pecl install gearman directamente informará un error. error
configure: error: se requiere libgearman versión 1.1.0 o posterior
Por lo tanto, se recomienda instalar la extensión Gearman + PHP mediante compilación. Para una explicación simple, elija. para instalar la extensión de la versión anterior:
pecl install gearman- 1.0.3
Ejemplo de Gearman + PHP
Para facilitar la comprensión del proceso operativo de Gearman en el siguiente artículo, también podríamos explicarlo desde el ejemplo más simple de Gearman, como el procesamiento de un archivo. Para operar, primero escriba un Cliente Gearman y asígnele el nombre client.php:
$client =newGearmanClient();
$client-> addServer();
$client->doBackground('writeLog','Registrar contenido') ;
echo 'El archivo ha sido operado en segundo plano';
Ejecutar este archivo equivale a simular que un usuario solicita una página web y devolverle la información de finalización del procesamiento:
php client.php
Comprueba el estado de Gearman:
(estado de eco; suspensión 0.1)| >Puedes ver que el resultado es
writeLog 100.
La descripción ya está en Gearman. Se crea una tarea llamada writeLog y hay 1 tarea esperando en la cola.
Las cuatro columnas de arriba representan el estado de ejecución actual de Gearman:
Nombre de la tarea
Tareas en la cola de espera
Tareas en ejecución
Ejecución de procesos de Worker
Puedes usar watch para monitoreo en tiempo real:
watch -n 1"(estado de eco; suspensión 0.1) | nc 127.0.0.1 4730"
Entonces necesitamos escribir un Gearman Worker llamado trabajador.php:
$worker =newGearmanWorker();
$worker->addServer();
$worker->addFunction('writeLog','writeLog'); while($worker->work());función writeLog ($trabajo) {
$log = $job->workload();file_put_contents(__DIR__ .'/gearman.log', $log ."\n", FILE_APPEND | LOCK_EX);} p>
Worker usa un bucle while infinito para implementar el proceso del demonio. Ejecute
php work.php
y podrá ver que el estado de Gearman cambia a:
. writeLog 001
También verifique gearman.log en el mismo directorio. El contenido debe ser el valor Registrar contenido pasado desde el Cliente.
Sincronizar datos con Gearman a través de MySQL UDF + Trigger
La mejor manera para que MySQL logre interoperabilidad con programas externos es a través de MySQL UDF (funciones definidas por el usuario de MySQL). Para permitir que MySQL pase datos a Gearman, se utiliza una combinación de lib_mysqludf_json y gearman-mysql-udf.
Instalar lib_mysqludf_json
La razón para usar lib_mysqludf_json es porque Gearman solo acepta cadenas como parámetros de entrada, y puedes usar lib_mysqludf_json para codificar datos en MySQL en cadenas JSON
apt-get install libmysqlclient-dev
wget /mysqludf/lib_mysqludf_json/archive/master.zip
descomprimir master.zip
cd lib_mysqludf_json-master/
rm lib_mysqludf_json.so
gcc $(mysql_config --cflags)-shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
Puedes ver la recompilación generada lib_mysqludf_json.so, debe verificar la ruta de instalación del complemento MySQL:
mysql -u root -pPASSWORD --execute="mostrar variables como '%plugin%';"+---- - -+---------------------+|Nombre_variable|Valor|+-------- -- -----+------------------------+| plugin_dir |/usr/lib/mysql/plugin/|+--- -- -+------------------------+
Luego lib_mysqludf_json.so Copia el archivo a la ubicación correspondiente:
cp lib_mysqludf_json.so /usr/lib/mysql/plugin/
Finalmente inicie sesión en MySQL para ejecutar la declaración para registrar la función UDF:
CREAR FUNCIÓN json_object DEVUELVE CADENA SONAME 'lib_mysqludf_json.so';
Instalar gearman-mysql-udf
El método es casi el mismo:
apt-get install libgearman-dev
wget /gearman-mysql- udf/trunk/0.6/+download/gearman- mysql-udf-0.6.tar.gz
tar -xzf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6./configure --with-mysql=/usr/bin/mysql_config?
- libdir=/usr/lib/mysql /plugin/
make && make install
Inicie sesión en MySQL para ejecutar la declaración para registrar la función UDF:
CREAR FUNCIÓN gman_do_background DEVUELVE CADENA SONAME 'libgearman_mysql_udf.so'; p>
CREAR FUNCIÓN gman_servers_set DEVUELVE CADENA SONAME 'libgearman_mysql_udf.so';
Finalmente especifique Gearman
Información del servidor:
SELECT gman_servers_set('127.0.0.1:4730');
Sincronización de datos mediante activadores MySQL
¿Qué datos se sincronizarán al final? Las condiciones aún deben determinarse en función de la situación real. Por ejemplo, si los datos de la tabla de datos se sincronizan cada vez que se actualiza, escriba el activador de la siguiente manera:
DELIMITER $$<. /p>
CREAR DISPARADOR datatoredis DESPUÉS DE ACTUALIZAR LOS datos
PARA EL COMIENZO DE CADA FILA
SET @ret=gman_do_background('syncToRedis', json_object(NEW.id as`id` , NEW.volume as`volume`)) ;END$$
DELIMITER ;
Intenta actualizar un dato en la base de datos para ver si Gearman surte efecto.
Gearman PHP Worker copia asincrónicamente datos de MySQL a Redis
Como solución popular de almacenamiento en caché NoSQL, Redis no necesita presentación y su instalación y uso también son muy simples:
apt-get install redis-server
pecl install redis
echo "extension=redis.so">/etc/php5/conf.d/redis.ini
Luego escribe un Gearman Worker: redis_worker.php
#!/usr/bin/env php
$worker =newGearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis','syncToRedis');
$redis =newRedis();
p>$redis->connect('127.0.0.1',6379); while($worker->work());función syncToRedis($job){global $redis;
$ workString = $trabajo->carga de trabajo();
$trabajo = json_decode($workString);if(!isset($trabajo->id)){returnfalse;}
$ redis->set($work->id, $workString);}
Finalmente, necesitas ejecutar el Worker en segundo plano:
nohup php redis_worker.php & p>
Copiar datos de MySQL a Redis de esta manera ha sido probado y básicamente se puede hacer instantáneamente con un solo trabajador.