Memcached与MySQL数据同步
1、介绍
在生产环境中,我们经常使用MySQL作为应用的数据库。但是随着用户的增多数据量的增大,我们将会自然而然的选择Memcached作为缓存数据库,从而减小MySQL的压力。但是memcached在用户、应用与MySQL三者中保持着数据同步也是一个不小的工程。
例如用户从memcached缓存中换取某数据,并且执行删除命令。它需要到MySQL中删除,之后还须要设计一个程序将Memcached与之对应的数据也删除掉。
假若我们能够做到在MySQL中增删改时都能够自动触发删除memcached中相应的数据,那岂不美滋滋呀。这当然能够做到啦,我们将采用采用MySQL Memcached UDF(User Defined Functions)方法。
mysql memcached UDF 其实就是通过libmemcached来使用memcache的一系列函数,通过这些函数,你能 对memcache进行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我们通过mysql trigger来使用这些函数,那么就能通过mysql更好的,更自动的管理memcache!
2、软件下载与安装
2.1、软件下载
需要使用的软件又两个,libmemcached以及memcached_functions_mysql
百度云下载链接:http://pan.baidu.com/s/1pKCKjwB 密码:fks8
网上找的下载网址:http://download.tangent.org(当时找软件的时候,网上多篇文章都说这里可以下载那两个软件。可我进去就是找不到呀,23333)
2.2、软件安装
简介:
这两个软件的安装比较蛋疼,毕竟是开源软件,哪个版本依赖哪个版本,哪个版本不与哪版本个兼容。当时我安装这两个软件用了一个上午时间。因为之前我在安装PHP中memcached扩展模块需要依赖这个软件库,所以安装了一个最新版本libmemcached-1.0.18,因而能够使用PHP的memcached扩展模块中的所有功能。、
但是在安装memcached_functions_mysql时,就显得很蛋疼了。
一开始我直接安装memcached_functions_mysql-1.1,到make的时候就出现下面的错误。
servers.c:122: error: 'memcached_st' has no member named 'hosts'
servers.c:123: error: 'memcached_st' has no member
named 'hosts'
servers.c:124: error: 'memcached_st' has no member
named 'hosts'
servers.c:126: error: 'memcached_st' has no member
named 'hosts'
……
这是什么原因呢?
这就是上面所提到软件兼容问题。
后来在网上看到说是memcached_functions_mysql-1.1这个版本配对libmemcached-0.37版本以上都会出现这种问题。
接着我就进行一次又一次测试:
Libmemcached(1.0.2、1.0.3、1.0.18、0.34、0.36版本)+ memcached_functions_mysql-1.1进行安装。结果成功的只有0.34、0.36版本。
因为我想要保证相对较高版本的libmemcached,因为低版本的不支持PHP的memcached扩展模块的一些新功能。
既然memcached_functions_mysql-1.1版本不能对应libmemcached的高版本,那么我就退而求其次,使用memcached_functions_mysql-0.9咯。
百度了好久好久没找着,最后在国外的网站github中找到。
接着进行memcached_functions_mysql-0.9的安装测试,结果还是不理想。
突然灵光一闪,那我就安装两个libmemcached咯,一个1.0.18版本,一个0.34版本。最终成功安装。(libmemcached-0.34与memcached_functions_mysql-1.1配对进行安装)
1):安装libmemcached-0.34
参考
http://www.cnblogs.com/phpstudy2015-6/p/6670103.html#_label2
2):安装memcached_functions_mysql-1.1
#tar zxvf memcached_functions_mysql-1.1.tar.gz
#cd memcached_functions_mysql-1.1
#./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached
#make
#make install
3):拷贝lib文件到mysql的plugin下面
# cp /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/
4)往MySQL添加memcache UDF函数
一共有两种方法:
1、在MySQL里执行 source install_functions.sql
mysql>source /home/username/(memcached_functions_mysql-1.1源码路径)/sql/ install_functions.sql
2、在linux主机执行mysql <sql/install_functions.sql
#/usr/local/mysql/bin/mysql < /home/username/(memcached_functions_mysql-1.1源码路径)/sql/ install_functions.sql
5):检查添加函数是否成功
mysql>select * from mysql.func;

结果显示有很多函数,表示添加函数成功
注意:
1、必须要带有--with-libmemcached,否则就会显示找不到libmemcached
2、有个小细节,就是经常进行安装卸载libmemcached时(即--prefix有设置相同的名字),即使有--with-libmemcached正确的路径,也有可能会显示找不到libmemcached。
解决:可以使用不同的名字(--prefix);或者重启linux
3、功能介绍
从select * from mysql.func;的结果中我们可以看到很多关于memcached的函数。熟悉memcached指令的同学一眼看过去就能够知道这个函数的大概功能。memc_set、memc_get这不就是相当set与get命令嘛。
具体功能可参考文档:
http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-mysqludf.html
简单测试一下这些函数:
#测试前当然要先将MySQL与memcached建立连接啦!
mysql> select memc_servers_set('192.168.95.11:11211');
mysql> select memc_server_count();
mysql> select memc_set('m','llppppp');
mysql> select memc_get('m');

telnet 192.168.95.11 11211

4、实例测试
1、新建一个数据库test233以及表tab1


