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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章