twemproxy源碼解析系列一----特性及啟動流程分析


 一、Twemproxy概述及其特性

Twemproxy是一個由twitter開源的memcache與redis的代理,全部由C語言實現。作為一個代理,它的主要特性包括:

1:可以減少到后端cache服務器的連接。

2:在多個cache服務之間自動共享數據。

3:能夠使用不同的策略和散列函數支持一致性hash。

4:通過配置設置是否禁用失敗的節點。

5:運行多個實例,客戶端可以連接到第一個可用的代理服務。

6:支持請求的流式與批處理,降低來回的消耗。

 

二、Twemproxy啟動啟動流程分析

對於一個由C/C++編寫的應用程序而言,程序的啟動點一般都是main函數,所以對一個程序進行分析的話,也一般都是有main函數作為入口,我們這里也不例外,以main函數作為入口。

找到文件nc.c定位到main,我們可以看到定義了一個變量,

struct instance nci;

下邊我們看下這個instance的定義:

struct instance {
    struct context  *ctx;                        /* active context */
    int             log_level;                   /* log level */
    char            *log_filename;               /* log filename */
    char            *conf_filename;              /* configuration filename */
    uint16_t        stats_port;                  /* stats monitoring port */
    int             stats_interval;              /* stats aggregation interval */
    char            *stats_addr;                 /* stats monitoring addr */
    char            hostname[NC_MAXHOSTNAMELEN]; /* hostname */
    size_t          mbuf_chunk_size;             /* mbuf chunk size */
    pid_t           pid;                         /* process id */
    char            *pid_filename;               /* pid filename */
    unsigned        pidfile:1;                   /* pid file created? */
};

這個instance就相當於是一個twemproxy實例,后邊整個程序的初始化很多都會用到。接下來就調用了nc_set_default_options()和nc_get_options()兩個函數,其中nc_get_options這個函數是讀取命令行參數。其中比較重要的幾個參數分別有:

a) test_conf : 用於設置在啟動twemproxy之前是否要對配置文件做檢查,以確保配置文件格式的正確。

然后就會調用nc_pre_run,啟動之前做一些預處理,包括:初始化日志級別以及日志文件;設置是否后台運行;對信號做初始化處理;是否創建pid文件。

接下來調用nc_run開始啟動proxy;這個函數完成的工作就是調用core_start創建context,然后進入死循環調用core_loop開始整個事件循環的處理,接受請求並處理。當然,core_start以及core_loop這兩個函數里邊還包含了大量的處理工作,包括,配置文件解析以及讀取,相關組件(server_pool,conf,context)的初始化等等,這些后邊詳細講述。

總體來說,啟動流程就是這些步驟,如下圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM