版权声明:本文为博主原创文章,未经博主允许不得转载。 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
}