《Memcached缓存技术介绍.pptx》由会员分享,可在线阅读,更多相关《Memcached缓存技术介绍.pptx(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Memcached 缓存技术介绍内容概要CAP 问题NoSQL 介绍Memcached 介绍Memcached 维护Memcached 相关CAP 问题nCAP理论认为任何基于网络的数据共享系统(分布式数据系统),最多只能满足数据一致性、可用性、分区容错性,三要素中的两个要素:l数据一致性(C,Consistency);等同于所有节点访问同一份最新的数据副本;l数据可用性(A,Availability);l分区容错性(P,Partition-Tolerance);CAP 应用NoSQL/RDBMSuNoSQL:弥补关系型数据库的不足。关系型数据库优点:数据一致性/完整性复杂数据模型处理关系型数
2、据库不足:大量数据的写入处理性能问题对线上表做索引或表结构变更简单查询快速返回结果的性能问题NoSQL 优点:数据易缓存海量数据存储快速高并发读写高可扩展性、分布式,易于数据的分散、处理NoSQL 不足:缺乏事务一致性不支持复杂查询NoSQL 选型l数据模型及操作模型数据模型及操作模型:应用层数据模型是行、对象还是文档型?系统是否能支持进行一些统计工作?l一致性一致性:数据是否被复制到了多台机器上?不同节点的数据如何保证一致性?l可靠性可靠性:更新数据时,是否立即写到持久化存储设备中?新数据是否能同步到多台机器?l扩展性扩展性:数据量有多大,单机是否能容下?读写并发需求单机是否能支持?l分区策
3、略分区策略:考虑到对扩展性、可用性或者持久性的要求,是否需要一份数据存储在多台机器上?是否需要知道或者能否知道数据存储在哪些机器上?l事务机制事务机制:业务是否需要 ACID 事务机制?l单机性能单机性能:如果将数据持久化存储在磁盘上,哪种数据结构能满足需求?读写比率?写操作是否会成为IO瓶颈?l负载可评估负载可评估:是否支持一些性能监控功能或接口?注:数据库的数据模型指的是数据在数据库中的组织方式,数据库的操作模型指的是存取这些数据的方式。通常数据模型包括关系模型、键值模型以及各种图结构模型。操作语言可能包括 SQL、键值查询及 MapReduce 等。NoSQL 通常结合了多种数据模型和操
4、作模型,提供不一样的架构方式。NoSQL 分类Memcached 介绍Memcached是什么?高性能的分布式内存缓存服务分布式内存缓存服务。典型使用场景:通过缓存数据库查询结果,减少数据库访问次数,降低数据库负载;提高动态Web应用的访问速度、增强可扩展性。场景选择:分布式部署容忍数据丢失快速存取数据频繁访问相同数据Memcached 特点:键值对内存存储数据可丢失快速读写处理基于libevent的事件处理基于客户端的分布式处理基于C/S架构,文本行通信协议Libevent 介绍lLibevent 是一套跨平台跨平台的事件处理事件处理接口封装,内部使用 select、epoll、kqueue
5、等系统调用管理事件机制。兼容的操作系统包括:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。l封装的接口包括:poll、select(Windows)、epoll(Linux)、kqueue(BSD)、/dev/pool(Solaris)lMemcached 使用 libevent进行网络并发连接处理,在高并发连接下,保持快速响应快速响应能力。http:/www.monkey.org/provos/libevent/http:/www.monkey.org/provos/libevent/安装下载:http:/libevent.org/https:/ libeven
6、t:rootlocalhost libevent-2.0.19-stable#./configure-prefix=/usr/localrootlocalhost libevent-2.0.19-stable#make&make install安装 Memcached:rootlocalhost memcached-1.4.13#./configure-prefix=/data/server/memcached-1.4.13-with-libevent=/usr/local-enable-64bit-disable-docsrootlocalhost memcached-1.4.13#make
7、&make installrootlocalhost memcached-1.4.13#cp-p./bin/memcached/usr/local/bin/启动启动参数:#memcached help-d 守护进程-m 内存数,default 64MB-u 运行用户,用root账户-l 监听的服务器IP地址,默认监听多个地址-p 监听端口,默认是11211-c 并发连接数,默认是1024-P pid文件启动:#memcached-d-m 1024-c 40960-u root-p 11211-P/var/run/m11211.pid关闭:#kill cat/var/run/m11211.pid
8、状态#echo stats|nc 192.168.51.211 11211STAT pid 13827#进程IDSTAT uptime 2070631#运行秒数STAT version 1.4.13#版本STAT libevent 2.0.19-stable#libevent 版本STAT pointer_size 64#系统指针(32bit/64bit)STAT curr_items 50237#当前实例存储的 items数量STAT total_items 1337400#实例启动以后存储的 items总数量STAT bytes 35169108#实例存储 items占用的字节数STAT
9、curr_connections 349#当前打开的连接数STAT total_connections 108429#实例启动后打开的连接总数STAT cmd_get 14005676#get 命令总请求次数STAT cmd_set 1337400#set 命令总请求次数STAT get_hits 12596511#总命中次数STAT get_misses 1409165#总未命中次数STAT evictions 0#为获取空闲内存而删除的 items数STAT bytes_read 4918928094#总读取字节数(请求字节数)STAT bytes_written 46027378599#
10、总发送字节数(结果字节数)STAT limit_maxbytes 1572864000#分配的缓存大小STAT threads 4#当前线程数END命中率命中率计算:1 缓存命中率=get_hits/cmd_get*100%2 cmd_get=get_hits+get_misses3 缓存空闲:total_items=cmd_set=get_misses 缓存已满:STAT evictions 0 当缓存内存用满,新写入数据时,Memcached开始删除缓存对象,等式不成立。查看缓存对象#echo stats items|nc 192.168.51.211 11211输出各个 slab中的 i
11、tem信息。#echo stats slabs|nc 192.168.51.211 11211输出 slab中更详细的 item信息。#echo stats sizes|nc 192.168.51.211 11211输出所有 item的大小和个数。#echo stats cachedump 1 10|nc 192.168.51.211 11211stats cachedump 根据 输出相同的 中的 item信息。是输出的个数,当为 0时输出所有的 item。查看缓存对象#echo stats items|nc 192.168.51.211 11211STAT items:2:number 2
12、690#Slab Id=2;items数量:2690(已经存储2690个key值)STAT items:2:age 487061#Slab Id=2;已经存在时间,单位秒STAT items:2:evicted 0#Slab Id=2;被踢出的数量STAT items:2:evicted_nonzero 0STAT items:2:evicted_time 0STAT items:2:outofmemory 0STAT items:2:tailrepairs 0STAT items:2:reclaimed 19STAT items:2:expired_unfetched 15STAT item
13、s:2:evicted_unfetched 0命令行操作1、存入Key(key为jrj_abc,value为12345)#printf set jrj_abc 0 0 5rn12345rn|nc 192.168.51.211 11211STORED#printf get jrj_abcrn|nc 192.168.51.211 11211VALUE jrj_abc 0 512345END2、添加value值#printf add jrj_abc 0 0 5rn56789rn|nc 192.168.51.211 11211NOT_STORED3、替换value值#printf replace jr
14、j_abc 0 0 5rn34567rn|nc 192.168.51.211 11211STORED#printf get jrj_abcrn|nc 192.168.51.211 11211VALUE jrj_abc 0 534567END命令行操作4、数值增加#printf incr jrj_abc 1rn|nc 192.168.51.211 11211345685、数值减少#printf decr jrj_abc 3rn|nc 192.168.51.211 11211345656、数据删除#printf delete jrj_abcrn|nc 192.168.51.211 11211DEL
15、ETED7、清除所有Key#echo flush_all|nc 192.168.51.211 11216OKhttp:/ Growth Factor进行调试:启动时指定 Growth Factor(通过-f选项),可以适当控制 slab差异,默认值为1.25。以 verbose模式启动 Memcached:默认 Growth Factor输出(f=1.25):#memcached-m 1024-c 40960-u root-p 11219-P/var/run/m11219.pid-vv slab class 1:chunk size 96 perslab 10922slab class 2:c
16、hunk size 120 perslab 8738slab class 3:chunk size 152 perslab 6898slab class 4:chunk size 192 perslab 5461设置 Growth Factor为 2倍(f=2):#memcached-m 1024-c 40960-u root-p 11219-P/var/run/m11219.pid-f2-vvslab class 1:chunk size 96 perslab 10922slab class 2:chunk size 192 perslab 5461slab class 3:chunk si
17、ze 384 perslab 2730slab class 4:chunk size 768 perslab 1365输出可见,从192字节的组开始,组大小依次增大为原来的 2倍。这样设置后,slab之间的差别比较大,有些情况下会浪费内存。通过重新计算数据的预期平均长度,调整 growth factor,以获得最恰当的内存使用。工具1、libmemcached使用方便,能一次性从多台服务器获得信息。rootlocalhost libmemcached-1.0.9#./configure-prefix=/data/server/libmemcached-1.0.9-with-mysql=/usr
18、/bin rootlocalhost libmemcached-1.0.9#make&make install格式:#memstat-servers=server1:port1,server2:port2,#memstat-servers=192.168.51.211:11211,192.168.51.211:11212Server:192.168.51.211(11211)pid:13827.Server:192.168.51.211(11212)pid:13834.相关命令:memcapable memcat memcp memdump memerror memexist memflush
19、 memparse memping memrm memslap memstat memtouch工具2、memcached-tool#memcached-tool 192.168.51.211:11211#Item_Size Max_age 1MB_pages Count Full?1 96 B 7791 s 1 2 no 2 120 B 491912 s 1 2725 no 3 152 B 506578 s 2 8610 no列含义:列含义#slab class 编号Item_SizeChunk 大小Max_ageLRU 内最旧的记录生存时间1MB_pages分配给 Slab的页数Count
20、Slab 内的记录数Full?Slab 内是否含有空闲 chunk3、memcache-top:#./memcache-top-v0.6 192.168.51.211:11211USAGE HIT%CONN TIME EVICT/s READ/s WRITE/s使用规范Memcached 实例申请:单实例 MC缓存池初始化为1G,每组分布式容量共2G;分配原则:a 缓存数据 500M以内分配公共分布式组;b 缓存数据 500M以上可以申请独立分布式组,视情况而定;c 公共实例,禁止使用无 apps前缀的写入,前缀使用参考 Key 前缀命名;d 只允许使用分布式算法缓存数据;禁止只使用分布式组中
21、的单实例,如只使用 mc11:11211,mc12:11211 中的 mc11:11211 实例;说明:a 单实例 MC缓存池上限为2G,即每个分布式组上限为 4G,缓存数据超过 4G再讨论;b 分布式组的缓存用满,重启各实例扩充至 4G内存,再满则迁移部分缓存至新组;前缀命名Key 前缀命名:格式:mc.apps:key_name说明:mc.为统一前缀apps为各自的 应用/业务 名称,长度限制在 10个字符以内:为前缀和 Key名称分隔符key_name key 名称Key 前缀名需要记录在 wiki页,方便查询,防止重名冲突;按前缀统计:#echo stats detail on|nc
22、192.168.51.211 11216 OK#printf set mc.jrj:jrj_abc 0 0 5rn12345rn|nc 192.168.51.211 11216 STORED#echo stats detail dump|nc 192.168.51.211 11216 PREFIX mc.jrj get 0 hit 0 set 1 del 0END#echo stats detail off|nc 192.168.51.211 11216 OK安全和性能安全和性能:a 访问限制:使用MC前,需提供 Client IP地址,Memcached服务器开通 iptables限制;b
23、数据安全:不能用来存储永久性数据,Memcached数据缓存在内存中,随时可能丢失;c 公共实例,不要随意开启 stats detail on前缀统计功能,对性能有影响,如需统计请通知 DBA组;d 公共实例,不要随意 flush_all 缓存数据,如需清除数据请通知 DBA组;说明:a 由于 MC数据易丢失性,如缓存的是 DB数据,程序中做好检测,在 MC故障后自动获取后端 DB数据;b 如可能,建议使用连接池连接;防火墙限制:#Memcached 11211iptables-I INPUT-p tcp-s localhost-dport 11211-j ACCEPTiptables-I I
24、NPUT-p tcp-s 192.168.51.211-dport 11211-j ACCEPTiptables-I INPUT-p tcp-s 192.168.50.249-dport 11211-j ACCEPTiptables-A INPUT-p tcp-dport 11211-j DROP安全和性能Memcached Patch(心远):说明:基于最新版本 所做的修订,专用于公共 memcached实例,加上以下功能:1)支持管理员IP白名单2)非管理员不能执行危险指令:如:flush_all、stats*、slabs*3)客户端写入数据,key必须带 app前缀(注:在外界写入时对
25、key有个 50字节内的字符检查,对mc写入性能影响不大)源码:安装:同 Memcached使用:telnet mc1.jrjc.local 11211show_admin_ip#显示管理员IP地址白名单#注:系统启动后,白名单默认包含 本机访问权限add_admin_ip IP_ADDR#添加管理员IP地址,IP_ADDR如:del_admin_ip IP_ADDR#删除管理员IP地址分布式Memcached 服务端本身没有分布式功能;Memcached 分布式实现:a 客户端(程序端)算法实现如 Consistent Hashing 算法;还有 mod算法等等,做扩展时,移动数据困难;建议
26、使用 Consistent Hashing算法,性能好,扩展方便;b 简单的轮询实现多个 Memcached池,Get操作:轮询所有服务器Set操作:随机选择一个c 代理层实现,如 moxi等d 复制实现,通过 repcached补丁;监控监控页:http:/192.168.50.249:80/phpMemcachedAdmin/http:/192.168.50.249:80/memcache_php/memcache.php?http:/192.168.50.249:8080/graph_view.php?action=tree&tree_id=6注:phpMemcachedAdmin有操作缓存数据功能,需小心使用;需要通过通道连接,将 192.168.50.249:80、8080 映射为本地地址;Memcached 相关uMemcached for MySQL:Memcached for MySQL InnoDB MySQL-5.6.2+Memcached for MySQL NDB EngineuHandlerSocket plugin for MySQL InnoDBuGoogle Leveldb plugin for MySQL