转自:http://www.codytan.com/?p=739
memcache源码分析-addserver、failover机制
首先从addserver开始,addserver会先去hashtable里面查找是否已经存在连接池了,如果没有则创建之:
并且往连接池内记录这个连接;
/* add server and a preallocated request pointer */if (pool->num_servers) {pool->servers = erealloc(pool->servers, sizeof(mmc_t *) * (pool->num_servers + 1));pool->requests = erealloc(pool->requests, sizeof(mmc_t *) * (pool->num_servers + 1));}else {pool->servers = emalloc(sizeof(mmc_t *));pool->requests = emalloc(sizeof(mmc_t *));} pool->servers[pool->num_servers] = mmc;pool->num_servers++;
可以看到addserver的时候并不会去检查这个数据库连接是否正常,连接池写入了如果来failover呢?
我们来看一下set操作的过程:(节选)
if (!mmc_get_pool(mmc_object, &pool TSRMLS_CC) || !pool->num_servers) {RETURN_FALSE;}
查看连接池中是否有连接,
while (result < 0 && (mmc = mmc_pool_find(pool, key, key_len TSRMLS_CC)) != NULL) {if ((result = mmc_server_store(mmc, request, request_len TSRMLS_CC)) < 0) {mmc_server_failure(mmc TSRMLS_CC);}}
这里就是addserver的作用了,一直找到连接正常的连接,并且发现失败连接的时候通过mmc_server_failure来
标识,起到failover的作用,那些request或者TSRMLS_CC这些宏不明白也没关系,知道php进程的过程是MINT/RINT,RSHUTDOWN/MSHUTDOWN,TSRMLS_CC(TSRM (Thread Safe Resource Management).
)是zend的宏就可以了,这个宏比较复杂,我也没弄懂,以后的文章可能详细的解释一些zend和php的东西。
其他的操作也都可能会触发failover记录的操作,同时在php.ini中可以配置:
1 2 | memcache.allow_failover "1" PHP_INI_ALL Available since memcache 2.0.2. memcache.max_failover_attempts "20" PHP_INI_ALL Available since memcache 2.1.0. |
failover和尝试次数等。