前言

关于bind-dlz介绍:http://bind-dlz.sourceforge.net/

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

  1. BIND从文本文件中获取数据,这样容易因为编辑错误出现问题。
  2. BIND需要将数据加载到内存中,如果域或者记录较多,会消耗大量的内存。
  3. BIND启动时解析Zone文件,对于一个记录较多的DNS来说,会耽误更多的时间。
  4. 如果近修改一条记录,那么要重新加载或者重启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;
} ...
}

附上mysql关于c语言的官方文档: https://dev.mysql.com/doc/refman/5.6/en/mysql-real-connect.html

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

bind9+dlz+mysql连接断开问题的更多相关文章

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

    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 作者: MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断 ...

  2. MySql连接空闲8小时自动断开引起的问题

    一.问题描述 ​ 最近遇到了一个奇怪的MySql数据库问题,好几次前一天晚上历史数据还正常存储,第二天早上来了看实时数据存储还正常,历史数据不存储了.找了好久也没找到问题.后来仔细想了想,历史数据设置 ...

  3. 解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题

    解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题 最近有个问题非常讨厌,我们的工程中使用自己的连接池连接mysql数据库,可mysql数据库每隔8小时就会自动断开所有链接, ...

  4. 转DNS DLZ +MYSQL

    关于bind的软件介绍这里就不讲解了 大家都知道是干嘛的  这里多介绍一下DLZ这个东西 大家都知道维护bind的时候 如果想新增一个zone 需要vim 编辑添加 这样.....然后bind启动后从 ...

  5. 一则线上MySql连接异常的排查过程

    Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过程中 ...

  6. bind+dlz+mysql实现区域记录动态更新

    BIND-DLZ实验:http://bind-dlz.sourceforge.net/ 实验环境:RHEL4,BIND-9.5.0-P2.tar.gz(9.4.0以上版本都已含DLZ补丁),Mysql ...

  7. MySQL连接问题浅析

    MySQL的客户端,无论是PHP或者Java,都会发起多个连接来提高系统的吞吐量.在云里面的服务器,因为一些设计和实现上的不同,有一些问题被放大了,同时也带了一些新的问题. 连接的超时时间 在Azur ...

  8. MySQL 连接

    MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库. 实例 以下是从命令行中连接mysql服务器的简单实例: [root@ ...

  9. MySql连接异常解决

    这两天遇到一个mysql连接的问题,找人弄了好几天也没弄好,先看一下报错信息: ============================================================ ...

随机推荐

  1. 机器学习笔记——k-近邻算法(一)简单代码

    一 import numpy as np ##初始化数据 T = [[3, 104, -1], [2, 100, -1], [1, 81, -1], [101, 10, 1], [99, 5, 1], ...

  2. Burp_Suite_Pro_v1.7.*激活

    先下载工具: 链接:https://pan.baidu.com/s/1ZLvg8eqkgWI94FtrhkcTxg 提取码:9z1j 工具运行需要Java环境.解压完后双击keygen   填一下Li ...

  3. 【FFMEPG】windows下编译ffmpeg2.5——使用VS2013,ARMLINUX,ANDORID编译ffmpeg

    原文:http://blog.csdn.net/finewind/article/details/42784557 一.准备: 1. 本机环境: win7 64bit: 2. 安装MinGW到C:\M ...

  4. 使用jbc查询数据封装成对象的工具类

    适用于获取Connection对象的util package com.briup.myDataSource; import java.io.FileReader; import java.io.Inp ...

  5. MyBatis使用小结

  6. (十七)使用JDBC进行批处理

    目录 业务场景: 第一种方式 第二种方式 批处理中的 update() 方法 注意事项 备注: 业务场景: 当需要向数据库中发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的 ...

  7. 洛谷 P4198 楼房重建 线段树维护单调栈

    P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...

  8. PHP无限极菜单

    权限表结构 CREATE TABLE `blog_auth` ( `id` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '序号', `pid` ) NOT N ...

  9. CentOS7 PHP cURL errno 35, 原因:CentOS7中没有安装curl和OpenSSL的最新版

    安装OpenSSL的最新版 话不多说,直接上安装步骤 #cd /usr/local/src # 跳过证书获取失败 # wget https://www.openssl.org/source/opens ...

  10. fastdfs 集群搭建

    1.部署FastDFS及Nginx (本套FastDFS为简化版安装部署,只需解压至普通用户家目录下或者任意目录,解压后修改脚本,执行脚本后即可使用.) 说明:FastDFS分为tracker(默认端 ...