LVS+KeepAlived+Nginx高可用实现方案之DR模式

说明:仅以最快的速度记录部署成功,故会少很多步骤和介绍

准备

虚拟机(CentOS 7)

准备了4台虚拟机,用于测试

IP 作用

192.168.1.128
keepalived master
192.168.1.129
 keepalived backup
192.168.1.130
nginx1
192.168.1.131
nginx2
192.168.1.200
虚拟ip VIP

架构示意图


软件安装

在192.168.1.128及192.168.1.129上安装keepalived

在192.168.1.130及192.168.1.131上安装nginx

防火墙配置

所有主机上关闭防火墙,仅部署测试用,具体配置请自行参考

systemctl stop firewalld
systemctl disable firewalld


基础软件安装

yum install gcc
yum -y install openssl-devel
yum -y install libnl libnl-devel
yum install -y libnfnetlink-devel
yum -y install net-tools
yum install vim -y

在两台keepalived服务器安装 KeepAlived 和LVS管理工具 ipvsadm安装

yum install  keepalived  ipvsadm -y

keepalived启动等命令

systemctl  start|stop|restart|status|enable  keepalived

设置自启

systemctl enable keepalived

配置MASTER

进入192.168.1.128服务器

cd /etc/keepalived

#备份默认的keepalived配置

mv keepalived.conf keepalived-back.conf
vim keepalived.conf

添加以下配置:

global_defs {
   notification_email {
         edisonchou@hotmail.com
   }
   notification_email_from sns-lvs@gmail.com
   smtp_server 192.168.80.1
   smtp_connection_timeout 30
   router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface eno16777736  #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication {   #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200  #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
    }
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.200 80 {
    delay_loop 6 # 设置健康检查时间,单位是秒
    lb_algo rr # 设置负载调度的算法为wlc
    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.1.130 80 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.1.131 80 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

配置BACKUP

进入192.168.1.129服务器

cd /etc/keepalived

#备份默认的keepalived配置

mv keepalived.conf keepalived-back.conf
vim keepalived.conf

添加以下配置:

global_defs {
   notification_email {
         edisonchou@hotmail.com
   }
   notification_email_from sns-lvs@gmail.com
   smtp_server 192.168.80.1
   smtp_connection_timeout 30
   router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
    state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface eno16777736  #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 50  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication {   #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200  #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
    }
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.200 80 {
    delay_loop 6 # 设置健康检查时间,单位是秒
    lb_algo rr # 设置负载调度的算法为wlc
    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.1.130 80 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.1.131 80 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

配置注意项

router_id

后面跟的自定义的ID在同一个网络下是一致的

state

state后跟的MASTER和BACKUP必须是大写;否则会造成配置无法生效的问题

interface

网卡ID;这个值不能完全拷贝我的配置,要根据自己的实际情况来看,可以使用以下方式查询

ip a


priority

主备优先级

MASTER中配置的priority必须比BACKUP大;差值最好>=50

authentication

主备之间的认证方式

一般使用PASS即可;主备的配置必须一致;否则无法通讯,会导致裂脑;密码不能大于8位

virtual_ipaddress

配置的VIP;允许配置多个

启动keepalived

在192.168.1.128和192.168.1.129下分别执行以下指令重启keepalived

systemctl start keepalived

检查主keepalived 启动后的配置情况

ip a


如果网卡下出现192.168.1.200(VIP)说明主已经启动成功

检查备keepalived 启动后的配置情况

ip a

备服务器的网卡下没有出现192.168.1.200(VIP)的ip,说明备服务正常

注:如果这里也出现了VIP,那么说明裂脑了,需要检查防火墙是否配置正确;是否允许了vrrp的多播通讯


nginx安装

只需要在192.168.1.130及192.168.1.131上安装nginx即可

安装nginx,目的是把nginx作为后端,如果有其他后端程序,这一步可以省略

yum install epel-release -y
yum install nginx -y

启动nginx服务

确保nginx已经正常运行了

ps -ef|grep nginx

编辑realserver脚本文件两台机器都要搞

进入init文件夹

cd /etc/init.d/

编辑脚本

vim realserver

添加以下脚本

#虚拟的vip 根据自己的实际情况定义

#!/bin/bash
#虚拟的vip 根据自己的实际情况定义
SNS_VIP=192.168.1.200
/etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_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)
       ifconfig lo:0 down
       route del $SNS_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"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

保存并设置脚本的执行权限

chmod 755 /etc/init.d/realserver

因为realserver脚本中用到了/etc/rc.d/init.d/functions,所以一并设置权限

chmod 755 /etc/rc.d/init.d/functions

执行脚本

service realserver start


查看执行结果

ip a

如果看到以下效果,说明脚本已经执行成功了



LVS管理工具-ipvsadm

查看统计

查看当前配置的虚拟服务和各个RS的权重

 ipvsadm -Ln

查看当前ipvs模块中记录的连接(可用于观察转发情况)

 ipvsadm -lnc

查看ipvs模块的转发情况统计

ipvsadm -Ln --stats | --rate

lvs超时配置

查看lvs的超时时间

ipvsadm -L --timeout

优化连接超时时间

ipvsadm --set 1 10 300

这里的TCP的连接超时时间最好和keepalived中的persistence_timeout超时时间保持一致;persistence_timeout的超时时间表示指定时间内,同ip的请求会转发到同一个服务;

测试

正常代理转发

使用我linux虚拟机的windows宿主机进行测试

测试vip

ping 192.168.1.200


测试vip监听的端口

telnet 192.168.1.200 80



请求虚拟IP查看转发的服务



KeepAlived高可用测试

停掉主keepalived

systemctl stop keepalived 

vip漂移至备服务器


此时网页访问:192.168.1.200依然能够正常访问;却分发依然正常



重启主keepalived

主服务恢复之后;vip又会自动漂移回主服务

LVS监控真实服务测试

查看最新的虚拟ip对应的RealServer的情况

ipvsadm -l


可以看出192.168.1.130和192.168.1.131两台正式服务都还在

测试停掉192.168.1.130



再次查看虚拟ip对应的RealServer的情况



可以看出192.168.1.130这台已经挂掉的服务器已经被移除了

测试访问虚拟ip



所有的访问都只会转发到131的真实服务器

恢复192.168.1.130

lvs又会自动监控并加入192.168.1.130



常见问题

裂脑

主备keepalived服务器同时出现了VIP;导致vip无法正常使用

常见原因为防火墙配置所致导致多播心跳失败

vip能ping通,但是vip监听的端口不通

第一个原因:nginx1和nginx2两台服务器的服务没有正常启动

第二个原因:请参考上面Nginx服务器那一大项中所说的配置,可能没有配置好

vip ping不通

核对是否出现裂脑

核对keepalived的配置是否正确


参考文章,感谢原作者

https://blog.csdn.net/lupengfei1009/article/details/86514445

https://www.linuxidc.com/Linux/2016-03/129232.htm

版权声明:
作者:超级管理员
链接: https://blog.apecloud.ltd/article/detail.html?id=73
来源:猿码云个人技术站
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
/static/admin/img/weixin.jpg/static/admin/img/zfb.jpg
<<上一篇>
nginx 负载均衡的配置
下一篇>>