早期搭建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文件方便多了。