Доменные контролеры часто выполняют функцию и корпоративного DNS-сервера, что может привести к их повышенной нагрузке или даже перезагрузке ОС. Но эта роль важна, т.к. при авторизации в домене динамически заводятся A и PTR записи авторизованных в домене компьютеров и серверов. Для разгрузки AD DC от частых DNS запросов можно использовать кеширующий DNS-сервер (перед ним), но для того, чтобы сам кеш-DNS-сервер не стал точкой отказа, то их надо использовать 2, и для отслеживания их статуса, перед ними поставить UDP прокси-сервер. Проще это сделать на основе связки Nginx c keepalived. Keepalived кроме VRRP функционала должен также отслеживать статуc Nginx за счет постоянного выполнения скрипта (на основе "pidof nginx") или команды (killall -0 nginx) и тот и другой скрипт должны выдавать 0 в RC при наличии процесса.
Также на этих 2-х хостах необходимо установить по экземпляру DNS-cache "unbound" (или другой аналогичный) , который в свою очередь (но намного реже), обращается с DNS запросами к 2-м AD DC серверам.
В первой ноде Nginx (10.0.0.131) должны быть прописаны, как backend два кэш-сервера:
- 127.0.0.1:53 (экземпляр кеш-сервера на своей же машинке , что и UDP-proxy сервер)
- 10.0.0.132:53 (экземпляр кеш-сервера на другом участнике VRRP кластера)
на втором Nginx (10.0.0.132):
- 127.0.0.1:53 (экземпляр кеш-сервера на своей же машинке , что и UDP-proxy сервер)
- 10.0.0.131:53 (экземпляр кеш-сервера на другом участнике VRRP кластера)
VIP:10.0.0.130 (важно чтобы frontend слушал только VIP:53, т.к. настоящие IP:53 займет кеширующий сервер на этой машине)
Cкрипт (на основе "pidof"):
nano /bin/check_nginx.sh
#!/bin/sh
if [ -z "`pidof nginx`" ]; then
exit 1
fi
chmod 755 /bin/check_nginx.sh
вместо скрипта можно использовать только команду "killall -0 nginx"
тогда скрип с ОС заводить не надо.
=======================
Конфигурация Keepalived:
# (одинаковая для обоих хостов)
нужно проверить/убедиться что включена опция в ядре:
echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf && sysctl -p
#
global_defs {
# Keepalived process identifier
router_id nginx
}
# Script to check whether Nginx is running or not
vrrp_script check_nginx {
script "/bin/check_nginx.sh"
interval 2
}
# Virtual interface - The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
state BACKUP # if MASTER proirty 120
interface eth0
nopreempt
virtual_router_id 130
priority 110
# The virtual ip address shared between the two NGINX Web Server which will float
virtual_ipaddress {
10.0.0.130/24
}
track_script {
check_nginx
}
}
=============
конфигурация Nginx:
(установка модуля)
yum install nginx-mod-stream
#======
/etc/nginx/nginx.conf
...
events {
worker_connections 1024;
}
stream {
upstream backends {
zone backend 64k;
server 127.0.0.1:53 fail_timeout=1s;
server 10.0.0.131:53 fail_timeout=1s; #for another nginx ip will: 10.0.0.132
}
server {
listen 10.0.0.130:53 udp;
listen 10.0.0.130:53; # tcp
proxy_pass backends;
proxy_timeout 1s;
proxy_responses 1;
}
}
=====
Конфигурация unbound:
(обоих)
...
server:
interface: 127.0.0.1
access-control: 127.0.0.0/8 allow
interface: 10.0.0.131 # for another node 10.0.0.132
access-control: 10.0.0.0/8 allow
cache-max-ttl: 14400
cache-min-ttl: 3600
hide-identity: yes
hide-version: yes
minimal-responses: yes
prefetch: yes
prefetch-key: yes
msg-cache-size: 50m
msg-cache-slabs: 2
rrset-cache-size: 100m
rrset-cache-slabs: 2
key-cache-size: 128m
key-cache-slabs: 2
qname-minimisation: yes
...
forward-zone:
name: "."
forward-addr: 10.0.0.2
forward-addr: 10.0.0.3
forward-first: yes