本节内容为使用Keepalived实现两台mysql写(主)服务器高可用,三台mysql读(从)服务器负载均衡。

操作前请先了解lvs相关知识

Keepalived中文指南LVS手册正式版

Keepalived中文指南.pdf

LVS手册正式版.pdf

 

mysql-lvs.png

 

mysql主服务器同时只有一台工作,另外一台处于热备状态状态。

三台从服务器由LVS调度分配请求。

–服务器规划和IP配置–

测试客户端: 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台数据库服务器要能互通。

本节不做主从复制内容,只测试两个写服务器高可用和三台读服务器的负载均衡设置。

1.在两个lvs服务器上安装LVS和keepalived

yum install ipvsadm keepalived

2.加载LVS到内核

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

3.设置自启动并启动

chkconfig keepalived on
/etc/init.d/keepalived on

4.LVS服务器上设置防火墙,允许keepalived组播

编辑配置/etc/sysconfig/iptables

增加 -A INPUT -p 112 -d 224.0.0.0/32 -j ACCEPT

5.从服务器上写入虚拟IP配置到本地换回网络,以便能返回源为VIP的响应数据包到客户端。

创建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

6.配置LVS服务器实现负责均衡服务器的高可用,并分发和路由从服务器的请求。

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可以查看到集群状态。

5.png

如上图,可以看到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可以看到相关日志。

6.png

尝试停止LVS主服务器上的mysql服务,可以看到keepalived检测到3306端口失败,停止keepalived服务,将VIP转交到备用服务器,备用服务器提升为主服务器,继续工作。当恢复主服务器上数据库后,手动启动keepalived服务,主服务器转为备用状态,避免了VIP的二次迁移。

我根据IP尾号,命名mysql中server-id以便方便看到当前请求的是哪一台服务器。

7.png

8.png

9.png

 可以看到,当停掉尾号为100的服务器上数据库服务后,keepalived检测到状态,立即停止了服务,

10.png

11.png

LVS主服务器修复好数据库服务后,手动恢复keepalive服务,此时,主服务器处于备用状态,避免和接管了master的服务器争夺VIP.

从下图可以看到,LVS备服务器在LVS主服务器不可用情况下,将自己提升为MASTER,继续提供服务,从而实现了LVS的高可用。由于我们的写服务器和LVS服务器是一台,所以写服务器也达到了高可用的目的。

12.png

尝试停止从服务器上的一台数据库,查看链接情况:

15.png

16.png

17.png

在操作时留意防火墙设置

查看日志里面是否有主备状态切换,避免主服务器恢复后争夺VIP。

如果轮训调度不明显,留意persistence_timeout设置的值。