db分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wellwang1993/article/details/83377298

我们在前面分析的都是socket相关,也就是它究竟是如何实现高并发的,然后分析到了client_request,这里有个内容绕不过去了,bind作为一款dns软件,它含有域名对应的A记录的解析,之前的做法中,他通过一个zone文件就实现这些资源的管理,但是这样就会带来一些问题,比如说如果采用zone文件的方式,那么他就需要将zone文件加载到内存中会消耗内存,或者zone文件含有很多记录的话会耽搁很多时间,或者更改一条记录的时候,需要重新加载bind,这样就可能对客户端的查询造成影响,bind-dlz应用而生,dlz可以将zone文件存储在数据库中,当数据库发生了变化,即可在bind的响应中查询到最新的数据,不需要重启或者重新加载配置文件。dlz支持的数据库包括postgresql,mysql,berkeley db,odbc,ldap,也可以使用一个标准的文件系统作为数据库,如果现有的驱动不支持,可以自定义api,dlz不会影响现有的特性,仍可以使用标准的dns zone文件

这里挑一个mysql为例来说明问题

每个驱动有一个dlz_xxx_methods,有一个dns_sdlzimplementation_t 类型它的method会存储该方法,同时该类型还有一个dlz_imp结构,它会存储dns_dlzimplementation_t 的类型,该类型的method所有的驱动存储的都是一样的,即sdlzmethods ,而dns_dlzimplementation_t 的driverarg结构会存储上面对应的dns_sdlzimplementation_t 类型的结构。所有的dns_dlzimplementation_t会被连起来存储到一个全局的dlz_implementations中去
在set_up中有这样一部分代码,就是注册dlz驱动的,这里以mysql说明问题
重要的数据结构
static dns_sdlzmethods_t dlz_mysql_methods = {
	mysql_create,
	mysql_destroy,
	mysql_findzone,
	mysql_lookup,
	mysql_authority,
	mysql_allnodes,
	mysql_allowzonexfr
};
static dns_dlzmethods_t sdlzmethods = {
	dns_sdlzcreate,
	dns_sdlzdestroy,
	dns_sdlzfindzone,
	dns_sdlzfindnameid,
	dns_sdlzallowzonexfr
};

static dns_sdlzimplementation_t *dlz_mysql = NULL;
result = dlz_drivers_init();
{
    #ifdef DLZ_MYSQL
        //初始化mysql驱动
	    result = dlz_mysql_init();
        {
            result = dns_sdlzregister("mysql", &dlz_mysql_methods, NULL,
				  DNS_SDLZFLAG_RELATIVEOWNER |
				  DNS_SDLZFLAG_RELATIVERDATA |
				  DNS_SDLZFLAG_THREADSAFE,
				  ns_g_mctx, &dlz_mysql);
            {
                dns_sdlzimplementation_t *imp=isc_mem_get(mctx, sizeof(dns_sdlzimplementation_t));
                //赋值上面的dlz_mysql_methods
                imp->methods = methods;
	            imp->driverarg = driverarg;
	            imp->flags = flags;

                imp->dlz_imp = NULL;
                result = dns_dlzregister(drivername, &sdlzmethods, imp, mctx,&imp->dlz_imp);
                {
                    dns_dlzimplementation_t *dlz_imp;
                    //初始化一个全局的dlz_implementations变量
                    isc_once_do(&once, dlz_initialize)
                    dlz_imp = isc_mem_get(mctx, sizeof(dns_dlzimplementation_t));
                    //赋值sdlzmethods方法
                    dlz_imp->name = drivername;
	                dlz_imp->methods = methods;
                    //注意这里把外面的那层imp赋值到该dlz_imp了
                    dlz_imp->driverarg = driverarg;
	                //将该dlz_imp插入到dlz_implementations集合中
                    ISC_LIST_APPEND(dlz_implementations, dlz_imp, link);
                    imp->dlz_imp = dlz_imp
                }
				 
            }
        }
	    if (result != ISC_R_SUCCESS)
		    return (result);
    #endif
}

猜你喜欢

转载自blog.csdn.net/wellwang1993/article/details/83377298