一、redis缓存服务器
二、redis作mysql的缓存服务器
实验准备:
server1——php
server2——redis(r)
server3——mariadb(w)
软件安装:
redis的安装参考redis相关文章,mariadb数据库,不用做安全初始化,需要用其中的test测试库进行实验
#server1
yum install -y httpd php php-mysql
yum install php-devel-5.4.16-42.el7.x86_64.rpm
#server2
redis-5.0.3.tar.gz
#server3
yum install -y mariadb-server
(一)server1中操作(php)
1. 在默认发布目录下编写php测试页
mv test.php /var/www/html
vim test.php
$redis->connect('172.25.5.2',6379) or die ("could net connect redis server");
$connect = mysql_connect('172.25.5.3','redis','westos');
systemctl start httpd
2. 安装php的redis扩展
php -m | grep mysql
php -m | grep redis
unzip phpredis-master.zip
cd phpredis-master
phpize
./configure --enable-redis
make && make install
#在/usr/lib64/php/modules/该目录下,可以查看是否有redis.so模块是否添加
cd /etc/php.d/
vim /etc/php.ini
date.timezone = Asia/Shanghai #设置时区(php的要求)
cp mysql.ini redis.ini
vim redis.ini
extension=redis.so #添加redis模块
systemctl restart httpd
安装php软件后,可以过滤出相应的数据库模块,此外我们还需要扩展redis模块
解压源码包,并进行安装,用来提供redis模块
编辑ini文件,用来加载redis模板
(二)server2中操作(redis)
由于server2中之前做过redis实验,这里就不再次搭建了
vim /etc/redis/6379.conf#删除主从复制行
systemctl start redis_6379
redis-cli info#查看server2是否是master
(三)server3中操作(mysql)
导入数据到测试库中,注意安装好mariadb-server后,不用做安全初始化,直接通过【mysql】命令,进入数据库,并对redis用户授权。
systemctl start mariadb
mysql < test.sql
mysql
use test;
show tables;
select * from test;
grant all on test.* to redis@'%' identified by 'westos';
systemctl restart mariadb
(四)测试
浏览器中访问http://172.25.5.1/test.php,虽然我们可以通过redis读取server3中mysql的数据,但是mysql更新数据,redis是很难自动更新的,只有删除更新的值,它才会主动的从数据库中取数据
在server3的数据库中更新数据,观察网页及server2中该数据是否更新
update test set name='westos' where id=1; #更新数据库
redis-cli get 1 #server2中查看redis的缓存
server3中的mysql数据更新后,查看redis端,数据并没有更新,删除数据后,需要访问server1中的php页面,使redis主动从redis上取数据进行更新。
三、gearman实现数据同步
Gearman 是一个支持分布式的任务分发框架
Gearman Job Server:Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。
大致流程:下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后在通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。
(一)server1中
1. 在server1中安装gearman软件包
yum install gearmand-1.1.12-18.el7.x86_64.rpm libgearman-* libevent-devel-2.0.21-4.el7.x86_64.rpm
systemctl start gearmand
netstat -antlp
vim worker.php
$redis->connect('172.25.5.2', 6379);
mv worker.php /usr/local
安装gearman相关软件
2. 安装php的gearman扩展
tar zxf gearman-1.1.2.tgz
cd gearman-1.1.2
phpize
./configure --with-gearman
make && make install
在/usr/lib64/php/modules/目录下查看是否有gearman.so模块出现
cd /etc/php.d
cp redis.ini gearman.ini
vim gearman.ini
extension=gearman.so
systemctl restart httpd
php -m | grep gearman
编译安装gearman
复制ini配置文件,用来加载gearman模块
(二)server3中
1. 编写test.sql文件
vim test.sql
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 ;
yum install -y unzip gcc mysql-devel
2. 安装lib_mysqludf_json
lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映射为 JSON 格式,是通过程序来转换的。
unzip lib_mysqludf_json-master.zip
cd lib_mysqludf_json-master/
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
mysql
show global variables like 'plugin_dir'; #查看mysql的模块目录
cd /usr/lib64/mysql/plugin/
cp ~/lib_mysqludf_json-master/lib_mysqludf_json.so . #拷贝lib_mysqludf_json.so模块
mysql
CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; #注册UDF函数
select * from mysql.func; #查看UDF函数
3. 安装gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列
tar zxf gearman-mysql-udf-0.6.tar.gz
yum install -y libgearman-devel-1.1.12-18.el7.x86_64.rpm libgearman-* libevent-devel-2.0.21-4.el7.x86_64.rpm
cd gearman-mysql-udf-0.6
./configure --with-mysql --libdir=/usr/lib64/mysql/plugin/
make && make install
mysql
CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'; #注册UDF函数
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
select * from mysql.func; #查看函数
SELECT gman_servers_set('172.25.5.1:4730'); #指定gearman的服务信息
mysql < test.sql #导入json相关信息
SHOW TRIGGERS FROM test; #查看触发器信息
(三)测试
1. 在server1中运行worker.php
nohup php /usr/local/worker.php &
2. server3中更新数据库数据
update test set name='redhat' where id=5;
3. 浏览器中访问,观察是否自动更新
4. server2中读取数据