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 {log_level;*log_filename;*conf_filename;uint16_tstats_port;stats_interval;*stats_addr;hostname[NC_MAXHOSTNAMELEN]; size_tmbuf_chunk_size;pid_tpid;*pid_filename;unsignedpidfile:};
这个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)的初始化等等,这些后边详细讲述。
总体来说,启动流程就是这些步骤,如下图:
posted on
不敢接受失败的人,往往是那些追求完美的人,