早期搭建Hadoop集群的时候,在做主机和IP解析的时候,通常的做法是写hosts文件,但是Hadoop集群大了以后做hosts文件很麻烦,每次加新的服务器都需要整个集群重新同步一次hosts文件,另外,如果在同一个域下面做两个集群,做distcp,也需要把两个集群的hosts文件全写完整并完全同步,很麻烦。那么,一劳永逸的办法就是做DNS。DNS我这边已经用了很长时间了,几年前为了学这个还专门买了一本巨厚的BIND手册。


做DNS服务器最常用的就是BIND,ISC开发并维护的开源系统。


以centos6为例,使用BIND 9.8.2,在域名解析服务器上安装bind和域名正反向查询工具

yum install bind bind-utils

安装完成后,配置文件在 /etc/named.conf,域名数据文件通常我们会放在 /var/named,配置文件不是很复杂。留一个小问题,172.16.0.0/18写成子网掩码应该写多少?在该子网内可用的IP地址范围是多少?


/etc/named.conf

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        listen-on port 53 { 172.16.0.2; }; //监听内网地址53端口, ns1要改成172.16.0.1
//      listen-on-v6 port 53 { ::1; }; //不监听IPv6
        directory       "/var/named"; //DNS数据文件存储目录
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { 172.16.0.0/18; }; //允许172.16.0.0/18的子网IP主机进行查询,任意主机写any;
        recursion yes; //允许递归查询

        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

zone "hadoop" IN { //我们的hadoop域
        type master;
        file "hadoop.zone"; 
};

zone "16.172.in-addr.arpa" IN { 
        type master;
        file "172.16.zone"; 
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";


然后是正向解析文件 /var/named/hadoop.zone

$TTL 600
$ORIGIN hadoop.
@       IN      SOA     ns1     root ( ;SOA部分必写
        0; Serial
        1D; Refresh
        1H; Retry
        1W; Expire
        3H); Negative Cache TTL

@       IN      NS      ns1.hadoop.
@       IN      NS      ns2.hadoop.
;用两台namenode同时担负nameserver,反正namenode平时也没什么具体事干,DNS查询走udp端口,不会对 namenode造成压力
;另外一个原因是namenode基本不会挂,而DN等服务器比较容易挂,所以NN同时做NS也更稳定,当然,有钱可以单独购置NS服务器,土豪请随意。
;两台namenode一起
ns1             IN      A       172.16.0.1
ns2             IN      A       172.16.0.2

;两台正向解析服务器的A记录,至于A, CNAME, MX等含义不解释了。

namenode-01     IN      A       172.16.0.1
namenode-02     IN      A       172.16.0.2
;服务器的A记录


反向解析文件 /var/named/172.16.zone

反向解析文件里需要把IP地址的顺序倒过来写,例如,172.16.0.1在反向文件里要写成1.0.16.172,所以,文件名命名为16.172.zone更符合规则。

$TTL 600
@ IN SOA namenode-01.hadoop. root.namenode-01.hadoop. ( //SOA部分必写
        0; Serial
        1D; Refresh
        1H; Retry
        1W; Expire
        3H); Negative Cache TTL
; 反向解析文件里不能有$ORIGIN,所以在下面先写上全部主机名
@       IN      NS      ns1.hadoop.
@       IN      NS      ns2.hadoop.

1.0     IN      PTR     ns1.hadoop. 
2.0     IN      PTR     ns2.hadoop.
1.0     IN      PTR     namenode-01.hadoop.
2.0     IN      PTR     namenode-02.hadoop.

全部完成后执行

chkconfig --add named
service named restart


接下来在所有主机的/etc/resolv.conf文件中添加

nameserver 172.16.0.1
nameserver 172.16.0.2


然后删除所有主机中的hosts文件内容,只保留127.0.0.1

用nslookup测试一下

[root@namenode-01 named]# nslookup 
> set q=A
> namenode-02.hadoop
Server:         172.16.0.1
Address:        172.16.0.1#53
#正向查询
Name:   namenode-02.hadoop
Address: 172.16.0.2
> set q=PTR
> 172.16.0.2
Server:         172.16.0.1
Address:        172.16.0.1#53
#反向查询
2.0.16.172.in-addr.arpa name = namenode-02.hadoop.

####然后关闭ns1的DNS服务进行测试。

[root@namenode-01 named]# service named stop
停止 named:.                                              [确定]
[root@namenode-01 named]# nslookup          
> set q=A
> namenode-01.hadoop
Server:         172.16.0.2
Address:        172.16.0.2#53

Name:   namenode-01.hadoop
Address: 172.16.0.1
> set q=PTR
> 172.16.0.1
Server:         172.16.0.2
Address:        172.16.0.2#53

1.0.16.172.in-addr.arpa name = namenode-01.hadoop.

这样,做好了Namenode高可用,也勉强算是做好了DNS的高可用,集群中任意一台Namenode挂机,也不会影响整个集群的正常服务,新买的服务器只需要装好操作系统,在/etc/resolv.conf里面设置两个nameserver的IP地址即可,这就比hosts文件方便多了。