2、建立三个触发器
插入数据:
mysql>delimiter $
mysql>create trigger tab1_insert_memc
-> before insert on tab1
-> for each row begin
-> set @m=memc_set(NEW.id,NEW.name);
-> end$
更新数据:
mysql> create trigger tab1_update_memc
->before update on tab1
-> for each row begin
-> set @m=memc_replace(OLD.id,NEW.name);
-> end$
删除数据:
mysql> create trigger tab1_delete_memc
-> before delete on tab1
-> for each row begin
-> set @m=memc_delete(OLD.id);
-> end$
mysql>delimiter ;


3、连接memcached服务器进行数据测试
mysql> select memc_servers_set('192.168.95.11:11211');
1)、向tab1插入几条数据,并查看结果
mysql> insert into tab1 value('1','1111aaaaff');
.......


telnet 192.168.95.11 11211

2)、更改数据
mysql> update tab1 set name='ooooooooooooooo' where id=1;

telnet 192.168.95.11 11211

3)、删除数据
mysql> delete from tab1 where id=1;

telnet 192.168.95.11 11211

5、总结建议
1、如果出现mysql服务重启,需要重新连接memcached服务器select memc_servers_set('192.168.95.11:11211)
2、使用命令查看可以设置的参数,根据具体项目设置最合适参数select memc_list_behaviors()/G
3、设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,表示在memcached出现问题时可以继续将数据插入到MySQL中。否则将会等到timeout执行插入操作。
4、在MySQL中使用这个功能时,不要一味地将所有表的数据都布置成这种形式,避免MySQL中使用过多的函数、以及触发器而影响性能。
(以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)
作者:那一叶随风
声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接
Memcached与MySQL数据同步的更多相关文章
- Mysql数据同步Elasticsearch方案总结
Mysql数据同步Elasticsearch方案总结 https://my.oschina.net/u/4000872/blog/2252620
- 几篇关于MySQL数据同步到Elasticsearch的文章---第一篇:Debezium实现Mysql到Elasticsearch高效实时同步
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484358&idx=1&sn=3a78347 ...
- Redis和MySQL数据同步及Redis使用场景
1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...
- ElasticSearch5+logstash的logstash-input-jdbc实现mysql数据同步
在实现的路上遇到了各种坑,再次验证官方文档只能产考不能全信! ElasticSearch安装就不说了上一篇有说! 安装logstash 官方:https://www.elastic.co/guide/ ...
- Elasticsearch和mysql数据同步(logstash)
1.版本介绍 Elasticsearch: https://www.elastic.co/products/elasticsearch 版本:2.4.0 Logstash: https://www ...
- Elasticsearch和mysql数据同步(elasticsearch-jdbc)
1.介绍 对mysql.oracle等数据库数据进行同步到ES有三种做法:一个是通过elasticsearch提供的API进行增删改查,一个就是通过中间件进行数据全量.增量的数据同步,另一个是通过收集 ...
- Kettle ETL 来进行mysql 数据同步——试验环境搭建(表中无索引,无约束,无外键连接的情况)
今天试验了如何在Kettle的图形界面(Spoon)下面来整合来mysql 数据库中位于不同数据库中的数据表中的数据. 试验用的数据表是customers: 第三方的数据集下载地址是:http://w ...
- 高可用的并行MySQL数据同步及分布式
首先聊聊MySQL的数据分布式,目前最为常用的就是Replication(复制)技术.基于此技术外延开来有很多中架构,分类归结为如下: 1.树状结构(Master,Backup-Master ...
- 转载:mysql数据同步redis
from: http://www.cnblogs.com/zhxilin/archive/2016/09/30/5923671.html 在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终 ...
随机推荐
- ConcurrentHashMap源码分析
看过hashMap源码之后一直意犹未尽的感觉,挡不住我看其他的源码了.HashMap在单线程中非常好用,也不会出现什么问题,但是一到多线程就gg了,变的不灵了.我们有HashTable可以运用在多线程 ...
- 从项目经理的角度看.net的MVC中Razor语法真的很垃圾.
我们知道,Razor语法中我们可以直接使用@if(){}等代码段,这使得.net程序员在写模版时更容易了. 对比如下: 语法名称 Razor 语法 Web Forms 等效语法 代码块(服务端) @{ ...
- Servlet支持上传多张图片
首先前端的表单是这个形式: <form target="_self" method="post" action="fileUploadMult ...
- Python学习--23 第三方库
本文将介绍python里常用的模块.如未特殊说明,所有示例均以python3.4为例: $ python -V Python 3.4.3 网络请求 urllib urllib提供了一系列用于操作URL ...
- grpc-gateway:grpc对外提供http服务的解决方案
我所在公司的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,就希望可以做成用rpc来做内部的通讯,对外依然用Restful.于是就想到了google的grpc. 使用grpc ...
- [HDU]1016 DFS入门题
题目的意思就是在1到n的所有序列之间,找出所有相邻的数相加是素数的序列.Ps:题目是环,所以头和尾也要算哦~ 典型的dfs,然后剪枝. 这题目有意思的就是用java跑回在tle的边缘,第一次提交就tl ...
- 【NFS项目实战二】NFS共享数据的时时同步推送备份
[NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...
- ps-修复
1- 复制图层 2- 工具栏——套索——多变套索工具——上侧工具栏——羽化(15像素) 选区,防止其他区域被修改 羽化,让修改的边缘柔和化 3- 选项区——编辑——填充 ...
- Metadata Service 架构详解 - 每天5分钟玩转 OpenStack(165)
下面是 Metadata Service 的架构图,本节我们详细讨论各个组件以及它们之间的关系. nova-api-metadata nova-api-metadata 是 nova-api 的一个子 ...
- Class.getResourceAsStream()与ClassLoader.getResourceAsStream()的区别
Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.clas ...