《数据平台缓存技术方案Memcached-Redis.docx》由会员分享,可在线阅读,更多相关《数据平台缓存技术方案Memcached-Redis.docx(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据平台前端缓存技术方案(M/R)version: vl. 0缓存 Memcached (M)M的概念M是高性能的分布式内存缓存服务器,协议简单。通过缓存数据 库的查询结果,减少数据库访问次数,提高动态Web应用的速度和扩 展性。M支持下述语言 C/C+ +- libmemcached- libmemcache- apr_memcache一 memcaheclient- libketama PHP- PECiymemcached- PECL/memcache- PHP libmemcached Java- spymemcached- Java memcached dient/danga- me
2、mcache-dient-forjava/taobao Python Ruby Perl .NET MySQL PostgreSQL Erlang Lua LispM的设计现了问题,系统会去B获取数据,当A正常以后,如果应用在A中没有拿到数据可以去B获取数据,并且复制到A上。Spring+XMemcached 实现M的Java客户端中,XMemcached支持所有的文本协议和二进制 协议。支持动态添加和删除M节点。支持客户端统计。支持节点的权 重设置,支持nio的连接池,网路实现层是长连接形式,无需重复创 建多个Client对象,在高负载环境下提高吞吐量。利用Spring框架可以直接配置客户端
3、集群,按照规定算法(Ketama等),自动Build出客户端对象,具体如下图。Builder c I d$s . rubyeye.KfKachedCl Ider * Listbo所 cl.ssLjovo. rwt. rrwtSodwtAddrtf&sM constructorva lueloculhos/val11211l - locdlho2t constructorH2U/constructor-ar|ll- 2 -集群服务配置图estfconnect lonPoo/ S/zra vaI uesaX/propertyproperty bca* cli35-*Het.ruyeyc,yjRpr
4、operty 加8个SerialeX4lntSu客户端对象配置图缓存 Redis (R)R的简介redis是一个key-value存储系统。和Memcached类似,它 支持存储的value类型相对更多,包括string(字符串)、list(链表)、 set(集合)和zset(有序集合)。这些数据类型都支持push/pop. add/remove及取交集并集和差集及更丰富的操作,而且这些操作 都是原子性的。在此基础上,redis支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别 的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入 追加的记
5、录文件,并且在此基础上实现了 master-slave(主从)同步。R的master-slave(主从)架构图 2.1 master-slave 模式当设置好slave服务器后,slave会建立和master的连接,然 后发送sync命令。无论是第一次同步建立的连接还是连接断开后的 重新连接,master都会启动一个后台进程,将数据库快照保存到文 件中,同时master主进程会开始采集新的写命令并缓存起来。后台 进程完成写文件后,master就发送文件给slave, slave将文件保 存到磁盘上,然后加载到内存恢复数据库快照到slave上。接着 master就会把缓存的命令转发给slave。
6、而且后续master收到的 写命令都会通过开始建立的连接发送给slave。从master到slave 的同步数据的命令和从client发送的命令使用相同的协议格式。当 master和slave的连接断开时slave可以自动重新建立连接。如果 master同时收到多个slave发来的同步连接命令,只会使用启动一 个进程来写数据库镜像,然后发送给所有slaveo流程如下图所示:SlaveSlaveMasterRedis复制机制的缺陷从上面的流程可以看出,Slave从库在连接Master主库时, Master会进行内存快照,然后把整个快照文件发给Slave,也就是 没有象MySQL那样有复制位置的概
7、念,即无增量复制,这会给整个 集群搭建带来非常多的问题。比如一台线上正在运行的Master主库配置了一台从库进行简单 读写分离,这时Slave由于网络或者其它原因与Master断开了连接, 那末当Slave进行重新连接时,需要重新获取整个Master的内存快 照,Slave所有数据跟着全部清除,然后重新建立整个内存表,一方 面Slave恢复的时间会非常慢,另一方面也会给主库带来压力。所以基于上述原因,如果你的Redis集群需要主从复制,那末 最好事先配置好所有的从库,避免中途再去增加从库。edis的master/slave模式下,master提供数据读写服务, 而slave只提供读服务。客服端
8、通过Consistent Hashing算法选择要访问的slave缓存服务节点,运行图如下图所示:Client读取写,Linux服务器Slave192.168.3.90:6379读取ClientClient图2.2 redis运行图R的特性今可以将缓存数据持久化到磁盘今不支持集群,但支持主从模式今value支持数据类型:string (字符串)、list (列表)、sets (集 合)或者是ordered sets (被排序的集合)和hash(哈希)。今基于客服端来实现分布式(通过Consistent Hashing算法选择服务器节点,算法详情请参考1.4节)今 事务支持(MULTI,EXEC
9、及DISCARD三个命令让Redis的使 用者可以将Redis命令打包进行原子性的操作)今支持Publish/subscribe(使用该功能可以很容易实现一个实时 消息平台)R的Java客户端实现redis主页上 列出的java客 户端有Jedis、JRedis详情请参考:详情请参考:和JDBC-Redis三种,面分别介绍三种客户端的优缺点。支持redis版本性能维护推荐Jedis2.0.0 releasefastactively developed推荐JRedis1.2.n release尚未release版本fastJDBC-Redisnot goodhttp:/redis.io/clie
10、nts(1) jedis 实现jedis是Redis官方首选的Java客户端开辟包,推荐使用jedis, 所有对redis操作类的结构非常明确,都通过jedis获取其他的类, 且jedis支持和spring集成。以下是jedis+spring集成步骤:首先,在项目中引入jeids的jar包:redis.clients jedis其次,*总能0吼配er遣泊文件中添加配置:其次,在spring配置文件中添加配置:最后,应用程序调用:ShardedJedisjedis= shardedJedisPool.getResourcef);jedis.get(key);从redis服务器获取值jedis.s
11、etfkey, value); 将值保存到redis 服务器(2)、jredis 实现实现比较复杂,且版本比较旧,不支持redis的不少新特性。(3)、jdbc-redis 实现jdbc-redis是用于redis这个NoSQL数据库的jdbc驱动,也 就是说你可以使用你所熟悉的jdbc的方法来访问Redis数据。但是 jdbc-redis性能较差,不推荐使用。R的最新版本2.4改进今 对小数据量的sorted sets结构的内存使用做很大的优化今RDB文件的持久化速度也将会大大提高今 对目前的一些写操作命令进行了改进,支持批量写入功能今 启用新的内存分配模式jemalloc今通过对copy
12、on write机制使用的优化,数据持久化保存的 子进程的内存占用将大大减少今INFO内容更加丰富今 新的OBJECT命令,提供对Redis存储value结构描述今 新的CLIENT命令,提供对Redis客户端连接的信息描述今彻底将Slave对Master的连接改成非阻塞,之前 connect(2)系统调用是会阻塞的今Redis-benchmark Redis-cli都进行了几个方面的改进今Make改为彩色输出,更易读今2.0版本中提供的VM机制被废弃今 总的来说2.4版本会在各方面有性能上的提升Redis测试框架也有非常大的提升详情请参考: 11017/305875.htmlR的性能:根据R
13、edis官方的测试结果:在50个并发的情况下请求10w 次,写的速度是110000次/s,读的速度是81000次/s测试环境:1.50个并发,请求100000次2 .读和写大小为256bytes的字符串3 .Linux2.6 Xeon X3320 2.5GHz 的服务器上4 .通过本机的loopback interface接口上执行详情请参考: R的短期发展规划Lua脚本支持Redis集群功能Replication功能的改进持久化方案的改进提供更精确的过期时间长数据的读写操作性能改进进行一些内部改造其它小功能详尚寺参考 http: /blog. nosqlfan. com/html/3405
14、.htmlM和R的比较网络io模型Main ThreadListen将accept返向的向封灰成CQI hM放入对电税权的CQ队列向该线Flpipc。数也.触发libevent JI 件Worker TlireadCQ队列UTEM注册 6事件AcceptConnectionK Round轮i句.班libevent处到该迂楂的M是多线程,非阻塞10复用的网络模型,分为监听主线程和 worker子线程,监听线程监听网络连接,接受请求后,将连接描述 字pipe传递给worker线程,进行读写TO,网络层使用libevent封 装的事件库,多线程模型可以发挥多核作用,但是引入了 cache coher
15、ency和锁的问题,比如,M最常用的stats命令,实际M所有 操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。CQ队列CQ队列LibeventJriworkers 171他过libeventc个互接的谈写”件.Worker Threadrobin到不同的workers 处理ush到该线科的队Worker Thread网络10模型图R使用单线程的1()复用模型,主要实现了Epoll、Kqueue,对于单纯惟独10操作来说,单线程可以将速度优势发挥到最大,但是R守护进程机制:UNIX Daemon; Socket事件处理机制:非阻塞、Libevent异步事件处理、Epoll/Kque
16、ue;内存管理机制:Slab内存 分配、LRU对象清除、Hash快速检索Item。内存管理中,Slab中分成小单位Chunk, Chunk中存有实际数据Item。下述是M的Slab内存结构图和分配实例图。slab是一次申请内存的最晔位slabcli时2卜2kynhixhM2chunktg充1em 后IMB5/幅 txmkJb .而 i dunk tf,endjlr - AS V * il刷欠口J起g出I会有空他浪费Slab内存结构图也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作, 单线程模型实际上会严重影响整体的吞吐量,并且在CPU计算过程中, 整个10调度都是被阻塞住的。内存管理
17、方面M使用预分配的内存池的方式,使用Slab和大小不同的Chunk 来管理内存,Item根据大小选择合适的Chunk存储,内存池的方式 可以省去申请/释放内存的开消,并且能减小内存碎片产生,但这种 方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时, 新的数据也可能会被剔除。Redis使用现场申请内存的方式来存储数据,并且很少采取方式 优化内存分配,会在一定程度上存在内存碎片,R会根据存储命令的 参数,把过期的数据单独存放在一起,并把它们称为暂时数据,非临 时数据是永远不会被剔除的,即便物理内存不够,进行Swap,也不 会剔除任何非暂时数据,这点上R更适合作为存储而不是Cache。数
18、据一致性M提供了CAS命令,可以保证多个并发访问操作同一份数据的一 致性问题。R没有提供CAS命令,但是提供了事务功能,可以保证一串命令 的原子性,中间不会被任何操作打断。存储方式及其它方面M基本只支持简单的Key-Value存储,不支持枚举,不支持持久 化和复制等功能。R 除 Key-Value 之外,还支持 list, set, sorted set, hash 等 众多数据结构。R还同时提供了持久化和复制等功能。主从模式 (Master-Slave)实现了多台缓存服务器具有相同数据副本,某缓存 服务器节点Down机后,不影响应用服务正常访问。关于不同语言的客户端支持M发展的时间更久一些,
19、M有丰富的客户端支持,并且成熟稳定。R由于其协议本身就比M复杂,并且版本在不断更新,客户端的 需要时刻跟进。1 M+R 和 M-R、hh k kis Isiz6chunks-10922slub-|end jwgc 上 hi,二二页国余空间起始地址slab class?sii)c=20_chunks;X37K ,2l,滋空时iiabb-43cnd_pagc_ptrM % i-外轲余里同起始地址shb_dass3sudcISJchunks-5461必b”讪收空问slubs-1endjxige_plr/W Ju 一队剌余空间g始地城-Hashtableg*6MylhaUibwkcy2h.U ky3b
20、a# Iicy4hadibiS-v(_,-LeyShash120 120、 HyNuUi key7hach .OU -A120 -i192 IM19IS2JtcyKnawi kyOhMh kcylOtuili kcyl ihnli keylZhaiti7Icyl325 kcy14tuli* 直ISO1201261Jkcyl 5hliSlab内查分配半例图96 IO922chunks Ipages = 1MBsIabclass40Item数据存储格式图M的架构设计M的设计遵从原则是,首次访问从RDBMS中取得数据,按一定规则保存到M后,第二次访问从M中取得数据显示到浏览器页面中。一 次访句:从R
21、D8MS中取5疏存到mamcach9d次后:从memjched中眩SBK聂水费面M架构层次图M的服务端并没有分布式功能,各个服务器之间没有互相通信以 共享信息。M的分布式彻底取决于客户端的实现,如下图所示。memcached memcachT | memcachedU使用说明图如需要在M中保存键名为“toky。”的数据时,通过客户端应用 程序的算法,根据Key来决定选择哪个服务器节点进行存储。服务器 选定之后,命令其保存键名tokyo”和键值“data”。| set(*tolqy,dala)(应用原序 Set实例图如需要在M中获取键名为“tokyo”的数据时。把键名“toky。 传给客户端函数
22、库,通过和数据保存相同的算法,根据Key选择服务 器节点。只要算法一致,就能选对服务器,发送命令取得键值“data”。node2node2node)node3get(tclEOT的Got实例图M的客户端算法余数分散根据服务器台数的余数进行分散,求得Key的整数Hash值H, 除以服务器的台数N,由余数指向选中服务器,即H%NO算法的数据分散性比较优秀,但不足的是当添加/移除服务器时(包括服务器Down机事件),缓存重组的代价相当大。因为添加/移 除服务器后,余数必然发生改变,客户端在获取数据时,就无法通过 算法获取和保存时相同的服务器,严重影响了缓存的命中率。大部份 负载会在事件发生的同时,增
23、大数据库的压力。一致性哈希一致性哈希算法,Consistent Hashing是一种分布式算法,常用于负载均衡。M客户端选择这种算法,解决将Key-Value均匀分配 到众多M服务器上的问题。它可以取代传统的取模操作,解决了上 述取模操作无法应对增删M服务器所遇到的问题。一致性哈希算法图一致性哈希算法增加节点图普通一致性哈希算法有个潜在的问题是:节点Hash后会不均匀地分布在环上,这样大量的Key在寻觅节点时,会存在命中各个节点 的概率差别较大,无法实现有效的负载均衡。如有三个节点 Nodel,Node2,Node3,分布在环上时三个节点挨的很近,落在环上的 key寻觅节点时,大量key顺时针
24、总是分配给Node2,而其它两个节 点被找到的概率都会很小。这种问题的解决方案有:改善Hash算法, 均匀分配各节点到环上;使用虚拟节点的思想,为每一个物理服务器 节点在圆上分配100200个点。这样就能抑制分布不均匀,最大 限度地减小服务器增减时的缓存重新分布。用户数据映射在虚拟节 点上,就表示用户数据真正存储位置是在该虚拟节点对应的实际物 理服务器上。M的Java客户端实现(集群)Google 的 Memcached 实现官方推荐的Java客户端之一此alin开源实现基础上做再次封装 的产物。增加实现了缓存服务接口化,使用配置文件代替代码初始化 客户端,集群的实现, LocalCache客
25、户端本地缓存的使用。旧Socket 10代码里面有太多的Synchronized (同步),多多少少会影响性能,改造Socket 10部份,优化Synchronized,添置了读入缓存页。c”3ce4r OofKi) 0ooe.odofsr.” Ccf DM) ggxMOO9crtSinng,8 ioog iomcrsrna mo),皿ayrMOecQrtiafS7而a fno) ea9syOSfmg wq) we 如Kb5*dW 4D/HU *(MOOfd) rod “nSfoeODjR&Qjmg. /or) void(HcStrmg. iop,op oWM旧 01Hl. 03a7#acar
26、Msrww 也 Uap,sntA9 0dgSMS“术t/b。0 t9octS intffSng sg) icgK$erwyen)S83r 3ceiSdwig 020.801g.gfSSq CgM 即)8d “r5:口Ma*“仲迎1w&CXZ9BW0 HMR UcmtchStatalJg。. 时却9*) jKMAeSr*a*M7 gCacMStE T ivaaa*旬 2a :3冲 *S仍“;vO9 WRmOOmS :E02 q E q d a” 2a 2。 gCacMStE T ivaaa*旬 2a :3冲 *S仍“;vO9 WRmOOmS :E02 q E q d a” 2a 2。 KOeCM
27、fQPTCO I8Q) QO接口类图集群、客户端的初始化通过配置文件生成,配置内容如下:*Bt5acne.一.,Tr -I an.Alliofc.Mplacrora.af.c4cbe.4cacb6(3.Meaksast JrrorKAOdlert/trxoxHAdlex.cUeot”Gua.alist .*plao:*.a9.ccbe.cecched.MezK;a;hexcQxHftdlerOocketpool - -poclC* ! -: :.*5-*5* 一. -2!0w - -FC:h-er *3000e i* truef10.2.224.3:9900l30.2.224.46:3M01
28、. (seetgo -*pool -betrk true* n- - . - i-s* ,- -250*r- r-s er-sooo* n;i-*ralae-,ri -*3000* ; e xc-te.MXverK.2.224.3i39002a0.2.224.4:33002013d=actarv.t3dbyuhC】S二IAcaaim,工cl_e八C-tcErtKCcbYl.eai . .集群中多节点软负载均衡,当前采用简单的Hash算法加取余来 分发数据,数据在多节点上进行异步冗余存储,防止数据丢失,数据在分发到某一失败节点时可以转向到其他可用节点,节点恢复可用后 数据Lazy复制,例如,当A,B两台机器作为集群的时候,如果A出