在上一篇文章当中,我们实现了简单的读写分离。赋链接:MySQL与Redis数据库结合——redis作为mysql的缓存服务器,实现读写分离(nginx+php+redis+mysql)
本实验是在上一个实验的基础上实现的
客户端读的时候去找redis缓存;客户端写的时候去找mysql
但是存在一个问题
:当mysql数据库中的数据有所变化的时候,redis缓存并不能实时同步
接下来我将配置gearmand服务实现redis缓存自动同步mysql数据更新,原理如下
Gearman是一套用来把程式需求委派给机器,提供通用的程序框架来将任务分发在机器运算。
gearman 提供了一个 work 传递其他机器,或者调用其他机器功能的框架,通过 gearman 你可以实现并行的工作,负载均衡处理,调用其他语言的函数。它可以应用在多种场合,从高可用性的 web 服务到数据库复制,换句话说,它是分布式处理的中枢神经。gearman 这一框架只负责分发要做的工作,本身并不做任何实际的工作
。
在server1上:
启动gearmand服务
systemctl start gearmand
在server3上:
步骤一:下载lib_mysqludf_json-master.zip并解压
unzip lib_mysqludf_json-master.zip
yum install -y mariadb-devel.x86_64
yum install -y gcc
cd lib_mysqludf_json-master
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
cp lib_mysqludf_json-master/lib_mysqludf_json.so /usr/lib64/mysql/plugin/
步骤六:登陆数据库,查看插件目录
mysql -uroot -pwestos
MariaDB [(none)]> show global variables like 'plugin_dir';
MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-*
tar zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --libdir=/usr/lib64/mysql/plugin/ --with-mysql
make && make install
MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
MariaDB [(none)]> select * from mysql.func;
MariaDB [(none)]> SELECT gman_servers_set('172.25.1.1:4730');
use test;
##注释掉创建表的两行
#CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');
DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
END$$
DELIMITER ;
mysql -pwestos < test.sql
步骤十七:查看触发器
MariaDB [(none)]> SHOW TRIGGERS FROM test;
在server1上:
编写gman的worker端
步骤一:编写worker.php脚本,并放到/usr/local目录下,
cp worker.php /usr/local/
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
$redis = new Redis();
$redis->connect('172.25.1.2', 6379);
while($worker->work());
function syncToRedis($job)
{
global $redis;
$workString = $job->workload();
$work = json_decode($workString);
if(!isset($work->id)){
return false;
}
$redis->set($work->id, $work->name);
}
?>
步骤二:后台运行worker
nohup php /usr/local/worker.php &> /dev/null &
在server3上:
修改数据库内容
MariaDB [test]> update test set name='westos' where id=2;
127.0.0.1:6379> get 2
"westos"