操作前请先了解lvs相关知识
mysql主服务器同时只有一台工作,另外一台处于热备状态状态。
三台从服务器由LVS调度分配请求。
测试客户端: 10.10.1.123
写vip:10.10.1.10
读vip:10.10.1.11
lvs主+MYSQL写主:10.10.1.100
lvs备+MYSQL写备:10.10.1.101
MySQL读1:10.10.1.201
MySQL读2:10.10.1.202
MySQL读3:10.10.1.203
使用keepalived对虚拟IP绑定到数据库写服务器。
使用直接路由方式,路由请求读vip:10.10.1.11的数据,并由LVS调度的服务器直接响应数据给客户端。
故:使用直接路由方式,客户端和5台数据库服务器要能互通。
本节不做主从复制内容,只测试两个写服务器高可用和三台读服务器的负载均衡设置。
yum install ipvsadm keepalived
ipvsadm
查看是否加载
lsmod | grep ip_vs
配置模块开机自动加载,优化内核参数。
echo “modprobe ip_vs” > /etc/sysconfig/modules/ipvsadm.modules
echo “options ip_vs conn_tab_bits=20” > /etc/modprobe.d/ipvs.conf
echo “net.core.netdev_max_backlog = 60000” >> /etc/sysctl.conf
chmod 755 /etc/sysconfig/modules/ipvsadm.modules
chkconfig keepalived on
/etc/init.d/keepalived on
编辑配置/etc/sysconfig/iptables
增加 -A INPUT -p 112 -d 224.0.0.0/32 -j ACCEPT
创建realserver启动脚本,放到读服务器,设置开机启动。
把一下内容写入/etc/init.d/realserver
chmod +x /etc/init.d/realserver
chkconfig realserver on
/etc/init.d/realserver start
#!/bin/bash # description: Config realserver # chkconfig: 2345 15 85 #此处设置读VIP VIP=10.10.1.11 /etc/rc.d/init.d/functions case "$1" in start) /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce sysctl -p > /dev/null 2>&1 echo "RealServer Start OK" ;; stop) /sbin/ifconfig lo:0 down /sbin/route del $VIP > /dev/null 2>&1 echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped OK" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
LVS主服务器配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { router_id LVS_MYSQL } vrrp_instance VI_MYSQL { state BACKUP interface eth0 virtual_router_id 98 priority 100 advert_int 1 #定义为非抢占模式,防止多漂移 nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置VIP地址 10.10.1.10 10.10.1.11 } } #定义写虚拟服务器 virtual_server 10.10.1.10 3306 { delay_loop 2 lb_algo wlc lb_kind DR persistence_timeout 50 protocol TCP #定义写主服务器 real_server 10.10.1.100 3306 { weight 1 !如果住服务器挂了,则停止keepalive服务 notify_down "/etc/init.d/keepalived stop" TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } 定义读虚拟服务器 virtual_server 10.10.1.11 3306 { delay_loop 2 lb_algo wlc lb_kind DR persistence_timeout 50 protocol TCP #第一台读服务器 real_server 10.10.1.201 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } #第二台读服务器 real_server 10.10.1.202 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } #第三台读服务器 real_server 10.10.1.203 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
LVS备服务器配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { router_id LVS_MYSQL } vrrp_instance VI_MYSQL { state BACKUP interface eth0 virtual_router_id 98 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.1.10 10.10.1.11 } } #定义写服务器高可用 virtual_server 10.10.1.10 3306 { delay_loop 2 lb_algo wlc lb_kind DR persistence_timeout 50 protocol TCP real_server 10.10.1.101 3306 { weight 1 notify_down "/etc/init.d/keepalived stop" TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } #定义读服务器负载均衡 virtual_server 10.10.1.11 3306 { delay_loop 2 lb_algo wlc lb_kind DR persistence_timeout 50 protocol TCP real_server 10.10.1.201 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.10.1.202 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.10.1.203 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
根据实际情况,修改配置文件中IP、网卡、权重等设置后,写入到配置文件,重启keepalived服务。
使用ipvsadm -ln可以查看到集群状态。
如上图,可以看到VIP 10.10.1.10对应的真实服务器为10.10.1.100,VIP 10.10.1.11对应的真实服务器为10.10.1.201/202
为了测试,我这里10.10.1.203没有安装数据库服务,所以被集群剔除了角色。从/var/log/messages可以看到相关日志。
尝试停止LVS主服务器上的mysql服务,可以看到keepalived检测到3306端口失败,停止keepalived服务,将VIP转交到备用服务器,备用服务器提升为主服务器,继续工作。当恢复主服务器上数据库后,手动启动keepalived服务,主服务器转为备用状态,避免了VIP的二次迁移。
我根据IP尾号,命名mysql中server-id以便方便看到当前请求的是哪一台服务器。
可以看到,当停掉尾号为100的服务器上数据库服务后,keepalived检测到状态,立即停止了服务,
LVS主服务器修复好数据库服务后,手动恢复keepalive服务,此时,主服务器处于备用状态,避免和接管了master的服务器争夺VIP.
从下图可以看到,LVS备服务器在LVS主服务器不可用情况下,将自己提升为MASTER,继续提供服务,从而实现了LVS的高可用。由于我们的写服务器和LVS服务器是一台,所以写服务器也达到了高可用的目的。
尝试停止从服务器上的一台数据库,查看链接情况:
查看日志里面是否有主备状态切换,避免主服务器恢复后争夺VIP。
如果轮训调度不明显,留意persistence_timeout设置的值。