Twemproxy源码走读(1):概述

Twemproxy(又称nutcracker,以下简称NC)是Memcached和Redis协议的代理服务器(下文中简单起见,只提及Redis,大部分情况适用于Memcached,不适用时会特别说明),并能有效减少大量连接对Redis服务器的性能影响。虽然Redis3.0版本具有集群的特性,但还不适合生产环境,单台Redis机器又受到内存大小限制,还存在出现故障会直接影响业务,同时,过多的客户端连接到Redis会导致redis连接数增加,影响其性能。通过nc可以实现快速、简单的搭建一个redis集群,实现横向扩展和负载均衡。客户端连接到nc和直接连接到redis没有大的区别,这样既有代码几乎不需要修改,只要改下连接的服务器的IP和Port即可,大大方便了已有项目的迁移。

国内也有类似的redis集群解决方案,如豆瓣公司发布的Codis,这里不展开讲,有兴趣的同学可以搜索相关资料学习,现附上github地址(https://github.com/CodisLabs/codis)。

Twemproxy顾名思义就是一个代理(proxy),介于客户端和redis之间一个代理:(1)接收客户端的请求(增删改查等操作);(2)传递给Redis处理;如果存在回包(3)接收redis的返回值;(4)将返回值发送给客户端。


在正式开始阅读代码之前,先来看一下代码整体结构

代码规模不大只有1w多行,而且功能划分的比较清晰,包括[1]

  • 事件处理: event/nc_epoll.c、event/nc_event.h、event/nc_evport.c、event/nc_kqueue.c
  • 各种Hash函数: hashkit/nc_crc16.c、hashkit/nc_crc32.c、hashkit/nc_fnv.c、hashkit /nc_hashkit.h、hashkit/nc_hsieh.c、hashkit/nc_jenkins.c、hashkit /nc_ketama.c、hashkit/nc_md5.c、hashkit/nc_modula.c、hashkit/nc_murmur.c、 hashkit/nc_one_at_a_time.c、hashkit/nc_random.c
  • 协议: proto/nc_memcache.c、proto/nc_proto.h、proto/nc_redis.c
  • 自定义的数据类型: nc_array.c、nc_array.h、nc_string.c、nc_string.h
  • 网络通信相关: nc_connection.c、nc_connection.h、nc_client.c、nc_client.h、nc_proxy.c、nc_proxy.h
  • 信号处理: nc_signal.c、nc_signal.h
  • 关键数据结构和算法: nc_rbtree.h、nc_rbtree.c、nc_queue.h、nc_request.c、nc_response.c、nc_mbuf.c、 nc_mbuf.h、nc_message.c、nc_message.h、nc_server.c、nc_server.h
  • 统计、日志和工具: nc_stats.c、nc_stats.h、nc_log.c、nc_log.h、nc_util.c、nc_util.h
  • 配置文件: nc_conf.c、nc_conf.h
  • 主程序: nc.c、nc_core.c、nc_core.h

NC使用一个数据结构instance来存储这个实例所需要的状态,定义如下:


大概包括日志、配置、状态监控、管理连接的redis server等信息,注释很明确,不再一一解释了。启动一个Twemproxy,就是生成一个实例(struct instance nci),这个实例保存了运行所需的一切信息,instance当中的字段通过nc_set_default_options()和 nc_get_option()来初始化。

整体流程图如下图所示:


图1. NC整体流程图

文献:

【1】Twemproxy源码分析(一)启动过程 http://www.tuicool.com/articles/BbInAz
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章