我们在前面分析的都是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 }