前言

DLZ(Dynamically Loadable Zones)与传统的BIND9不同,BIND的不足之处:

BIND从文本文件中获取数据,这样容易因为编辑错误出现问题。

BIND需要将数据加载到内存中,如果域或者记录较多,会消耗大量的内存。

BIND启动时解析Zone文件,对于一个记录较多的DNS来说,会耽误更多的时间。

如果近修改一条记录,那么要重新加载或者重启BIND 才能生效,那么需要时间,可能会影响客户端查询。

而Bind-dlz 即将帮你解决这些问题,对Zone文件操作也更方便了,直接对数据库操作,可以很方便扩充及开发管理程序。

bind-dlz的相关配置就不说了,网上一大堆,推荐两个:

问题描述

bind9+dlz+mysql配置好正常使用没什么问题,但是当使用了一段时间(都是隔夜)之后再次解析之前的域名发现解析不了,查看日志/var/log/messages,发现如下错误信息:

localhost named[42406]: mysql driver unable to return result set for findzone query

经查询资料得知是因为dlz在连接mysql之后,由于连接的空闲时间达到mysql的最大空闲时间,被mysql强行断开导致无法再从mysql获取数据。关键是DLZ在断开之后不会重连,这就不得不重启named服务重新与mysql建立连接了。

但明显这个办法不靠谱,想到的解决方案大概有下面几种:

1.更换成其他数据库

2.修改wait_timeout为更大值,24天左右

3.重启named服务

4.保持连接的使用,定期进行查询

5.修改dlz源码,加入数据库重连功能

更换数据库暂时不考虑;修改mysql的wait_timeout也不能解决根本问题;第3个就不说了;第四个我试了下,写了一个脚本定时请求bind解析域名,想让连接不超时,但是最后证明这种办法不行,不知道是不是方式不对;最后一种是实在没有办法了,硬着头皮打开了源码。。。

解决方案

。。。好吧,没有想象中的那么难,找到bind-9.6.0-P1/contrib/dlz/drivers/dlz_mysql_driver.c,大致读了下,配合资料 C中MySQL自动重新连接(部分zz),在dlz_mysql_driver.c的mysql_create函数中加入了重连的代码,完整函数内容:

/*%

* create an instance of the driver. Remember, only 1 copy of the driver's

* code is ever loaded, the driver has to remember which context it's

* operating in. This is done via use of the dbdata argument which is

* passed into all query functions.

*/

static isc_result_t

mysql_create(const char *dlzname, unsigned int argc, char *argv[],

void *driverarg, void **dbdata)

{

isc_result_t result;

dbinstance_t *dbi = NULL;

char *tmp = NULL;

char *dbname = NULL;

char *host = NULL;

char *user = NULL;

char *pass = NULL;

char *socket = NULL;

int port;

MYSQL *dbc;

char *endp;

int j;

unsigned int flags = 0;

//新增部分:定义了一个value

char value = 1;

UNUSED(driverarg);

UNUSED(dlzname);

...

tmp = getParameterValue(argv[1], "space=");

if (tmp != NULL) {

if (strcasecmp(tmp, "ignore") == 0)

flags = flags | CLIENT_IGNORE_SPACE;

isc_mem_free(ns_g_mctx, tmp);

}

//新增部分:重连的代码

/* reconnect to mysql */

result = mysql_options((MYSQL *)dbi->dbconn, MYSQL_OPT_RECONNECT, (char *)&value);

if( result != 0 )

{

isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,

DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,

"mysql_options reconnect failed!");

result = ISC_R_FAILURE;

goto full_cleanup;

}

dbc = NULL;

host = getParameterValue(argv[1], "host=");

user = getParameterValue(argv[1], "user=");

pass = getParameterValue(argv[1], "pass=");

socket = getParameterValue(argv[1], "socket=");

for (j=0; dbc == NULL && j < 4; j++)

dbc = mysql_real_connect((MYSQL *) dbi->dbconn, host,

user, pass, dbname, port, socket,

flags);

/* let user know if we couldn't connect. */

