keepalived virtual_server - keepalived 상자에만 응답합니다.

keepalived virtual_server - keepalived 상자에만 응답합니다.

나는 3개의 서버(아직 라우팅 없음)로 구성된 플랫 네트워크를 가지고 있으며, 각 서버에는 0.0.0.0(ip_nonlocal_bind 및 ip_forward 켜짐)에서 수신 대기하고 keepalived를 실행하는 서비스(http, mysqld, 중요하지 않음)가 있습니다.

virtual_server 10.0.0.80 3306 {
  delay_loop 2
  lb_algo rr
  lb_kind DR
  protocol TCP

  real_server 10.0.0.81 3306 {
    weight 10
    TCP_CHECK {
     connect_timeout 1
    }
  }

  real_server 10.0.0.82 3306 {
    weight 10
    TCP_CHECK {
      connect_port    3306
      connect_timeout 1
    }
  }

  real_server 10.0.0.83 3306 {
    weight 10
    TCP_CHECK {
      connect_port    3306
      connect_timeout 1
    }
  }
}

keepalived(서비스로)는 모든 상자에서 작동하고 실패합니다. 그러나 virtual_server는 현재 IP가 있는 keepalived 상자의 페이지(또는 데이터베이스 쿼리 등)만 제공하며 나머지 2/3의 시간(가중 평균)에서는 실패합니다.

예: BOX1에 연결 유지 주소가 있는 경우 요청은 WORK, FAIL, FAIL을 반복하며 "box1"로만 응답합니다. BOX2가 연결 유지 주소로 사용되면 요청은 FAIL, WORK, FAIL이 되며 "box2"만 응답됩니다.

유지되지 않은 IP 상자는 연결 유지 IP로 응답해야 한다는 것을 소유하지 않거나 알지 못하기 때문에 쿼리에 대한 응답을 거부한다고 확신합니다. 유지되지 않는 상자가 항상 응답하도록 만드는 방법은 무엇입니까?

이것이 내 첫 번째 연결 유지 설정은 아니지만 첫 번째 virtual_server 설정입니다. 로드 밸런서만 필요하고 HAProxy에서 제공하는 고가용성은 필요하지 않습니다.

답변1

도와 주셔서 감사합니다serverfault.com 질문에서내 문제를 해결할 수있었습니다.

짧은 답변:

가상 인터페이스에 가상 IP를 추가 net.ipv4.conf.default.accept_source_route하고 0.

긴 답변:

가상 인터페이스의 목적은 서비스를 중지하고 시작할 필요 없이 연결 유지를 쉽게 비활성화/활성화/장애 조치하는 것입니다. VIP를 다른 서버로 장애 조치하려면 가상 인터페이스를 위나 아래로 이동하기만 하면 됩니다.

저는 이 일을 쉽게 하기 위해시스템 서비스 생성부르다 /usr/local/src/dummy.service.

[Unit]
Description=Create dummy network interface
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dummy0 up
ExecStop=/usr/sbin/ip link set dummy0 down
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

그런 다음 활성화하십시오.

# systemctl enable /usr/local/src/dummy.service

또한 가상 모듈 드라이버를 로드했습니다.

문서 /etc/modules-load.d/dummy.conf:

dummy

문서 /etc/modprobe.d/dummy.conf:

alias dummy0 dummy
options dummy numdummies=1

shutdown -r now이 시점에서 작동한다는 것을 증명하는 것이 더 쉽다고 생각하지만 원하는 경우 modprobe를 다시 로드할 수 있습니다.

그러면 새로운 인터페이스가 표시됩니다.

# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 12:23:34:45:56:7a brd ff:ff:ff:ff:ff:ff
       valid_lft forever preferred_lft forever

keepalived.conf내 vrrp_instance를 추적하고 있습니다 .

vrrp_instance mysql {
  ...
  track_interface {
    dummy0
  }
  ...
}

이것은 내 작업에서 변화가 필요한 것입니다.

dummy0인터페이스 에 VIP IP 주소를 추가해야 합니다 . 수정 /usr/local/src/dummy.service# systemctl daemon-reload

ExecStart=/usr/sbin/ip link set dummy0 up && ip addr add 10.0.0.100 dev dummy0

모든 네트워크 장치가 쿼리에 응답한 다음 재부팅할 수 있도록 소스 라우팅이 활성화되어 있지 않은지 확인해야 합니다.

 # cat "net.ipv4.conf.default.access_source_route = 0" > /etc/sysctl.d/10-keepalived.conf

완전성을 위해 내 전체 내용은 다음과 같습니다 /etc/sysctl.d/10-keepalived.conf.

net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.conf.eno16777736.arp_ignore = 1
net.ipv4.conf.eno16777736.arp_announce = 2
net.ipv4.conf.eno16777736.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 0

관련 정보