2012年4月17日星期二

DNS 主从同步的NOTIFY机制

DNS的NOTIFY机制是主从同步使用的,master所控制的zone的序列号变动了以后,会主动通知slave更新,详情可见rfc1996 

1 过程
master slave使用 udp 53端口进行通讯,首先 master 向 slave 的udp53发送一个NOTIFY请求包,slave接收后,向master的udp53发送一个NOTIFY响应包,然后 slave 连接到 master 查询SOA信息,根据序列号判断是否请求进行IXFR传输。

2 相关配置
NOTIFY 的对象默认是有变动的zone的所有NS记录。除此之外,在bind中还通过配置also-notify 指定需要将NOTIFY请求发送到哪些服务器,这些服务器被称为 Stealth Server。bind中还有个配置选项notify,取值可以为yes,no,explicit。yes是默认选项,no表示不发送NOTIFY请求,explicit表示仅发送NOTIFY请求给also-notify中的服务器。

master如果配置了多个IP,则可以通过 notify-source 指定源IP地址。否则如果slave配置了其它的IP为自己的master,则会造成slave误以为收到了错误的NOTIFY请求而无法同步。(rfc1996 3.10)为保证安全,还可以配置allow-notify,来限制哪些master可以向本机发送NOTIFY请求。

如果使用udp进行通讯,master为了避免同时并发量太高,会间隔一段时间(60秒)再发送NOTIFY请求,如果发送请求次数超过5次,则不再向slave发送NOTIFY请求。但是在bind中,我未发现配置选项。

如果配置了多个master,这些master数据由于延时原因可能会不一致,因此slave会向发送NOTIFY请求的master进行同步。

slave 收到相同的NOTIFY请求后,在本次更新结束前,将暂缓响应其它的NOTIFY请求。

2012年4月8日星期日

shell 按行读取变量的值或者命令的输出

shell 中可以使用 while 按行读取一个文件,同时也可以使用 while 按行读取一个变量的值,或者一个命令的输出。方法有4种,分别是进程替换,管道,here document 和here string.

进程替换:  

#! /bin/bash
var=$(cat urfile)
echo "Process Substitution"
while read line
do
    echo "$line"
done < <(echo "$var")

管道:

#! /bin/bash
var=$(cat urfile)
echo "Pipe"
echo "$var" | while read line
do
    echo "$line"
done

here document:

#! /bin/bash
var=$(cat urfile)
echo "Here Document"
while read line
do
    echo "$line"
done <<EOF
$var
EOF


here string:

#! /bin/bash
var=$(cat urfile)
echo "Here String"
while read line
do
    echo "$line"
done <<< "$var"