Redis 作 mysql 的缓存服务器

1.安装 lnmp 环境,安装以下软件包:
nginx php php-fpm php-cli php-common php-gd php-mbstring php-mysql
php-pdo php-devel mysql mysql-server
http://download.fedoraproject.org/pub/epel/6/
http://mirrors.163.com/centos/6/os/x86_64/
http://nginx.org/packages/centos/6/

2.安装php的redis扩展

https://github.com/owlient/phpredis
[root@server8 redis]# unzip phpredis-master.zip
[root@server8 redis]# cd phpredis-master
[root@server18phpredis-master]# phpize
Configuring for:PHP Api Version:
20090626Zend Module Api No:
20090626Zend Extension Api No:
220090626
[root@server1phpredis-master]#./configure--with-php-config=/usr/bin/php-config
[root@server8 phpredis-master]# make &&make install
[root@server8 phpredis-master]# vim /etc/php.ini
date.timezone = Asia/shanghai     #设置时区
[root@server8 php.d]# cp mysql.ini redis.ini
[root@server8 php.d]# vim redis.ini
extension=redis.so   #加载 redis 模块
[root@server8 php.d]# cd /etc/php-fpm.d/
[root@server8 php-fpm.d]# vim www.conf  #将用户和组改为nginx

[root@server8 php-fpm.d]# /etc/init.d/php-fpm start
[root@server8 php-fpm.d]# vim /etc/nginx/conf.d/default.conf
server {listen       80;server_name  localhost;#charset koi8-r;#access_log  /var/log/nginx/log/host.access.log  main;location / {root   /usr/share/nginx/html;index  index.php index.html index.htm;   #添加index.php}location ~ \.php$ {root           html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;include        fastcgi_params;
}

[root@server8 php-fpm.d]#  /etc/init.d/nginx start
[root@server8 php-fpm.d]# netstat -antlp  ##查看80端口是否打开

4.在server7上配置 mysql
yum install mysql-server -y
root@server7 utils]# /etc/init.d/mysqld restart  #配置后直接启动
# service mysqld start
mysql> grant all on test.* to redis@localhost identified by 'westos';  #创建用户并授权
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

