Memcached(Window安装和简介)

来源:互联网 发布:chrome 定时执行js 编辑:程序博客网 时间:2024/05/17 22:18

1、简介

       Memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,

从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过Memcached协议与守护进程通信。

    特征:  memcached作为高速运行的分布式缓存服务器,具备以下特点:

    1、协议简单(服务器客户端通信不使用复杂的xml格式,而是使用简单的基于文本协议(其包括文本格式和二进制格式),可以在windows使用telnet连接服务器操作。)

    2、基于libevent的事件处理(memcached使用这个libevent程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。)

    3、内置内存存储方式(因保存的数据都是存储在其内置的内存存储空间中,所以重启系统会使数据丢失。当内容容量到达指定值之后,就基于LRU(least recently used)算法自动删除不使用的缓存,memcached设计没有过多考虑数据永久性问题)

    4、Memcached不互相通信的分布式,memcached尽管是"分布式"缓存服务器,但服务器并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端实现的。(服务器维护了一个键值关系的数据表,服务器之间相互独立,互相之间不共享数据也不做任何通讯操作,客户端需求知道所有服务器,并自行负责管理数据在各个服务器之间的分配)

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    功能:MemAdmin(图形化管理工具)是一款可视化的Memcached管理与监控工具,使用PHP开发,体积小,操作简单。         

主要功能:
服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新
服务器性能监控:GET、DELETE、INCR、DECR、CAS等常用操作命中率实时监控
支持数据遍历,方便对存储内容进行监视
支持条件查询,筛选出满足条件的KEY或VALUE
数组、JSON等序列化字符反序列显示
兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外)
支持服务器连接池,多服务器管理切换方便简洁.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

最近的memcached默认情况下采用了名为Slab Allocatoion的机制分配管理内存。在改机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是这中方式会导致内存碎片,加重操作系统内存管理器的负担。

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,已完全解决内存碎片问题。SlabAllocation 

的原理相当简单。将分配的内存分割成各种尺寸的块(chucnk),并把尺寸相同的块分成组(chucnk的集合)如图:


而且slab allocator 还有重复使用已分配内存的目的。也就是说,分配到的内存不会释放,而是重复利用。

Slab Allocation 的主要术语

  •     Page:分配给Slab 的内存空间,默认是1MB。分配给Slab 之后根据slab 的大小切分成chunk.
  •     Chunk :用于缓存记录的内存空间。
  •     SlabClass:特定大小的chunk 的组。
    在Slab 中缓存记录的原理

    Memcached根据收到的数据的大小,选择最合适数据大小的Slab (图2)memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。 

    Memcached在数据删除方面有效里利用资源
       
    Memcached删除数据时数据不会真正从memcached中消失。Memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible透明),其存储空间即可重复使用。

    LazyExpriationmemcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术称为lazyexpiration.因此memcached不会再过期监视上耗费CPU时间。

    对于缓存存储容量满的情况下的删除需要考虑多种机制,一方面是按队列机制,一方面应该对应缓存对象本身的优先级,根据缓存对象的优先级进行对象的删除。

    LRU:从缓存中有效删除数据的原理
       
    Memcached会优先使用已超时的记录空间,但即使如此,也会发生追加新纪录时空间不足的情况。此时就要使用名为LeastRecently Used(LRU)机制来分配空间。这就是删除最少使用的记录的机制。因此当memcached的内存空间不足时(无法从slabclass)获取到新空间时,就从最近未使用的记录中搜索,并将空间分配给新的记录。

    Memcached 分布式缓存实现原理

    memcached分布式原理

    memcached不相互通信,那么memcached是如何实现分布式的呢?memcached的分布式实现主要依赖客户端的实现

    当数据到达客户端,客户端实现的算法就会根据“键”来决定保存的memcached服务器,服务器选定后,命令他保存数据。取的时候也一样,客户端根据“键”选择服务器,使用保存时候的相同算法就能保证选中和存的时候相同的服务器

    余数计算分散法

    余数计算分散法是memcached标准的memcached分布式方法,算法如下:

    CRC($key)%N

    该算法下,客户端首先根据key来计算CRC,然后结果对服务器数进行取模得到memcached服务器节点,对于这种方式有两个问题值得说明一下:

    1. 当选择到的服务器无法连接的时候,一种解决办法是将尝试的连接次数加到key后面,然后重新进行hash,这种做法也叫rehash。
    2. 第二个问题也是这种方法的致命的缺点,尽管余数计算分散发相当简单,数据分散也很优秀,当添加或者移除服务器的时候,缓存重组的代价相当大。

    Consistent Hashing算法

    Consistent Hashing算法描述如下:首先求出memcached服务器节点的哈希值并将其分配到0~2^32的圆上,这个圆我们可以把它叫做值域,然后用同样的方法求出存储数据键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上,如果超过0~2^32仍找不到,就会保存在第一台memcached服务器上:

    memcachd基本原理

    再抛出上面的问题,如果新添加或移除一台机器,在consistent Hashing算法下会有什么影响。上图中假设有四个节点,我们再添加一个节点叫node5:

    添加了node节点之后

    node5被放在了node4与node2之间,本来映射到node2和node4之间的区域都会找到node4,当有node5的时候,node5和node4之间的还是找到node4,而node5和node2之间的此时会找到node5,因此当添加一台服务器的时候受影响的仅仅是node5和node2区间。


  • 优化的Consistent Hashing算法

    上面可以看出使用consistent Hashing最大限度的抑制了键的重新分配,且有的consistent Hashing的实现方式还采用了虚拟节点的思想。问题起源于使用一般hash函数的话,服务器的映射地点的分布非常不均匀,从而导致数据库访问倾斜,大量的key被映射到同一台服务器上。为了避免这个问题,引入了虚拟节点的机制,为每台服务器计算出多个hash值,每个值对应环上的一个节点位置,这种节点叫虚拟节点。而key的映射方式不变,就是多了层从虚拟节点再映射到物理机的过程。这种优化下尽管物理机很少的情况下,只要虚拟节点足够多,也能够使用得key分布的相对均匀。

    总结

    本文介在理解缓存基本概念的情况下介绍了memcached的分布式算法实现原理,memcached的分布式是由客户端函数库实现的。



    缓存多副本

    缓存多副本主要是用于在缓存数据存放时存储缓存数据的多个副本,以防止缓存失效。缓存失效发生在以下几种情况:
    • 1.   缓存超时被移除(正常失效)
    • 2.   缓存由于存储空间限制被移除(异常失效)
    • 3.   由于缓存节点变化而导致的缓存失效(异常失效)

    在缓存多副本的情况下,需要重新考虑缓存的分布式分布策略。其次缓存的多个副本实际本身是可能的多个读的节点,可以做为分布式的并行读,这是另外一个可以考虑的问题。

    缓存数据的一致性问题

    缓存数据尽量只读,因此缓存本身是不适合大量写和更新操作的数据场景的。对于读的情况下,如果存在数据变化,一种是同时更新缓存和数据库。一种是直接对缓存数据进行失效处理。

2、下载memcached_en32or64


0 0