vip

基本概念

虚拟IP即VIP,这只是一个概念而已 。主要作用,做灾备时候,做主从切换使用的。 如eth0:x ,x为0-255的任意数字,你可以在一块网卡上绑定多个别名在实际生产环境中,需要在DNS配置中把网站域名地址解析到这个VIP地址,由这个VIP对用户提供服务。如:把www.zhangcong.top解析到VIP 1.1.1.1 上。

域名dns绑定到特定的ip上,但是dns生效时间,可能并不快。

而vip呢,相当于,将某个静态的ip分配给指定的机器上,如果该机器服务挂了或它自己挂了,它应该让出vip,而其他的机器去抢夺该vip。一般就两台机器。(主从)

虽然是虚拟ip,但是,它应该也是能被路由,访问的,并不是随便的假的ip地址。需要于多分配了一个ip。假如,我们叫原来的ip叫管理ip,新增的叫vip。这样,相当于,有了两个ip,vip可以随意切换,这样,我们的服务,可以通过vip稳定的找到。机器,可以通过管理ip稳定找到。

高可用

高可用技术强调的网站、业务系统可用率,通过数字9来评估,网站几个9,例如99.9%、99.99%、99.999%。在企业生产环境中,作为运维人员如何保障网站、业务系统、数据库高可用呢?有哪些方法、有哪些软件程序可以实现呢?

1:使用SHELL编程脚本实现WEB、业务、数据库高可用。:

2:增加服务器系统的数量(WEB、DB集群),避免单点故障;

3:借助开源的高可用软件:Keepalived,Heartbeat故障自动转移

这里我们基于shell脚本实现两台nginx web故障的自动切换,当一台Nginx WEB宕机

时,能够切换至另外一台,保障用户能够正常访问

1:VIP地址同一时刻只能绑在其中一台WEB服务器;

2:VIP地址只能绑定在Nginx服务正常的机器上;

3:当Nginx服务宕机或者异常上,释放VIP,另外一台此时机器绑定VIP

方案

LVS+Keepalived高负载方案,VIP是需要绑定到realserver接口上,而Haproxy/Hearbeat/Nginx+keepalived却不用手动绑定到后端服务器接口上。这是因为LVS使用IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh),LVS是四层负载均衡,工作在传输层。LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。

这样做的好处就是当提供服务的服务器宕机以后,在接管的服务器上会直接自动配置上同样的VIP提供服务。如果是使用管理IP的话,来回迁移就难以做到,而且,管理IP迁移走了,我们就只能去机房连接服务器了,VIP 的实质就是确保两台服务器有一个管理IP不动,就是随时可以连上服务器,然后增加绑定其他的VIP,这样就算VIP转移走了,也不至于服务器本身连不上,因为还有管理IP可以使用。 Linux系统给网卡配置VIP的方法常见的有两种,即别名IP(alias ip)以及辅助IP(secondary ip address)。

资源

nginx + keepalive https://blog.csdn.net/shida_csdn/article/details/80739859

二、别名IP(alias ip)

ifconfig eth0:1 192.168.40.20 netmask 255.255.255.0 up

ifconfig eth0:1 192.168.40.20/24 up    # heartbeat软件默认是使用这个命令来添加的

# 查看
fconfig eth0:1

# 删除

ifconfig eth0:1 192.168.40.20 netmask 255.255.255.0 down
ifconfig eth0:1 down

# 让别名IP永久生效
# 写入到网卡配置文件可以让别名IP永久生效,名字可以为ifcfg-eth0:x,x为0-255的任意数字,IP等内容格式和ifcfg-eth0一致,或者将命令写入/etc/rc.local

注意:别名IP将被遗弃,用辅助IP替代,(why?)

三、辅助IP(secondary ip address)

辅助IP则是由Linux系统的ip命令创建和维护的,

ip addr add 创建的辅助IP,不能通过ifconfig查看。
​但是通过ifconfig创建的别名IP却可以在ip addr show 命令查看。

