mysqlredis 集群 读写分离离和用Redis做缓存,这两种方案有什么异同

查看: 2292|回复: 4
Redis主从集群读写分离测试
认证徽章论坛徽章:272
1 master/slave server 启动
利用默认redis.conf配置文件启动master server,端口6379 。
[7304] 29 Aug 09:57:26 - 0 clients connected (0 slaves), 673996 bytes in use
[7304] 29 Aug 09:57:31 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:57:31 - 0 clients connected (0 slaves), 673996 bytes in use
[7304] 29 Aug 09:57:36 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:57:36 - 0 clients connected (0 slaves), 673996 bytes in use
[7304] 29 Aug 09:57:41 - DB 0: 15 keys (0 volatile) in 16 slots HT.
修改redis配置文件, 主要修改端口为6380,不是默认的6379, 然后修改slaveof字段,设置主master为127.0.0.7&&6379
认证徽章论坛徽章:272
启动后如下
[1704] 29 Aug 10:03:16 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:21 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:21 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:26 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:26 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:31 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:31 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:36 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:36 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:41 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:41 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:46 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:46 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:51 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:51 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:03:56 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:03:56 - 1 clients connected (0 slaves), 681872 bytes in use
[1704] 29 Aug 10:04:01 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:04:01 - 1 clients connected (0 slaves), 681872 bytes in use
认证徽章论坛徽章:272
主master已经检测到有一个slave连接
[7304] 29 Aug 09:58:31 - 0 clients connected (1 slaves), 681960 bytes in use
[7304] 29 Aug 09:58:36 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:58:36 - 0 clients connected (1 slaves), 681960 bytes in use
[7304] 29 Aug 09:58:41 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:58:41 - 0 clients connected (1 slaves), 681960 bytes in use
[7304] 29 Aug 09:58:46 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:58:46 - 0 clients connected (1 slaves), 681960 bytes in use
[7304] 29 Aug 09:58:51 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:58:51 - 0 clients connected (1 slaves), 681960 bytes in use
[7304] 29 Aug 09:58:56 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:58:56 - 0 clients connected (1 slaves), 681960 bytes in use
[7304] 29 Aug 09:59:01 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:59:01 - 0 clients connected (1 slaves), 681960 bytes in use
[7304] 29 Aug 09:59:06 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 09:59:06 - 0 clients connected (1 slaves), 681960 bytes in use
认证徽章论坛徽章:272
客户端如果连接到slave,则slave如下显示:
[1704] 29 Aug 10:05:52 - 2 clients connected (0 slaves), 689700 bytes in use
[1704] 29 Aug 10:05:57 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:05:57 - 2 clients connected (0 slaves), 689700 bytes in use
[1704] 29 Aug 10:06:02 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[1704] 29 Aug 10:06:02 - 2 clients connected (0 slaves), 689700 bytes in use
如果连接到master,则结果如下
[7304] 29 Aug 10:06:53 - Accepted 127.0.0.1:65311
[7304] 29 Aug 10:06:57 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 10:06:57 - 1 clients connected (1 slaves), 689788 bytes in use
[7304] 29 Aug 10:07:02 - DB 0: 15 keys (0 volatile) in 16 slots HT.
[7304] 29 Aug 10:07:02 - 1 clients connected (1 slaves), 689788 bytes in use
认证徽章论坛徽章:272
2 Replication测试
在master存贮一个值,如下
redis 127.0.0.1:6379& SET company&&alu
OK
redis 127.0.0.1:6379& GET company alu
(error) ERR wrong number of arguments for 'get' command
redis 127.0.0.1:6379& GET company
&alu&
redis 127.0.0.1:6379&复制代码
连接到slave查询,已经自动复制。如下
redis 127.0.0.1:6380& GET&&company
&alu&
redis 127.0.0.1:6380& SET&&company&&asb
OK
redis 127.0.0.1:6380&复制代码
slave我这里默认是读写都可以的,一般应该默认是只读的,这个可以再配置文件修改!
读写分离,类似于mysql cluster提供的读写分离,机制是一样的。
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号如何用redis/memcache做Mysql缓存层?
目前公司的一个项目,数据库用的是Mysql,正在考虑用redis/memcached做数据库的缓存层,目前的想法就是在读DB前,先读缓存层,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。
不过,要是直接在应用层加入缓存的代码,感觉修改量大,修改维护也麻烦,因此想把应用层和缓存层的代码分开。不知道这种想法正确否?想看看别人的代码是如何实现的,有没有相关的开源项目可以学习啊
按投票排序
大方向两种方案:1.脚本同步:自己写脚本将数据库数据写入到redis/memcached。这就涉及到实时数据变更的问题(mysql row binlog的实时分析),以及缓存层数据 丢失/失效 后的数据同步恢复问题。2.业务层实现:先读取nosql缓存层,没有数据再读取mysql层,并写入数据到nosql。nosql层做好多节点分布式(一致性hash),以及节点失效后替代方案(多层hash寻找相邻替代节点),和数据震荡恢复了。
1. 先调优,确认你的MySQL性能足够好,重新调整架构的代价比较大;2. 并不是所有数据都需要缓存,访问频率高,生成代价比较高的才考虑是否缓存,也就是说影响你性能瓶颈的考虑去缓存。3. 修改量大不是问题,好好设计自己访问数据库和缓存的代码。
1.首先明确是不是一定要上缓存,当前架构的瓶颈在哪里,若瓶颈真是数据库操作上,再继续往下看。2.明确memcached和redis的区别,到底要使用哪个。前者终究是个缓存,不可能永久保存数据(LRU机制),支持分布式,后者除了缓存的同时也支持把数据持久化到磁盘等,redis要自己去实现分布式缓存(貌似最新版本的已集成),自己去实现一致性hash。因为不知道你们的应用场景,不好说一定要用memcache还是redis,说不定用mongodb会更好,比如在存储日志方面。3.缓存量大但又不常变化的数据,比如评论。4.你的思路是对的,清晰明了,读DB前,先读缓存,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。5.考虑是否需要主从,读写分离,考虑是否分布式部署,考虑是否后续水平伸缩。6.想要一劳永逸,后续维护和扩展方便,那就将现有的代码架构优化,按你说的替换数据库组件需要改动大量代码,说明当前架构存在问题。可以利用现有的一些框架,比如SpringMVC,将你的应用层和业务层和数据库层解耦。再上缓存之前把这些做好。7.把读取缓存等操作做成服务组件,对业务层提供服务,业务层对应用层提供服务。8.保留原始数据库组件,优化成服务组件,方便后续业务层灵活调用缓存或者是数据库。9.不建议一次性全量上缓存,最开始不动核心业务,可以将边缘业务先换成缓存组件,一步步换至核心业务。10.刷新内存,以memcached为例,新增,修改和删除操作,一般采用lazy load的策略,即新增时只写入数据库,并不会马上更新Memcached,而是等到再次读取时才会加载到Memcached中,修改和删除操作也是更新 数据库,然后将Memcached中的数据标记为失效,等待下次读取时再加载。
前提:较少变更的数据才适合做缓存缓存读取流程:1、先到缓存中查数据
2、缓存中不存在则到实际数据源中取,取出来后放入缓存
3、下次再来取同样信息时则可直接从缓存中获取缓存更新流程:1、更新数据库
2、使缓存过期或失效,这样会促使下次查询数据时在缓存中查不到而重新从数据库去一次。通用缓存机制:1、用查询的方法名+参数作为查询时的key value对中的key值2、向memcache或redis之类的nosql数据库(或者内存hashmap)插入数据3、取数据时也用方法名+参数作为key向缓存数据源获取信息java实现可参考ehcache
之前做过这个,是用redis的hashset做的,多台一主多从的环境下启动的时候先从数据库里全部读出来,存到redis里,分主库和备库,有周期刷新和手动刷新机制,周期刷新和手动刷新是刷新备库,刷新完成后主备切换。主库提供查询功能,备库是用来和数据库同步的。查询的时候先从redis查再从数据库查,redis没有就进行更新。当时遇到的问题主要是启动加载的时间问题,另外如果使用redis持久化和分布式的话,从磁盘同步和主从同步期间redis都是不能提供查询的。缓存功能不管发生了什么,核心业务都不应该有影响,这部分功能要剥离好,和redis连接异常,redis宕机都不能影响核心业务,而且要可恢复。数据量的问题,多线程的问题,还有redis master slave切换时redis信息的维护,数据结构要设计好。
实现一个带redis缓存的jdbc驱动...(逃
之前有个项目做过这个,结果是缓存命中率极低,后面改按需缓存,比如只针对部分表缓存,后面效果也一般,其实按业务缓存是最靠谱的,但是很多开发很懒,希望在架构上解决问题,你们懂得.一般缓存分2种,一种是ID为key缓存,主要用于单条数据查询,可以考虑基于orm实现。第二种是以查询sql缓存,主要用于查询大量数据。实现期间最需要注意的是缓存更新策略,这个问题解决了,基本上也就实现了大部分的需求,解决的不太好,会导致数据不同步的坑爹问题
使用频繁的数据可以放,不常用的可以稍后在改
这种老的项目,建议使用主动缓存,先把所有需要缓存的内容缓存起来,数据更新可以使用alibaba开源的canal来实现更新缓存,参考:
已有帐号?
无法登录?
社交帐号登录小酱瓜 的BLOG
用户名:小酱瓜
文章数:36
访问量:18619
注册日期:
阅读量:5863
阅读量:12276
阅读量:307722
阅读量:1024536
51CTO推荐博文
一、redis简介Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便。二、架构图大致结构就是读写分离,将mysql中的数据通过触发器同步到redis中三、安装LNMP环境(这里为了省事,就是用yum来安装)1、修改yum源[root@redis&~]#&vim&/etc/yum.repos.d/epel.repo&&&&#添加这个文件
name=Extra&Packages&for&Enterprise&Linux&6&-&$basearch
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
failovermethod=priority
gpgcheck=0
name=nginx&repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=12、yum安装&[root@redis&~]#&yum&-y&install&nginx&php&php-fpm&php-cli&php-common&php-gd&php-mbstring&php-mysql&php-pdo&php-devel&php-xmlrpc&php-xml&php-bcmath&php-dba&php-enchant&mysql&mysql-server3、简单配置一下nginx[root@redis&~]#&vim&/etc/nginx/nginx.conf
&&&&&&&&listen&&&&&&&80;
&&&&&&&&#定义使用访问
&&&&&&&&server_name&&;
&&&&&&&&#设定本虚拟主机的访问日志
&&&&&&&&access_log&&/logs/.access.log&&
&&&&&&&&#默认请求
&&&&&&&&location&/&{
&&&&&&&&&&root&&&/www/;&&&&&&#定义服务器的默认网站根目录位置
&&&&&&&&&&index&index.php&index.html&index.&&&#定义首页索引文件的名称
&&&&&&&&location&~&\.php$&{
&&&&&&&&root&/www/;
&&&&&&&&fastcgi_pass&127.0.0.1:9000;
&&&&&&&&fastcgi_index&index.
&&&&&&&&fastcgi_param&SCRIPT_FILENAME&/www/$fastcgi_script_
&&&&&&&&include&fastcgi_
&&&&}4、启动服务[root@redis&~]#&sed&-i&'s/apache/nginx/g'&/etc/php-fpm.d/www.conf
[root@redis&~]#&/etc/init.d/php-fpm&start
正在启动&php-fpm:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]
[root@redis&~]#&/etc/init.d/mysqld&start
正在启动&mysqld:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]
[root@redis&~]#&mkdir&/{logs,www}
[root@redis&~]#&chown&-R&nginx:nginx&/{logs,www}
[root@redis&~]#&/etc/init.d/nginx&start
正在启动&nginx:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]
[root@redis&www]#&service&iptables&stop
iptables:&Flushing&firewall&rules:&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
iptables:&Setting&chains&to&policy&ACCEPT:&filter&&&&&&&&&&[&&OK&&]
iptables:&Unloading&modules:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
[root@redis&redis]#&netstat&-tnlp&&&&&&#查看监听
Active&Internet&connections&(only&servers)
Proto&Recv-Q&Send-Q&Local&Address&&&&&&&&&&&&&&&Foreign&Address&&&&&&&&&&&&&State&&&&&&&PID/Program&name&&&
tcp&&&&&&&&0&&&&&&0&0.0.0.0:80&&&&&&&&&&&&&&&&&&0.0.0.0:*&&&&&&&&&&&&&&&&&&&LISTEN&&&&&&2101/nginx&&&&&&&&&&&&&&&&&&&
tcp&&&&&&&&0&&&&&&0&127.0.0.1:9000&&&&&&&&&&&&&&0.0.0.0:*&&&&&&&&&&&&&&&&&&&LISTEN&&&&&&7544/php-fpm&&&&&&&&
tcp&&&&&&&&0&&&&&&0&0.0.0.0:3306&&&&&&&&&&&&&&&&0.0.0.0:*&&&&&&&&&&&&&&&&&&&LISTEN&&&&&&1871/mysqld5、给mysql授权[root@redis&~]#&mysql
mysql&&grant&all&privileges&on&*.*&to&root@localhost&identified&by&'123456';
mysql&&flush&6、测试[root@redis&~]#&vim&/www/index.php&
&&&&&phpinfo();
?&然后访问页面看到php的相关信息,基础环境就算搭建完成了。四、安装redis1、安装redis[root@redis&~]#&wget&-c&-t&0&http://download.redis.io/releases/redis-2.8.19.tar.gz
[root@redis&~]#&mkdir&/usr/local/redis
[root@redis&~]#&tar&xvf&redis-2.8.19.tar.gz&
#安装很简单、直接make就可以了
[root@redis&~]#&cd&redis-2.8.19
[root@redis&redis-2.8.19]#&make&
#编译完成后,将src中的可执行文件拷贝到刚刚创建的目录中
[root@redis&src]#&cp&redis-benchmark&redis-check-aof&redis-check-dump&redis-cli&redis-sentinel&redis-server&/usr/local/redis/
[root@redis&redis-2.8.19]#&cp&redis.conf&sentinel.conf&/usr/local/redis/Redis-benchmark & & &压力测试工具Redis-check-aof & & &检查redis持久化命令文件的完整性Redis-check-dump & & 检查redis持久化数据文件的完整性Redis-cli & & & & & &redis在linux上的客户端Redis-sentinel & & & redis-sentinel是集群管理工具,主要负责主从切换。Redis-server & & & & Redis服务器的daemon启动程序2、安装php的redis扩展[root@redis&~]#&wget&-c&-t&0&/owlient/phpredis/archive/master.zip
[root@redis&~]#&unzip&master.zip
[root@redis&~]#&cd&phpredis-master/
[root@redis&phpredis-master]#&phpize&
[root@redis&phpredis-master]#&./configure&--with-php-config=/usr/bin/php-config
[root@redis&phpredis-master]#&make&&&&make&install&
#修改php的配置文件,如果没有“extension=redis.so”,就加上这一行
[root@redis&~]#&vim&/etc/php.ini&
extension=redis.so
[root@redis&~]#&/etc/init.d/php-fpm&restart
停止&php-fpm:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]
正在启动&php-fpm:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]3、是否安装成功还是访问phpinfo的那个界面看到这个就是安装完成了。五、读写分离这里只是简单的做了一下读,没有写操作的相关代码,过一会测试,直接到数据库里执行update来模拟写操作。1、在mysql中插入一些测试数据[root@redis&~]#&mysql&-u&root&-p123456
mysql&&create&database&
mysql&&CREATE&TABLE&`test`&(`id`&int(7)&NOT&NULL&AUTO_INCREMENT,&`name`&char(8)&DEFAULT&NULL,&PRIMARY&KEY&(`id`))&ENGINE=InnoDB&AUTO_INCREMENT=10&DEFAULT&CHARSET=utf8;
mysql&&INSERT&INTO&`test`&VALUES&(1,'sven'),(2,'jim'),(3,'zhu'),(4,'wang'),(5,'ftd'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03');
mysql&&select&*&from&mytest.
+----+--------+
|&id&|&name&&&|
+----+--------+
|&&1&|&sven&&&|
|&&2&|&jim&&&&|
|&&3&|&zhu&&&&|
|&&4&|&wang&&&|
|&&5&|&ftd&&&&|
|&&6&|&test&&&|
|&&7&|&test01&|
|&&8&|&test02&|
|&&9&|&test03&|
+----+--------+2、编写php的测试代码&?php
&&&&&&&&$redis&=&new&Redis();
&&&&&&&&$redis-&connect('127.0.0.1',6379)&or&die&("could&net&connect&redis&server");
&&&&&&&&$query&=&"select&*&from&test&limit&8";
&&&&&&&&//为了简单一点,这里就读取了8条数据
&&&&&&&&for&($key&=&1;&$key&&&9;&$key++)
&&&&&&&&&&&&&&&&if&(!$redis-&get($key))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&$connect&=&mysql_connect('127.0.0.1','root','123456');
&&&&&&&&&&&&&&&&&&&&&&&&mysql_select_db(mytest);
&&&&&&&&&&&&&&&&&&&&&&&&$result&=&mysql_query($query);
&&&&&&&&&&&&&&&&&&&&&&&&//如果没有找到$key,就将该查询sql的结果缓存到redis
&&&&&&&&&&&&&&&&&&&&&&&&while&($row&=&mysql_fetch_assoc($result))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$redis-&set($row['id'],$row['name']);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&$myserver&=&'mysql';
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&$myserver&=&"redis";
&&&&&&&&&&&&&&&&&&&&&&&&$data[$key]&=&$redis-&get($key);
&&&&&&&&&&&&&&&&}
&&&&&&&&echo&$
&&&&&&&&echo&"&br&";
&&&&&&&&for&($key&=&1;&$key&&&9;&$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&";
?&第一次访问,redis中没有对应的KEY时再次访问,此时redis中已有相关数据到这里,我们已经实现了redis作为mysql的缓存服务器,但是如果更新了mysql,redis中仍然会有对应的KEY,数据就不会更新,此时就会出现mysql和redis数据不一致的情况。所以接下来就要通过mysql触发器将改变的数据同步到redis中。六、通过gearman实现同步1、介绍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数据库的更新。2、安装启动[root@redis&~]#&yum&-y&install&gearmand&libgearman-devel
[root@redis&~]#&/etc/init.d/gearmand&start
正在启动&gearmand:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]
[root@redis&~]#&/etc/init.d/gearmand&status
gearmand&(pid&&7702)&正在运行...3、安装php的gearman扩展[root@redis&~]#&wget&-c&-t&0&https://pecl.php.net/get/gearman-1.1.1.tgz
[root@redis&~]#&tar&xvf&gearman-1.1.1.tgz&
[root@redis&~]#&cd&gearman-1.1.1
[root@redis&gearman-1.1.1]#&phpize&
[root@redis&gearman-1.1.1]#&./configure&--with-php-config=/usr/bin/php-config
[root@redis&gearman-1.1.1]#&make&
[root@redis&gearman-1.1.1]#&make&install
#如果php的配置文件中没有extension&=&gearman.so,就加上此行
[root@redis&~]#&vim&/etc/php.ini&
extension&=&gearman.so
[root@redis&~]#&/etc/init.d/php-fpm&restart
停止&php-fpm:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]
正在启动&php-fpm:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[确定]这样就是安装成功了4、安装lib_mysqludf_jsonlib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。[root@redis&~]#&wget&-c&-t&0&/mysqludf/lib_mysqludf_json/archive/master.zip
[root@redis&~]#&unzip&master.zip&
[root@redis&~]#&cd&lib_mysqludf_json-master/
[root@redis&lib_mysqludf_json-master]#&gcc&$(mysql_config&--cflags)&-shared&-fPIC&-o&lib_mysqludf_json.so&lib_mysqludf_json.c
lib_mysqludf_json.c:40:23:&错误:my_global.h:没有那个文件或目录
lib_mysqludf_json.c:41:20:&错误:my_sys.h:没有那个文件或目录
lib_mysqludf_json.c:43:19:&错误:mysql.h:没有那个文件或目录
lib_mysqludf_json.c:44:21:&错误:m_ctype.h:没有那个文件或目录
lib_mysqludf_json.c:45:22:&错误:m_string.h:没有那个文件或目录
#这里编译报错是因为没有安装mysql的开发包,如果是源码安装的mysql,需要在/etc/ld.so.conf.d/
#目录下新建一个文件告诉系统mysql的头文件在哪里
[root@redis&lib_mysqludf_json-master]#&yum&-y&install&mysql-devel
[root@redis&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';
+---------------+-------------------------+
|&Variable_name&|&Value&&&&&&&&&&&&&&&&&&&|
+---------------+-------------------------+
|&plugin_dir&&&&|&/usr/lib64/mysql/plugin&|
+---------------+-------------------------+
#将模块拷贝到插件目录下
[root@redis&lib_mysqludf_json-master]#&cp&lib_mysqludf_json.so&/usr/lib64/mysql/plugin/
#注册UDF函数
mysql&&CREATE&FUNCTION&json_object&RETURNS&STRING&SONAME&'lib_mysqludf_json.so';5、安装gearman-mysql-udf这个插件是用来管理调用 Gearman 的分布式的队列。&[root@redis&~]#&wget&-c&-t&0&https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
[root@redis&~]#&tar&xvf&gearman-mysql-udf-0.6.tar.gz
[root@redis&~]#&cd&gearman-mysql-udf-0.6
[root@redis&gearman-mysql-udf-0.6]#&./configure&--with-mysql=/usr/bin/mysql_config&--libdir=/usr/lib64/mysql/plugin/
[root@redis&gearman-mysql-udf-0.6]#&make&
[root@redis&gearman-mysql-udf-0.6]#&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.
+--------------------+-----+-------------------------+----------+
|&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');6、编写mysql触发器(根据实际情况编写)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`));&
DELIMITER&;7、编写gearman的worker端[root@redis&~]#&vim&/www/redis_worker.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&$
&&&&&&&&$workString&=&$job-&workload();
&&&&&&&&$work&=&json_decode($workString);
&&&&&&&&if(!isset($work-&id)){
&&&&&&&&&&&&&&&&return&
&&&&&&&&$redis-&set($work-&id,&$work-&name);
[root@redis&www]#&nohup&php&redis_worker.php&&"$redis-&set($work-&id, $work-&name);"这条语句就是将id作KEY和name作VALUE分开存储,需要和前面写的php测试代码的存取一致。8、更新mysql中的数据mysql&&set&@RECV&=&1;
mysql&&select&@RECV;
mysql&&update&test&set&name&=&'ssss'&where&id&=&1;
mysql&&select&@RECV;
+------+从返回值可以看到,触发器是触发成功的(这里的@RECV是上面mysql TIGGER的返回值)。我们在redis中查看数据:[root@redis&redis]#&./redis-cli&
127.0.0.1:6379&&get&1
"sven"这里的数据居然没有变化,这是我们就要排错了。[root@redis&~]#&vim&/var/log/audit/audit.log&
type=AVC&msg=audit(.425:107):&avc:&&denied&&{&name_connect&}&for&&pid=12453&comm="mysqld"&dest=4730&scontext=unconfined_u:system_r:mysqld_t:s0&tcontext=system_u:o
bject_r:port_t:s0&tclass=tcp_socket
#看到这样一条日志,就知道是selinux阻止了同步
#现在将selinux的模式调成Permissive&
[root@redis&~]#&getenforce&
[root@redis&~]#&setenforce&0
[root@redis&~]#&getenforce&
Permissive设置完成以后,再次执行update,进入redis进行查看127.0.0.1:6379&&get&1
"ssss"刷新一下刚刚的php界面到这里就基本算是大功告成了,只要application将数据写到mysql中,mysql触发器检测到更新,就会通过Gearman将数据同步到redis中。然后读取的话,就直接从redis中进行读取。当然这只是个实验环境,实际上还有很多细节要调整。七、GitHub上的一个有意思的工具地址:/delano/redis-dump这个工具是用备份的redis的,也许你会问redis有自己的持久化,要这个工具干嘛?redis的自带的持久化具有局限性,假象我们需要redis回到过去的某个时刻去(回档)。redis自带的持久化要实现这个需求,办法就是不断的将dump文件或者aof文件移动到其他目录中去,不然它就会被新的持久化文件覆盖。而这个工具,就可以在任意时刻将数据库备份出来,非常方便。[root@redis&~]#&yum&-y&install&rubygems.noarch&ruby-devel
[root@redis&~]#&gem&install&redis-dump这样就安装完成了,使用方法到GitHub上去看,挺详细的。参考文章:/pages/mysql-replication-to-redis-by-gearman本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 redis主从读写分离 的文章

 

随机推荐