
分布式缓存系统Memcached
文章平均质量分 83
独孤_子喻
艰难困苦如同欢乐,终将成为人生最后的财富。
展开
-
分布式缓存系统Memcached(十)——状态机之网络数据读取与解析
主线程将接收的连接socket分发给了某工作线程,然后工作线程从任务队列中取出该连接socket的CQ_ITEM,开始处理该连接的所有业务逻辑。这个过程也就是上图中的第一个状态conn_listening。 而工作线程首先进入的状态就是conn_new_cmd,即为这个新的连接做一些准备工作,如清理该连接conn结构的读缓冲区等。原创 2015-01-26 11:27:57 · 1131 阅读 · 0 评论 -
分布式缓存系统Memcached(九)——状态机之socket连接与派发
Memcached主线程中监听socket注册事件和工作线程中连接socket注册事件的回调函数都是event_handler,且event_handler的核心部分都是一个有限状态机:drive_machine。因此接下来将对该状态机具体的业务处理进行深入的剖析。 memcached将每个socket都封装为一个conn结构体,该结构体包含了比如socket的文件描述符sfd、注册事件event、连接状态结构体conn_states,等等诸多信息字段,其中的状态结构:conn_states中包含了该so原创 2015-01-25 14:51:26 · 1387 阅读 · 0 评论 -
分布式缓存系统Memcached(八)——主线程之main函数
memcached主线程:创建监听socket、注册监听socket的libevent事件、启动主线程的libevent事件循环,就是接下来的内容了。 其中主要调用的函数是server_sockets,该函数从配置参数setting.inner字符串中依次提取出一个ip或者一个hostname(一个hostname可能有多个ip),然后传给函数server_socket函数处理之。server_socket函数负责完成创建socket,绑定到端口,监听socket,并将该监听socket对应的conn结构原创 2015-01-22 12:00:40 · 659 阅读 · 0 评论 -
分布式缓存系统Memcached(七)——半同步/半异步模式
在前面工作线程初始化的分析中讲到Memcached采用典型的Master_Worker模式,也即半同步/半异步的高效网络并发模式。其中主线程(异步线程)负责接收客户端连接,然后分发给工作线程,具体由工作线程完成客户端的求情任务。在memcached中,主线程负责监听所有socket上的事件,当socket上有可读事件发生,即新的客户连接求情到来,主线程就接受之得到新的连接socket,并将该连原创 2015-01-21 21:52:34 · 962 阅读 · 0 评论 -
分布式缓存系统Memcached(六)——slab和item的主要操作
上节在分析slab内存管理机制时分析Memcached整个Item存储系统的初始化过程slabs_init()函数:分配slabclass数组空间,到最后将各slab划分为各种级别大小的空闲item并挂载到对应大小slab的空闲链表slots上。本节将继续分析对slab和item的主要操作过程。slab机制中所采用的LRU算法:在memcached运行过程中,要把一个item调入内存,但内原创 2015-01-19 21:36:26 · 788 阅读 · 0 评论 -
分布式缓存系统Memcached(三)——哈希表操作
memcached 中有两张hash 表,一个是“主hash 表”(primary_hashtable),另外一个是“原hash 表”(old_hashtable)。一般情况下都在主表中接受操作,在插入新item时判断是否需要进行扩;每次操作的时候,先会检测表是否正处于扩展(expanding)状态,如果是,则原表中进行操作,当扩容完成在转移到主表中进行操作。 在扩容时,采取逐步迁移策略:即每次只原创 2015-01-18 18:25:11 · 770 阅读 · 0 评论 -
分布式缓存系统 Memcached(二)——数据存储slab与hashtable
缓存数据以item为基本单元,以双链表形式存放在对应级别大小的slabclass结构的chunk中。同时该item还存放在链式hashtable中bucket中,用于提供快速查找的索引。首先是理解缓存的基本数据单元item结构:typedef struct _stritem { struct _stritem *next; //在slab中的双链表后向指针 str原创 2014-11-20 20:13:20 · 859 阅读 · 0 评论 -
分布式缓存系统 Memcached(一)——整体架构
分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性)。分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制。其次是分布式管理和分布式算法,其次是缓存键值管理和路由。什么是Memcached许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏转载 2014-09-26 22:27:04 · 809 阅读 · 0 评论 -
分布式缓存系统Memcached(十二)——CAS协议
Memcached在1.2.4版本后新增了CAS(Check and Set)协议,主要用于并发控制:memcached中同一个item同时被多个线程(多个客户端)更改的并发问题。CAS协议最本质的东西——版本号,即将每个item都关联一个全局唯一的编号,从而利用该唯一的编号来判断item数据在某个线程操作期间有无被其他的线程所更改(每次更改版本号都会改变,因此可作为判断的标识)。原创 2015-01-28 10:28:19 · 794 阅读 · 0 评论 -
分布式缓存系统Memcached(十四)——总结
到此关于memcached的主要分析就即将告一段落了。最近通过对LevelDB、Redis以及Memcached等存储系统的学习理解,对大规模存储系统的基本框架原理和实现有了基本的理解。对此也越发兴趣浓厚,接下来需要的是去研读更多这方面的技术书籍,充分利用在校的最后这段时光。在分析memcached的过程中参考了大量存储方面的技术博客文章,正是在此开放的环境帮助下,自己才能走得更好更远。在此列出一些自认为不错的资料:缓存设计的一些思考:http://www.nosqlnotes.net/archives原创 2015-01-29 11:13:49 · 979 阅读 · 4 评论 -
分布式缓存系统Memcached(十三)——基本配置与命令
memcached的客户端使用TCP连接同memcached进行交互,memcached服务器监听指定的端口(默认端口是11211)。Client连接到memcached服务器,发送指令,获取数据,然后关闭连接。通常没有必要发送任何命令来关闭某个会话。客户端可以在任何时候关闭不需要的连接。然而,通常鼓励客户端缓存这些连接,因为memcached服务器本身就被设计成为一个可以支持成百上千个连接的服务器,而客户端缓存了连接后,就可以避免重复的建立连接的开销。memcached协议中包含两部分数据,文本行和非原创 2015-01-28 10:58:31 · 895 阅读 · 0 评论 -
分布式缓存系统Memcached(五)——内存管理机制
在前面slab数据存储部分分析了Memecached中记录数据的具体存储机制,从中可以看到所采用的内存管理机制——slab内存管理,这也正是linux所采用的内存高效管理机制,对于Memchached这样的内存cache服务器,内存高效管理是其最重要的任务之一。Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的原创 2015-01-19 11:55:33 · 1109 阅读 · 0 评论 -
分布式缓存系统Memcached(十一)——状态机之SET、GET命令
1.listening:这个状态是主线程的默认状态,它只有这一个状态:负责监听socket,接收客户连接,将连接socket派发给工作线程。2.conn_new_cmd:每个工作线程的接收到新连接的初始状态,为处理该连接socket准系列准备工作:如清空读写buf等。3.conn_waiting:当读缓冲区无数据可以处理时,工作线进入等待状态:在event_base中注册读事件,然后状态机暂停,挂起当前connection(函数退出,回调函数的attachment会记录这个connection),等待有原创 2015-01-27 09:55:19 · 1351 阅读 · 0 评论 -
分布式缓存系统Memcached(四)——工作线程初始化
Memcached原创 2015-01-18 22:11:55 · 967 阅读 · 0 评论