5.创建 php 测试页面
[root@server8 html]# vim test.php
<?php
$redis = new Redis();
$redis->connect('172.25.27.6',6379) or die ("could net connect redis
server");  #ip 为主redis 的ip
$query = "select * from test limit 9";
for ($key = 1; $key < 10; $key++)
{
if (!$redis->get($key))
{
$connect = mysql_connect('172.25.27.7','redis','westos');  #用户和帐号为server7mysql 授权的用户和密码
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>";
}
?>

[root@server7 redis]# vim test.php 

[root@server7 mnt]# mysql < test.sql 

发现rides端信息并没同步过去

在将一删除后在重新查看发现已经发生改变,同时在浏览器查看数据也已发生变化,浏览器查看时,发现再访问一次mysql后,第二次访问的redis时,
数据已经变化

测试结果:到这里,我们已经实现了 redis 作为 mysql 的缓存服务器,但是如果更新了 mysql,redis中仍然会有对应的 KEY,数据就不会更新,此时就会出现
mysql 和 redis 数据不一致的情况。所以接下来就要通过 mysql 触发器将改变的数据同步到 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 数据库的更新
1. 安装 gearman 软件包: (server7 mysql)
gearmand libgearman-devel libgearman libevent libevent-devel
libevent-doc libevent-headers tokyocabinet
# service gearmand start
#启动服务
# netstat -antlp |grep gearmand
tcp
0
0 0.0.0.0:4730
7304/gearmand
0.0.0.0:*
LISTEN
2. 安装 php 的 gearman 扩展 (server8 nginx)
https://pecl.php.net
yum install -y db*-devel
tar zxf gearman-1.1.2.tgz
cd gearman-1.1.2
./configure --with-php-config=/usr/bin/php-config
make && make install
# vim /etc/php.ini
extension=gearman.so
# service php-fpm reload
3. 安装 lib_mysqludf_json (server7 mysql)
lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映
射为 JSON 格式,是通过程序来转换的。
https://github.com/mysqludf/lib_mysqludf_json
# yum install -y mysql-devel
# 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 的模块目录:
mysql> show global variables like 'plugin_dir';
+---------------+-------------------------+
| Variable_name | Value
|
+---------------+-------------------------+
| plugin_dir
| /usr/lib64/mysql/plugin |
+---------------+-------------------------+
拷贝 lib_mysqludf_json.so 模块:
# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
注册 UDF 函数
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
'lib_mysqludf_json.so';
查看函数
mysql> select * from mysql.func;
+--------------------+-----+-------------------------+----------+
| name
| ret | dl
| type
|
+--------------------+-----+-------------------------+----------+
| json_object
| 0 | lib_mysqludf_json.so | function |
+--------------------+-----+-------------------------+----------+
4. 安装 gearman-mysql-udf(server7)
这个插件是用来管理调用 Gearman 的分布式的队列。
https://launchpad.net/gearman-mysql-udf
# tar zxf gearman-mysql-udf-0.6.tar.gz
# cd gearman-mysql-udf-0.6
# ./configure --with-mysql=/usr/bin/mysql_config
--libdir=/usr/lib64/mysql/plugin/
# make# make install
注册 UDF 函数
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME
'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME
'libgearman_mysql_udf.so';
查看函数
mysql> select * from mysql.func;
+--------------------+-----+-------------------------+----------+
| name
| ret | dl
| type
|
+--------------------+-----+-------------------------+----------+
| json_object
|
0 | lib_mysqludf_json.so
| function |
| gman_do_background |
0 | libgearman_mysql_udf.so | function |
| gman_servers_set
|
0 | libgearman_mysql_udf.so | function |
+--------------------+-----+-------------------------+----------+
指定 gearman 的服务信息
mysql> SELECT gman_servers_set('127.0.0.1:4730');
+------------------------------------+
| gman_servers_set('127.0.0.1:4730') |
+------------------------------------+
| 127.0.0.1:4730
|
+------------------------------------+
5. 编写 mysql 触发器(根据实际情况编写)(server7 mysql)
# vim 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 ;
# mysql < test.sql
查看触发器
mysql> SHOW TRIGGERS FROM test;+-------------+--------+-------+-------------------------------------------------
-------+----------------------+--------------------+
| datatoredis | UPDATE | test | BEGIN
SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as
`id`, NEW.name as `name`));
END | AFTER | NULL
|
| root@localhost | latin1
|
latin1_swedish_ci
| latin1_swedish_ci |
+-------------+--------+-------+------------------------------------------------------------------------
-------+----------------------+--------------------+
6. 编写 gearman 的 worker 端(server8)
# vim worker.php
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
$redis = new Redis();
$redis->connect('127.0.0.1', 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); #这条语句就是将 id 作 KEY 和
name 作 VALUE 分开存储,需要和前面写的 php 测试代码的存取一致。
}
?>
后台运行 worker
# nohup php worker.php &
7. 更新 mysql 中的数据
mysql> update test set name='hello' where id=1;查看 redis
# redis-cli
127.0.0.1:6379> get 1
"hello"
刷新测试页面数据同步

redis高可用

[root@server6 redis-4.0.1]# cp sentinel.conf /etc/redis/
[root@server6 redis-4.0.1]#vim /etc/redis/sentinel.conf

[root@server6 redis]# scp sentinel.conf root@172.25.27.7:/etc/redis
[root@server6 redis]# scp sentinel.conf root@172.25.27.8:/etc/redis
#为了防止三个环境不一致,直接将6上配置好的分发给server7 server8
/etc/init.d/redis_6379 restart  #三台机子都重新启动redis程序
[root@server6 redis]# redis-server /etc/redis/sentinel.conf --sentinel #启动sentinel
[root@server7 redis]# redis-server /etc/redis/sentinel.conf --sentinel   #server7 ,serevr8让他在后台运行
此时mymaster 在server6上,且serevr7,server8此时都为从机,且都正常工作中

[root@server8 utils]# redis-cli -h 172.25.27.6 -p 6379 shutdown
当执行命令让serevr6 端口关闭后,此时server7被选为新的mymaster

[root@server6 redis]# /etc/init.d/redis_6379 start   #重新启动serevr6
[root@server7 redis]# redis-cli -h 172.25.27.6 -p 6379 info Replication #查看server6此时的状态

至此,redis的高可用已经实现

