Прежде всего позвольте мне уточнить, что я просто разработчик программного обеспечения, а не администратор, поэтому у меня есть некоторые знания (скажем, базовое понимание концепций) в отношении сетевой конфигурации, а также этих типов настройки, но я не ась, так что потерпите меня, если это звучит глупо или неразумно.
Я пытаюсь настроить keepalived на RH7 для балансировки запросов NDS между двумя серверами, на которых была настроена привязка. В руководствах, которые я читал, они, кажется, используют 2 NIC, но У меня только один доступный.
Ссылки:
HW:
У меня есть 3 машины в одной сети, настроенные следующим образом:
Также включена переадресация net.ipv4.ip_forward = 1
Конфигурация Keepalived:
! This is a comment
! Configuration File for keepalived
global_defs {
! this is who emails will go to on alerts
notification_email {
admins@example.com
fakepager@example.com
! add a few more email addresses here if you would like
}
notification_email_from admins@example.com
! I use the local machine to relay mail
smtp_server 127.0.0.1
smtp_connect_timeout 30
! each load balancer should have a different ID
! this will be used in SMTP alerts, so you should make
! each router easily identifiable
lvs_id LVS_EXAMPLE_01
}
! vrrp_sync_groups make sure that several router instances
! stay together on a failure - a good example of this is
! that the external interface on one router fails and the backup server
! takes over, you want the internal interface on the failed server
! to failover as well, otherwise nothing will work.
! you can have as many vrrp_sync_group blocks as you want.
vrrp_sync_group VG1 {
group {
VI_1
VI_GATEWAY
}
}
! each interface needs at least one vrrp_instance
! each vrrp_instance is a group of VIPs that are logically grouped
! together
! you can have as many vrrp_instaces as you want
vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
! each virtual router id must be unique per instance name!
virtual_router_id 51
! MASTER and BACKUP state are determined by the priority
! even if you specify MASTER as the state, the state will
! be voted on by priority (so if your state is MASTER but your
! priority is lower than the router with BACKUP, you will lose
! the MASTER state)
! I make it a habit to set priorities at least 50 points apart
! note that a lower number is lesser priority - lower gets less vote
priority 150
! how often should we vote, in seconds?
advert_int 1
! send an alert when this instance changes state from MASTER to BACKUP
smtp_alert
! this authentication is for syncing between failover servers
! keepalived supports PASS, which is simple password
! authentication
! or AH, which is the IPSec authentication header.
! I don't use AH
! yet as many people have reported problems with it
authentication {
auth_type PASS
auth_pass example
}
! these are the IP addresses that keepalived will setup on this
! machine. Later in the config we will specify which real
! servers are behind these IPs
! without this block, keepalived will not setup and takedown the
! any IP addresses
virtual_ipaddress {
192.168.0.10
! and more if you want them
}
}
! now I setup the instance that the real servers will use as a default
! gateway
! most of the config is the same as above, but on a different interface
vrrp_instance VI_GATEWAY {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 52
priority 150
advert_int 1
smtp_alert
authentication {
auth_type PASS
auth_pass example
}
virtual_ipaddress {
192.168.0.11
}
}
! now we setup more information about are virtual server
! we are just setting up one for now, listening on port 53 for dns
! requests.
! notice we do not setup a virtual_server block for the 192.168.0.10
! address in the VI_GATEWAY instance. That's because we are doing NAT
! on that IP, and nothing else.
virtual_server 192.168.0.10 53 {
delay_loop 6
! use round-robin as a load balancing algorithm
lb_algo rr
! we are doing NAT
lb_kind NAT
nat_mask 255.255.255.0
protocol TCP
! there can be as many real_server blocks as you need
real_server 192.168.0.2 53 {
! if we used weighted round-robin or a similar lb algo,
! we include the weight of this server
weight 1
! here is a health checker for this server.
! we could use a custom script here (see the keepalived docs)
! but we will just make sure we can do a vanilla tcp connect()
! on port 53
! if it fails, we will pull this realserver out of the pool
! and send email about the removal
TCP_CHECK {
connect_timeout 3
connect_port 53
}
}
real_server 192.168.0.3 53 {
! if we used weighted round-robin or a similar lb algo,
! we include the weight of this server
weight 1
! here is a health checker for this server.
! we could use a custom script here (see the keepalived docs)
! but we will just make sure we can do a vanilla tcp connect()
! on port 53
! if it fails, we will pull this realserver out of the pool
! and send email about the removal
TCP_CHECK {
connect_timeout 3
connect_port 53
}
}
}
Вывод:
Брандмауэр отключен, и связь между машинами работает нормально, keepalived может проверять простое TCP-соединение с мастерами DNS. Я также могу выполнить dig myhost @192.168.0.2/3
от балансировщика нагрузки, и я получаю правильные результаты.
Однако при запуске dig myhost @192.168.0.10
Я получаю ;; connection timed out; no servers could be reached
. Я был бы признателен за любые подсказки или предложения, которые помогут мне решить эту проблему, если это возможно даже с 1 сетевой картой, и сообщите мне, если требуются дополнительные сведения.
После еще нескольких поисков в Google мне пришло в голову, что, возможно, помимо TCP требуется еще и UDP, и это действительно так (примечание для себя: возможно, это помогло бы, если бы я использовал tcpdump / tshark ...):
Транспортный протокол
DNS в основном использует протокол пользовательских дейтаграмм (UDP) на порту 53 для обслуживания запросов. DNS-запросы состоят из одного UDP-запроса от клиента, за которым следует один UDP-ответ от сервера. Протокол управления передачей (TCP) используется, когда размер данных ответа превышает 512 байт, или для таких задач, как передача зон. Некоторые реализации преобразователя используют TCP для всех запросов.
То же самое предлагает эта старая статья относительно Балансировка нагрузки DNS с помощью keepalived написано в 2006 году.
Как следствие, я добавил следующую конфигурацию UDP к тому, что уже было:
virtual_server 192.168.0.10 53 {
delay_loop 6
! use round-robin as a load balancing algorithm
lb_algo rr
! we are doing NAT
lb_kind NAT
nat_mask 255.255.255.0
protocol UDP
! there can be as many real_server blocks as you need
real_server 192.168.0.2 53 {
! if we used weighted round-robin or a similar lb algo,
! we include the weight of this server
weight 1
}
real_server 192.168.0.3 53 {
! if we used weighted round-robin or a similar lb algo,
! we include the weight of this server
weight 1
}
}
Примечание: в Мини-инструкция LVS в формате PDF был Попался:
2.2. Подводка: вам нужен внешний клиент (директор и реальные серверы не могут получить доступ к виртуальному сервису)
Поскольку PDF-файл тоже кажется старым (2006 г.), это уже не так. Теперь я могу копать землю от самого балансировщика нагрузки, однако при использовании другого клиентского компьютера из той же сети я получаю ;; reply from unexpected source: 192.168.0.2#53, expected 192.168.0.10#53
. Я попробовал следующее предложение от этот вопрос, но пока не получилось:
sysctl -w net.ipv4.ip_forward = 1
sysctl -w net.ipv4.vs.conntrack = 1
iptables -t nat -A РАЗМЕЩЕНИЕ -j МАСКЕРАД
Из того, что я собрал до сих пор, это может иметь какое-то отношение к топологии сети и настройке NAT, но мне еще предстоит выяснить это.
Похоже, мне еще нужно заняться серфингом, но, по крайней мере, у меня есть с чем поработать, и теперь я знаю, что 1 NIC достаточно для балансировки нагрузки 2 DNS-серверов (по крайней мере, для тестов, которые я сейчас выполняю).