bind主备同步的关键配置

DNS系统中,在大家的直观印象下bind主备的同步都是“实时”的。实际上主备同步的速度有诸多的瓶颈。
对于master而言:
1. 是否有delay notify消息,这个配置是 notify-delay,默认是5s,有必要的话是需要缩短的。
2. transfers-out 限制同时允许区传输的数量,默认是10,如果slave多,zone多需要调大。
3. serial-query-rate 对于master而言会限制master给slave发送notify的速度,默认是20,需要调大。
对于slave而言:
1. transfers-per-ns限制了从单个master同步的并发,默认也是10,需要调大。
2. transfers-in 限制了同时从master(可能有多个)同步的总数,默认是10,需要调大。
3. serial-query-rate 在slave中会限制slave向mastetr做SOA查询的频率。默认是20,需要调大。

最近在排查主备同步延迟的case上,发现bind 9.9.x,9,10.2都存在bug,serial-query-rate的配置不能生效。主要的原因就是 lib/dns/zone.c内
dns_zonemgr_setserialqueryrate这个函数里写死了notifyrate。

void
dns_zonemgr_setserialqueryrate(dns_zonemgr_t *zmgr, unsigned int value) {

    REQUIRE(DNS_ZONEMGR_VALID(zmgr));

    setrl(zmgr->refreshrl, &zmgr->serialqueryrate, value);

    /* Seperately controlled in BIND 9.11.x */
    /*XXXX*/
    setrl(zmgr->notifyrl, &zmgr->notifyrate, 20);
    setrl(zmgr->startupnotifyrl, &zmgr->startupnotifyrate, 20);                                                                                            

    /* XXXMPA seperate out once we have the code to support this. */
    setrl(zmgr->startuprefreshrl, &zmgr->startupserialqueryrate, value);
}

fix的方案就是把这2个地方的20改成value即可。

void
dns_zonemgr_setserialqueryrate(dns_zonemgr_t *zmgr, unsigned int value) {

    REQUIRE(DNS_ZONEMGR_VALID(zmgr));

    setrl(zmgr->refreshrl, &zmgr->serialqueryrate, value);

    /* Seperately controlled in BIND 9.11.x */
    /*XXXX*/
    setrl(zmgr->notifyrl, &zmgr->notifyrate, value);
    setrl(zmgr->startupnotifyrl, &zmgr->startupnotifyrate, value);                                                                                            

    /* XXXMPA seperate out once we have the code to support this. */
    setrl(zmgr->startuprefreshrl, &zmgr->startupserialqueryrate, value);
}

对于单个同步的case,可以从master域名更新、master触发notify,slave收到notify,slave开始同步,slave完成同步几个关键的时间点,查看时间到底消耗到哪里。

此条目发表在dns分类目录。将固定链接加入收藏夹。

发表评论