keepalived virtual_server - keepalived ボックスにのみ応答します。

keepalived virtual_server - keepalived ボックスにのみ応答します。

私は3つのサーバー(まだルーティングなし)で構成されたフラットネットワークを持っています。

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

おすすめ記事