文章目录
实验环境:
server1:192.168.43.10,配置nginx作为访问入口
server2:192.168.43.20,配置redis缓存数据
server3:192.168.43.30,配置mysql真实存储数据
1.Redis+MySQL实现缓存数据
1.1配置nginx及php
在server1配置nginx和php
1 安装nginx
tar zxf nginx-1.18.0.tar.gz
解压包
yum install -y pcre-devel zlib-devel
解决依赖性
vim nginx-1.18.0/auto/cc/gcc
#CFLAGS="$CFLAGS -g" 关闭debug
./configure --prefix=/usr/local/nginx
预编译
make && make install
安装
2 配置nginx
vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
/usr/local/nginx/sbin/nginx -t
语法检测
/usr/local/nginx/sbin/nginx
启动nginx
3 安装php及配置php测试页面
systemctl restart php-fpm.service
vim /usr/local/nginx/html/index.php
配置php测试页面
<?php
$redis = new Redis();
$redis->connect('192.168.43.20',6379) or die ("could net connect redis server");
# $query = "select * from test limit 9";
$query = "select * from test";
for ($key = 1; $key < 10; $key++)
{
if (!$redis->get($key))
{
$connect = mysql_connect('192.168.43.30','redis','My12345.');
mysql_select_db(test);
$result = mysql_query($query);
//如果没有找到$key,就将该查询sql的结果缓存到redis
while ($row = mysql_fetch_assoc($result))
{
$redis->set($row['id'],$row['name']);
}
$myserver = 'mysql';
break;
}
else
{
$myserver = "redis";
$data[$key] = $redis->get($key);
}
}
echo $myserver;
echo "<br>";
for ($key = 1; $key < 10; $key++)
{
echo "number is <b><font color=#FF0000>$key</font></b>";
echo "<br>";
echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
echo "<br>";
}
?>
1.2 配置redis
安装过程可参考 link.
纯净环境
1.3 配置MySQL
yum install -y mariadb-server
systemctl start mariadb.service
启动mysql
mysql_secure_installation
进行安全初始化
mysql -uroot -p
MariaDB [(none)]> create database test;
MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'My12345.';
MariaDB [(none)]> flush privileges;
1.4 测试
在MySQL中插入数据
MariaDB [(none)]> use test;
MariaDB [test]> CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MariaDB [test]> INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');
2.Gearman实现同步更新数据
2.1 Gearman的介绍
Gearman提供了一个通用的应用程序框架,可以将工作分配到更适合执行该工作的其他机器或进程。它允许并行执行工作,进行负载平衡处理以及在语言之间调用函数。它可用于各种应用程序,从高可用性网站到数据库复制事件的传输。Gearman是分布式处理如何通信的神经系统。
Gearman驱动的应用程序由三部分组成:客户端,worker和作业服务器。客户端负责创建要运行的作业,并将其发送到作业服务器。作业服务器将找到可以运行该作业并转发作业的合适工人。worker执行客户端请求的工作,并通过作业服务器将响应发送给客户端。 Gearman提供了客户端和辅助API,您的应用程序可以调用它们来与Gearman作业服务器(也称为gearmand)进行通信,因此无需处理网络或作业映射。在内部,Gearman客户端和辅助API使用TCP套接字与作业服务器通信。
实验环境: 接上面的环境,server1作为job服务器,用来分发任务,在server3充当客户端。
同步mysql的数据,使用到了gearmand服务的udf方式。
1.在server1(job服务器)配置gearmand
yum install -y gearmand-1.1.12-18.el7.x86_64.rpm
2.在server3配置udf与gearman客户端
yum install -y mariadb-devel.x86_64 gcc
安装插件支持udf及编译工具
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
编译用户自定义函数
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
拷贝到数据库的默认插件目录中
mysql -uroot -pMy12345.
注册 udf函数,我们创建一个json对象,把数据全部映射为json格式,因为json格式可读性强。
MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
在server3配置gearman的库文件和依赖性
yum install libgearman-1.1.12-18.el7.x86_64.rpm libgearman-devel-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm -y
在server3配置gearman的用户端
tar zxf gearman-mysql-udf-0.6.tar.gz
解压
./configure --libdir=/usr/lib64/mysql/plugin --with-mysql
预编译
make && make install
编译安装
注册udf函数插件及指定gearman服务器
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('192.168.43.10:4730');
定义触发器
vim test.sql
mysql -pMy12345. < test.sql
use test;
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 ;
在server1中运行worker进程同步数据
vim /usr/local/worker.php
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
$redis = new Redis();
$redis->connect('192.168.43.20', 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);
}
?>
3.测试
数据处理流程:
mysql的变更触发了触发器 trigger ,然后 json_map插件将变更的数据格式化为json格式便于处理,然后找到 mysql 的 gearman 和 udf 的插件 ,然后找到 gearman(job-server / server1)。 jojb-server 将任务分发给 worker。worker 与 php-gearman 和 php-redis 通信,将数据同步到server2上的 redis,redis 再发送到客户端,同时同步到本地缓存。