ubuntu 上的 bind9 dlz/mysql 段错误 libmysqlclient.so

ubuntu 上的 bind9 dlz/mysql 段错误 libmysqlclient.so

我遇到了一个大问题。我将 bind9 名称服务器安装到三台不同的计算机上。两台 Ubuntu 10.04.4 LTS,一台 Ubuntu 11.10

我使用这种方法编译了9.7.0、9.7.3、9.9.0:

./configure --prefix=/usr --sysconfdir=/etc/bind --localstatedir=/var \
--mandir=/usr/share/man --infodir=/usr/share/info \
--enable-threads --enable-largefile --with-libtool --enable-shared --enable-static \
--with-openssl=/usr --with-gssapi=/usr --with-gnu-ld \
--with-dlz-mysql=yes --with-dlz-bdb=no \
--with-dlz-filesystem=yes --with-geoip=/usr

make

make install

在设置 dlz/mysql 后,BIND 服务器运行正常,直到 5-30 分钟后才出现段错误。

我使用一个简单的进程看门狗暂时解决了这个问题,如果命名进程停止了,看门狗就会重新启动它,但从长远来看这不是一个好主意。

我的日志输出是:

消息:

Apr 13 19:33:51 dnsvm kernel: [    8.088696] eth0: link up
Apr 13 19:33:58 WATCHDOG: named not running. Restarting
Apr 13 19:35:08 dnsvm kernel: [   87.082572] named[1027]: segfault at 88 ip b71c4291 sp b5adfe30 error 4 in libmysqlclient.so.16.0.0[b714e000+1aa000]
Apr 13 19:35:08 WATCHDOG: named not running. Restarting
Apr 13 19:35:08 dnsvm kernel: [   87.457510] named[1423]: segfault at 68 ip b71d6122 sp b52f0a40 error 4 in libmysqlclient.so.16.0.0[b7160000+1aa000]
Apr 13 19:35:09 WATCHDOG: named not running. Restarting
Apr 13 19:41:56 dnsvm kernel: [  494.838206] named[1448]: segfault at 88 ip b731c291 sp b5436e30 error 4 in libmysqlclient.so.16.0.0[b72a6000+1aa000]
Apr 13 19:41:57 WATCHDOG: named not running. Restarting
Apr 13 19:57:26 dnsvm kernel: [ 1424.023409] named[2976]: segfault at 88 ip b72d1291 sp b6beee30 error 4 in libmysqlclient.so.16.0.0[b725b000+1aa000]
Apr 13 19:57:26 WATCHDOG: named not running. Restarting
Apr 13 20:11:56 dnsvm kernel: [ 2294.324663] named[6441]: segfault at 88 ip b7357291 sp b6473e30 error 4 in libmysqlclient.so.16.0.0[b72e1000+1aa000]
Apr 13 20:11:57 WATCHDOG: named not running. Restarting

系统日志: http://pastebin.com/hjUyt8gN

第一台服务器是本机的普通 x64 服务器 (u1004lts),第二台是虚拟化服务器 (u11.10),第三台也是虚拟化服务器 (10.04lts)。这些服务器仅用于提供 mysql 服务器数据库的 dns。但问题出在所有服务器和所有绑定版本上。

命名的.conf: http://pastebin.com/zwm1yP7V

有人能帮助我吗,或者有什么好主意吗?

答案1

问题:(来自http://bind-dlz.sourceforge.net/mysql_driver.html

MySQL 驱动程序还有一个额外的限制。MySQL 在其 C API 中使用线程本地存储。因此,MySQL 要求应用程序的每个线程都执行 MySQL“线程初始化”来设置线程本地存储。在 DLZ 驱动程序 API 中,不可能安全地执行此操作。这是由 MySQL 而不是 DLZ API 造成的限制。因此,在使用 MySQL 驱动程序时,BIND 必须仅以单线程运行。要确保 BIND 以单线程运行,请在启动 BIND(命名)时在命令行上传递“-n 1”。这不应该是大多数 UN*X 系统的限制,因为 BIND 通常是单线程编译的(有一些例外)。即使 BIND 被编译为支持线程,在命令行上传递“-n 1”也会导致它使用单线程。此外,如果 MySQL 驱动程序被编译到 BIND 中但未使用,则不需要“-n 1”。只有在使用 MySQL 驱动程序时才需要“-n 1”命令行参数。

解决:

nano /etc/defaults/bind9

并修改此行:

# startup options for the server
OPTIONS="-u bind"

到:

# startup options for the server
OPTIONS="-u bind -n 1"

重新启动 DNS 服务器。

相关内容