Redis 作 mysql 的缓存服务器及redis的高可用
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的高可用相关推荐
- MySQL与Redis数据库结合——redis作为mysql的缓存服务器,实现读写分离(nginx+php+redis+mysql)
文章目录 一.读写分离的背景 二.搭建nginx+php+redis+mysql 实验环境 实验 1.在server1上安装nginx+php 建立php和redis,mysql的连接 2.在serv ...
- redis作为mysql的缓存服务器(读写分离)
https://www.cnblogs.com/sevenyuan/p/8548664.html https://www.cnblogs.com/henryliublog/p/9170666.html ...
- redis配置mysql缓存_Redis做mysql的缓存服务器
一redis简介:redis 是一个高性能的 key-value 数据库. redis 的出现,很大程度补偿了memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好 ...
- 搭建redis给mysql做缓存
安装redis的前提是lnmp或者lamp的环境已经搭建完成. 安装redis 1.安装redis(或可以选择yum安装) 1 2 3 4 5 6 7 8 9 10 11 12 [root@redis ...
- mysql 5.1.17 redis_redis作为mysql的缓存服务器(读写分离)
一.redis简介 Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记 ...
- Redis集群——利用Gearman在Lnmp架构中做MySQL的缓存服务器
一.概述 Redis的集群主要是使用切片技术来搭建的,简单来说就是把所有KEY分散存放到不同的redis节点上(不要把鸡蛋都放在一个篮子里). 1. 集群基本原理 Redis集群中内置了16384个槽 ...
- 【Redis Cluster集群】redis cluster 多mster写入,读写分离,高可用
4. [Redis Cluster集群]redis cluster 多mster写入,读写分离,高可用 redis cluster,提供了多个master, 分布式存储:数据可以分布式存储到多个mas ...
- MySQL - 高可用性:少宕机即高可用?
MySQL - 高可用性:少宕机即高可用? 原文:MySQL - 高可用性:少宕机即高可用? 我们之前了解了复制.扩展性,接下来就让我们来了解可用性.归根到底,高可用性就意味着 "更少的宕机 ...
- 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) ...
最新文章
- Windows server 2008普通用户不能远程登录问题
- iOS中SQLite持久化存储第三方库FMDB
- python开发的著名软件公司_软件开发公司_软件外包_项目外包平台基于Python开发一个全文检索系统...
- python函数基本概念_python——函数的基本概念
- [js]DOM 篇
- python所有软件-如何在Python中列出所有已安装的软件包及其版本?
- highcharts 时间少8小时问题
- deeplabv3+ 跑 cityscape 数据集
- 手机通过IPV6访问电脑共享文件
- Fiori WebIde开发环境搭建
- 数据分析基础——基本运算
- update语句执行卡死现象原因及解决方案
- BMM 和 FMM 中文分词
- IEEE 754浮点数工业标准
- HTML强制视频倍速,强行网页视频倍速播放
- 计算方法 差商与牛顿插值
- python股票策略_用Python编写简单股票策略
- 中国古代神器 兵器详解
- Tyvj 1041 表达式计算2
- html5摄像头 在线演示,基于HTML5实现的超酷摄像头(HTML5 webcam)摄
热门文章
- 苹果平板id怎么注册_怎么做成苹果笔记?苹果平板怎么做笔记? - 敬业签便签...
- 如今银行多open?百信银行百度云AI+Bank金融科技思享会告诉你!
- python web微信应用(三) 微信智能聊天机器人
- POJ 1111(单身快乐)
- .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
- 台式如何看计算机配置,电脑组装教程:怎么看电脑配置?教你如何查看电脑配置...
- java识别手写文字_神经网络入门 第6章 识别手写字体
- 七段显示器显示整数C语言答案,C语言程序设计试卷(含答案)(7页)-原创力文档...
- 单片机c语言数码管显示循环0到9程序,七段数码管0~9循环显示程序
- Python数据分析示例(2)Day3