web-dev-qa-db-ja.com

キープアライブロードバランシングMySQL。バックアップサーバーのタイムアウト

ServerFaultの愛する人たち。負荷分散されたMySQLサーバーアレイをセットアップしようとしています(失敗しています)。私を啓発してください、私のやり方で私にエラーを見せてください。

現在のセットアップ:専用の固定IP(10.116.219.47および10.116.219.48)を備えた2つのMySQLサーバーと、keepalived(10.116.219.12)を使用して共有される1つの仮想IP。このセットアップは、フェイルオーバーの提供に成功しています。 DB1-serverをオフにすると、DB2-serverがすぐに引き継ぎます。 virtual_serverブロックを構成に追加するときだけ、物事が壊れ始めます。

DB1

vrrp_instance VI_2 {
    state MASTER

    interface eth0
    virtual_router_id 60
    priority 150

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 3S83hbt200SbwY6
    }
    virtual_ipaddress {
        10.116.219.12
    }
}

DB2

vrrp_instance VI_2 {
    state BACKUP

    interface eth0
    virtual_router_id 60
    priority 100

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 3S83hbt200SbwY6
    }
    virtual_ipaddress {
        10.116.219.12
    }
}

Keepalived構成に負荷分散を追加しようとしていますが、ここでDB2が応答を停止します。

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

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

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

仮想IP(10.116.219.12)に接続しようとすると、DB1からの正常な応答、またはDB2からのタイムアウトが交互に発生します。

これまでのデバッグ:

  • 固定IPに接続するMySQLは、DB1とDB2の両方で機能します。ファイアウォール/ MySQLバインディングは着信接続をブロックしていません。
  • DB1とDB2の両方でnet.ipv4.ip_forward = 1を設定します
  • TCP DB2のインバウンド接続をリッスンすると、試行が表示されます。(20:46:08.385786 IP 10.116.219.44.46211> 10.116.219.12.mysql)

したがって、DB2 MySQLサーバーが応答を拒否しているように見えます。これは、DB1がキープアライブマスターとして伝送しているため、着信パケットの宛先(共有仮想IP)がDB2サーバーに認識されていないためだと思います。

2
TuxM

直接ルーティングを使用しているため、仮想IPを両方のサーバーで同時に構成する必要があります。これを実現するには、セカンダリサーバーのループバックインターフェイスでVIP(10.116.219.12)を構成する2番目のvrrpインスタンスを作成します。接続がロードバランサーからセカンダリサーバーに転送される場合通常どおりeth0で応答します。

これを行う場合は、sysctlを介してソースルーティングを無効にする必要があります。例えば:

#ソースルーティングを受け入れない
 net.ipv4.conf.default.accept_source_route = 0 

さらに、ARPのアナウンス方法とリクエストへの応答方法を変更する必要があります( 詳細情報 ):

 net.ipv4.conf.eth0.arp_ignore = 1 
 net.ipv4.conf.eth0.arp_announce = 2 
 net.ipv4.conf.all.arp_ignore = 1 
 net.ipv4.conf.all.arp_announce = 2 

また、rpフィルタリングを構成します。

 net.ipv4.conf.eth0.rp_filter = 1#CentOS5で動作
または
 net.ipv4.conf.eth0.rp_filter = 2#CentOS6 +で動作

デフォルトのrp_filter設定はカーネルのバージョンによって異なる可能性があるため、正しい設定を選択してください。 詳細情報

4
Gene

Geneの回答を拡張し、jnovackを「失わない」ようにするために、CentOS7で私がうまくいったのは次のとおりです。

  • 両方のMySQLサーバーで、ファイル/etc/sysconfig/network-scripts/ifcfg-lo:1を作成します。

    DEVICE=lo:1
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=***your keepalived virtual IP***
    NETMASK=255.255.255.255
    
  • 両方のMySQLサーバーで、sysctlを(sysctl -pリロードすることを忘れないでください)で構成します。

    net.ipv4.ip_nonlocal_bind=1
    net.ipv4.ip_forward=1
    net.ipv4.conf.default.arp_ignore=1
    net.ipv4.conf.default.arp_announce=2
    net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2
    net.ipv4.conf.default.rp_filter=0
    net.ipv4.conf.all.rp_filter=0
    net.ipv4.tcp_syncookies=1
    net.ipv4.conf.all.log_martians=1
    net.ipv4.conf.lo.arp_ignore=1
    net.ipv4.conf.lo.arp_announce=2
    
  • ネットワークサービスを再起動します

    systemctl restart network
    # service network restart on CentOS 6
    

ifconfigを実行するループバックで新しい仮想インターフェイスを確認できます)

  • keepalivedサービスを再起動します

    systemctl restart keepalived
    # service keepalived restart on CentOS 6
    
0
Cheloute