Redis 作 mysql 的缓存服务器及redis的高可用相关推荐

  1. MySQL与Redis数据库结合——redis作为mysql的缓存服务器,实现读写分离(nginx+php+redis+mysql)

    文章目录 一.读写分离的背景 二.搭建nginx+php+redis+mysql 实验环境 实验 1.在server1上安装nginx+php 建立php和redis,mysql的连接 2.在serv ...

  2. redis作为mysql的缓存服务器(读写分离)

    https://www.cnblogs.com/sevenyuan/p/8548664.html https://www.cnblogs.com/henryliublog/p/9170666.html ...

  3. redis配置mysql缓存_Redis做mysql的缓存服务器

    一redis简介:redis 是一个高性能的 key-value 数据库. redis 的出现,很大程度补偿了memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好 ...

  4. 搭建redis给mysql做缓存

    安装redis的前提是lnmp或者lamp的环境已经搭建完成. 安装redis 1.安装redis(或可以选择yum安装) 1 2 3 4 5 6 7 8 9 10 11 12 [root@redis ...

  5. mysql 5.1.17 redis_redis作为mysql的缓存服务器(读写分离)

    一.redis简介 Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记 ...

  6. Redis集群——利用Gearman在Lnmp架构中做MySQL的缓存服务器

    一.概述 Redis的集群主要是使用切片技术来搭建的,简单来说就是把所有KEY分散存放到不同的redis节点上(不要把鸡蛋都放在一个篮子里). 1. 集群基本原理 Redis集群中内置了16384个槽 ...

  7. 【Redis Cluster集群】redis cluster 多mster写入,读写分离,高可用

    4. [Redis Cluster集群]redis cluster 多mster写入,读写分离,高可用 redis cluster,提供了多个master, 分布式存储:数据可以分布式存储到多个mas ...

  8. MySQL - 高可用性:少宕机即高可用?

    MySQL - 高可用性:少宕机即高可用? 原文:MySQL - 高可用性:少宕机即高可用? 我们之前了解了复制.扩展性,接下来就让我们来了解可用性.归根到底,高可用性就意味着 "更少的宕机 ...

  9. nginx两台文件服务器集群,keepalived结合nginx状态检测脚本实现对web服务器集群的高可用...

    实验环境 两台CentOS-7.5虚拟机 web1:10.0.11.203 web2:10.0.11.204 VIP :10.0.11.210 web类型:nginx 客户端:自用笔记本(win10) ...

最新文章

  1. Windows server 2008普通用户不能远程登录问题
  2. iOS中SQLite持久化存储第三方库FMDB
  3. python开发的著名软件公司_软件开发公司_软件外包_项目外包平台基于Python开发一个全文检索系统...
  4. python函数基本概念_python——函数的基本概念
  5. [js]DOM 篇
  6. python所有软件-如何在Python中列出所有已安装的软件包及其版本?
  7. highcharts 时间少8小时问题
  8. deeplabv3+ 跑 cityscape 数据集
  9. 手机通过IPV6访问电脑共享文件
  10. Fiori WebIde开发环境搭建
  11. 数据分析基础——基本运算
  12. update语句执行卡死现象原因及解决方案
  13. BMM 和 FMM 中文分词
  14. IEEE 754浮点数工业标准
  15. HTML强制视频倍速,强行网页视频倍速播放
  16. 计算方法 差商与牛顿插值
  17. python股票策略_用Python编写简单股票策略
  18. 中国古代神器 兵器详解
  19. Tyvj 1041 表达式计算2
  20. html5摄像头 在线演示,基于HTML5实现的超酷摄像头(HTML5 webcam)摄

热门文章

  1. 苹果平板id怎么注册_怎么做成苹果笔记?苹果平板怎么做笔记? - 敬业签便签...
  2. 如今银行多open?百信银行百度云AI+Bank金融科技思享会告诉你!
  3. python web微信应用(三) 微信智能聊天机器人
  4. POJ 1111(单身快乐)
  5. .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
  6. 台式如何看计算机配置,电脑组装教程:怎么看电脑配置?教你如何查看电脑配置...
  7. java识别手写文字_神经网络入门 第6章 识别手写字体
  8. 七段显示器显示整数C语言答案,C语言程序设计试卷(含答案)(7页)-原创力文档...
  9. 单片机c语言数码管显示循环0到9程序,七段数码管0~9循环显示程序
  10. Python数据分析示例(2)Day3