亲爱的在ServerFault的人。 我试图(和失败)build立一个负载均衡的MySQL服务器arrays。 请赐教,告诉我在我的方式错误。
当前的设置:两个具有专用固定IP(10.116.219.47和10.116.219.48)的MySQL服务器和一个使用keepalived(10.116.219.12)共享的虚拟IP。 此设置可成功提供故障转移。 如果closuresDB1服务器,DB2服务器将迅速接pipe。 只有在configuration中添加虚拟服务器块时,事情才会中断。
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 } }
我们一直在试图为keepalivedconfiguration添加负载均衡,但是在这里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中超时。
debugging到目前为止:
所以看起来,DB2 MySQL服务器拒绝响应,我的猜测是因为传入的数据包目的地(共享的虚拟IP)不为DB2服务器所知,因为DB1正在将其作为keepalived主机。
由于您正在使用直接路由,因此需要在两台服务器上同时configuration虚拟IP。 您可以通过在辅助服务器的环回接口上configuration第二个vrrp实例来configurationVIP(10.116.219.12)来实现此目的。 当连接从负载均衡器转发到辅助服务器时,它将像往常一样在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
另外,configurationrp过滤:
net.ipv4.conf.eth0.rp_filter = 1#适用于CentOS 5 要么 net.ipv4.conf.eth0.rp_filter = 2#适用于CentOS 6+
内核版本的默认rp_filter设置可能会有所不同,所以请确保select正确的设置。 更多信息 。
为了扩展Gene的答案,为了使jnovack“不受影响”,在CentOS 7上为我工作的是:
在两个MySQL服务器上,创build文件/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服务器上,configurationsysctl(不要忘记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
重新启动networking服务
systemctl restart network # service network restart on CentOS 6
(你可以在执行ifconfig loopback上检查你的新的虚拟接口)
重新启动keepalived服务
systemctl restart keepalived # service keepalived restart on CentOS 6