if (dbc == NULL) {

isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,

DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,

"mysql driver failed to create "

"database connection after 4 attempts");

result = ISC_R_FAILURE;

goto full_cleanup;

}

...

}

改完之后重新编译安装就好了,经过测试,第二天来发现域名仍然可以正常解析。问题暂时解决,后面再观察一下。

bind9 dlz mysql_bind9+dlz+mysql连接断开问题相关推荐

  1. bind9 dlz mysql_Bind9和MySQL DLZ缓冲区错误

    我已经使用DLZ与CentOS 7进行了绑定.我没有得到影响你的错误. 我意识到这是一个较旧的帖子,但我想我会分享我的conf文件,并配置选项. 我正在使用Bind 9.11.0 配置 ./confi ...

  2. mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案

    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 参考文章: (1)mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 (2)https://www.cnbl ...

  3. mysql数据库断开连接_解决mysql服务器在无操作超时主动断开连接的情况

    我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询 ...

  4. 如何减少mysql的连接时间_mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案...

    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 更新时间:2012年11月29日 20:27:52   作者: MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,My ...

  5. mysql自动断开该连接解决方案

    mysql自动断开该连接解决方案 参考文章: (1)mysql自动断开该连接解决方案 (2)https://www.cnblogs.com/xxsl/p/7146292.html 备忘一下.

  6. mysql killed进程不结束_php和mysql连接方式(短 长 池)

    一个php work进程只能处理一个请求,当完成一个请求了,才能处理下一次的请求 2.短连接: 执行到php关闭mysql连接的代码时,就断开,否则在处理本次请求结束的时候,释放mysql连接 实验: ...

  7. nginx和mysql链接_nginx转发mysql连接

    场景: 访问UAT环境,只能使用客户电脑访问,太难用了,于是就需要在自己电脑上跑代码,通过客户电脑中转来访问uat环境的数据库. 选用nginx进行转发.配置如下: stream { upstream ...

  8. mysql内连接和外连接的区别_Swoole4创建Mysql连接池

    一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...

  9. 如何解决MySQL连接超时关闭

    最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...

最新文章

  1. 西工大与东北大学计算机,国内世界高水平大学排名:西北工业大学位居第一,东北大学排第二...
  2. java在进行修改时报400_java开发注册群组报错400
  3. 膜拜大丹(结论+二元环)
  4. LeetCode 320. 列举单词的全部缩写(回溯/位运算)
  5. hadoop--MapReduce概述
  6. Pentium 4处理器架构/微架构/流水线(1) - 概述
  7. js基础——cssText
  8. 金山词霸”屏幕取词技术揭密(讨论稿)
  9. layui 之button 事件绑定的一种方法
  10. Svn与Git的优缺点(最通俗的话)
  11. MOD函数的使用方法
  12. 结构化数据、半结构化数据、非结构化数据
  13. win10安装MinGW-64
  14. 极智AI | 一文看懂昇腾达芬奇架构计算单元
  15. matlab z反变换长除法,[例2-6] 试用长除法求 z反变换。.ppt
  16. matlab 串口实时接收数据 绘图
  17. winform零基础学习(二)—TextBox控件+Lable控件
  18. java计算机毕业设计汽车租赁平台的设计与实现源码+数据库+lw文档+系统
  19. Object的属性和静态方法
  20. 高端计算机教室,智慧教室和传统教室大比拼

热门文章

  1. 如何利用SEO方式使网站增加流量
  2. 可视化大屏设计尺寸_UI设计中大屏可视化设计尺寸指南
  3. 怎样使用计算机操作,鼠标操作怎么用?电脑鼠标操作图文教程
  4. openGauss亮相VLDB2020,展示内存优化研究成果
  5. 怎么把视频制作成GIF动态图?这几种制作方法很简单
  6. 隐私计算秘密学-秘密分享
  7. 3轴码垛机械臂运动学逆解
  8. 如何快速三个月成为一个领域的高手的四个方法
  9. iPhone与win10传输大文件,使用局域网
  10. 点餐必须扫码属违法!法院刚判了:过度收集个人隐私信息