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からのタイムアウトが交互に発生します。
これまでのデバッグ:
したがって、DB2 MySQLサーバーが応答を拒否しているように見えます。これは、DB1がキープアライブマスターとして伝送しているため、着信パケットの宛先(共有仮想IP)がDB2サーバーに認識されていないためだと思います。
直接ルーティングを使用しているため、仮想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設定はカーネルのバージョンによって異なる可能性があるため、正しい設定を選択してください。 詳細情報 。
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