Build distributed DNS Servers powered by MySQL

By on

正如我在 What is DNS 一文中写道,DNS 是个分布式数据库系统。为了保证每个地区的最低延迟,使用 MySQL 远程连接和提高 TTL 都不是一个好的解决方案。

鉴于分布式数据库有很多相关资料,本文不涉及分布式数据库的搭建,只提及如何将多个 pdns 实例和分布式数据库相结合

PowerDNS

PowerDNS 是自建 DNS 的一个非常理想的软件,它可以在 Liunx 上运行。

在安装之前,你应已在本地安装 mysql-client 和 mysql-server 并配置好主从数据库:

本文介绍的环境是 centos-release-7-4.1708.el7.centos.x86_64

首先需要安装 PowerDNS 的 yum 源,可参阅 PowerDNS repositories

$ yum install epel-release yum-plugin-priorities &&
$ curl -o /etc/yum.repos.d/powerdns-auth-41.repo https://repo.powerdns.com/repo-files/centos-auth-41.repo

然后安装 PowerDNS 和它的 mysql 后端

yum install pdns pdns-backend-mysql -y

配置好 PowerDNS,每一个 pdns 实例都应按如下配置

$ vim /etc/pdns/pdns.conf
launch=gmysql
gmysql-host=::1
gmysql-user=user
gmysql-dbname=dbname
gmysql-password=password
gmysql-dnssec=yes

如果要启用 ALIAS 记录还需另加两行

# resolver 是上游 DNS 的地址,8.8.8.8 是 Google 的公共 DNS
resolver=8.8.8.8:53
expand-alias=yes

Master and Slave

MySQL 可以有主从数据库,它的原理是当数据库有更改时记录到日志文件,从数据库根据日志文件进行相同的操作即可达到主从的效果。

可以参考 MySQL 数据库设置主从同步 - CSDN 博客 ,说得很详细。

我简单说一下如果你要新增一台从服务器,那么你应该经过 主数据库写锁定 -> sqldump 到文件 -> 从数据库从文件 sqldump -> 重新查看主数据库的指针并在从数据库配置 -> 关闭主数据库写锁定 这样的流程才不会出现遗漏或多余的记录。原因是主从关系只同步操作记录,并不会确保数据库完全一致。同时,你应仅在主数据中进行插入、删除等操作,否则不会被同步甚至出现 Primary Key 冲突。

启动 PowerDNS

$ systemctl start pdns
$ systemctl enable pdns