# 1)手工配置辅助VIP的方法:

ip addr add 192.168.40.20/24 dev eth0
# keepalived 软件默认使用这个命令来添加VIP,也是heartbeat3软件采用的方案# ip add 可以查看别名和辅助IP,用ifconfig无法查到辅助IP配置情况

# 查看

# 使用辅助IP的方法配置的VIP,不能通过ifconfig查看,只能通过 ip addr 来查看
# 使用辅助IP的方法配置的VIP,可以通过ip addr 查看

ip addr
# ip addr show 、 ip addr 、 ip add 这三个命令的结果都是一样的  (备注:add是addr的简写)

# 3)手工删除辅助IP的方法
ip addr del 192.168.40.20/24 dev eth0

提示: heartbeat 和 keepalived 在启动时就是分别利用上面命令来配置VIP的。在停止时利用下面的命令来删除VIP。以上两种方式配置VIP,在高可用环境中的作用是一样的,没什么区别,只是由于当时的系统环境等历史原因,选择的配置命令方式不同。heartbeat3 版本起,不在使用别名,而是使用辅助IP提供服务,而 keepalived 软件一直都是使用的辅助IP技术。

总结:

1、从heartbeat3.0开始,创建VIP的方式为手工配置别名的方式。

2、Keepalived软件创建VIP使用的是辅助IP技术。

3、(heartbeat3.0-)手工配置别名的方式:ifconfig eth0:1 192.168.40.20 netmask 255.255.255.0 up

4、(keepalived)辅助IP的方式:ip addr add 192.168.40.20/24 dev eth0

5、VIP(虚拟IP)根物理网卡是绑定的。

6、以上总结是heartbeat和keepalived高可用软件创建VIP的区别,在配置vip的时候,避免错误。

vip切换的shell

下面两个脚本的使用场景:

机器A、B同时是活动的机器,nginx运行状态,也同时执行了下面的脚本,只有一个master机器获得了VIP,并提供对外服务。脚本都不停的尝试去ping配置的VIP,如果获得VIP机器挂了,或者主动让出了VIP,则,下面脚本,则会主动的抢夺VIP,并进入master状态。

所以,脚本主要状态:就是,nginx运行,而且能ping通vip状态。

#!/bin/bash

# vip 切换shell

while true;do
    nginx_online=`ps -ef|grep nginx|grep -v grep|wc -l`
    if [ $nginx_online -eq 0 ];then
        ifdown ens33:1
    else
        ping -c 2 192.168.32.35 >/dev/null 2>&1
        if [ $? -ne 0 ];then
            cat>/etc/sysconfig/network-scripts/ifcfg-ens33:1<<EOL
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.32.35
NETMASK=255.255.255.0
NAME=ens33:1
DEVICE="ens33:1"
ONBOOT="yes"
EOL
            ifup ens33:1
        fi
    fi
 sleep 1
done
#!/bin/bash

cd /etc/sysconfig/network-scripts/
ip=192.168.80.200
netfile=ifcfg-ens33:1

# 如过nginx存活,则判断是否还需要激活vip。
# nginx挂了,则主动删除vip,并删除文件。

# nohup bash nginx_vip.sh &
# 两台nginx服务器节点都要执行vip脚本,在后台运行

while true
do
    killall -0 nginx &> /dev/null
    if [ $? -eq 0 ]
    then
        ping -c2 $ip &>/dev/null
        if [ $? -ne 0 ]
        then
            cat >> $netfile  <<-EOF
            TYPE=ethernet
            BOOTPROTO=none
            ONBOOT=yes
            DEVICE=ens33:1
            IPADDR=$ip
            NETMASK=255.255.255.0
            GATEWAY=192.168.80.2
            DNS=8.8.8.8
            DNS2=114.114.114.114
EOF
            ifup enss33:1
        fi
    else
        ifdown enss33:1 &>/dev/null
        rm -rf $netfile
    fi
    sleep 2
done