专栏首页python3LVS+Keepalive双机热备

LVS+Keepalive双机热备

一、概述

本实验基于CentOS7.6 操作系统,总共5台设备,两台做后端web服务器,两台做lvs和keepalived,一台做客户机,实验以LVS(DR)+Keepalived和LVS(NAT)+Keepalived两种模式来做双机热备份,实验环境拓扑如下图所示:

从架构可以看出来,从用户的角度来说,会直接访问192.168.31.200,也就是说不管系统如何设计要保证此ip的可用性,

从架构师的角度考虑:

   用户访问192.168.31.200,这是一个虚拟iP,用户不关心内部如何协调。

我们使用 192.168.31.54 作为主机 Master机器,然后使用keepalived 技术配置 HA(high avilable)配置高可用行,也就是说如果 分发的机器Master宕机了,keepalive会自动转到 backup机器,

这就是HA配置,保证master即使宕机了,也不影响转发;

master机器负责把用户的请求转发到  真实的机器, web1和web2,他们会按照一定的轮训机制,访问,如果web1宕机,master会自动转发到web2;

我们在两台负载均衡的机器上面,配置keepalived保证分发机器的高可用行HA;

环境说明

系统的 IP配置如下:

服务器名

主机名

IP地址

虚拟设备名

虚拟IP

Director Server

lvs1

192.168.31.54

enp0s3:0

192.168.31.200

Backup Server

lvs2

192.168.31.51

enp0s3:0

192.168.31.200

Real Server1

web1

192.168.31.113

lo:0

192.168.31.200

Real Server2

web2

192.168.31.150

lo:0

192.168.31.200

请确保4台服务器关闭了防火墙

systemctl stop firewalld
setenforce 0

二、web服务器配置

安装nginx

登录主机web1和web2

安装nginx

# 安装Nginx源
yum -y install epel-release
# 安装Nginx
yum -y install nginx
# 启动Nginx服务
systemctl start nginx
# 加入开机自启
systemctl enable nginx
# 备份原有默认页面
mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html_bak

登录主机web1,修改默认页面

vi /usr/share/nginx/html/index.html

清空内容,完整内容如下:

This is Server 111

登录主机web2,修改默认页面

vi /usr/share/nginx/html/index.html

清空内容,完整内容如下:

This is Server 222

访问页面

访问web1

访问web2

三、LVS+Keepalive

安装

登录主机lvs1和lvs2

安装keepalived和lvs管理工具

yum -y install keepalived* ipvsadm

加载内核模块

modprobe ip_vs

备份配置文件

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak

配置

登录主机lvs1

vi /etc/keepalived/keepalived.conf

内容如下:

global_defs {
    router_id LVS_TEST    #服务器名字
}

vrrp_instance VI_1 {
    state MASTER    #配置主备,备用机此配置项为BACKUP
    interface enp0s3    #指定接口
    virtual_router_id 51    #指定路由ID,主备必须一样
    priority 101    #设置优先级,主略高于备份
    advert_int 1    #设置检查时间
    authentication {
        auth_type PASS    #设置验证加密方式
        auth_type 1234    #设置验证密码
    }
    virtual_ipaddress {
        192.168.31.200
    }
}

virtual_server 192.168.31.200 80 {
    delay_loop 3    #健康检查时间
    lb_algo rr    #LVS调度算法
    lb_kind DR   #LVS工作模式
    !persistence 60    #是否保持连接,!不保持
    protocol TCP    #服务采用TCP协议
    real_server 192.168.31.113 80 {
        weight 1    #权重
        TCP_CHECK {    #TCP检查
            connect_port 80   #检查端口80
            connect_timeout 3    #超时时间3秒
            nb_get_retry 3    #重试次数3次
            delay_before_retry 4    #重试间隔4秒
        }
    }
    real_server 192.168.31.150 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
}

请根据实际情况修改红色部分

说明:

interface enp0s3 表示本地网卡为enp0s3

192.168.31.200 表示虚拟ip

重启keepalived服务

systemctl restart keepalived
systemctl enable keepalived

验证虚拟IP是否生效

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:04:34:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 31218sec preferred_lft 31218sec
    inet 192.168.31.200/32 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

可以发现虚拟ip已经有了

登录主机lvs2

vi /etc/keepalived/keepalived.conf

LVS2的配置同LVS1,只需将配置文件中下面两处修改即可

内容如下:

global_defs {
    router_id LVS_TEST    #服务器名字
}

vrrp_instance VI_1 {
    state BACKUP    #配置主备,备用机此配置项为BACKUP
    interface enp0s3    #指定接口
    virtual_router_id 51    #指定路由ID,主备必须一样
    priority 100    #设置优先级,主略高于备份
    advert_int 1    #设置检查时间
    authentication {
        auth_type PASS    #设置验证加密方式
        auth_type 1234    #设置验证密码
    }
    virtual_ipaddress {
        192.168.31.200
    }
}

virtual_server 192.168.31.200 80 {
    delay_loop 3    #健康检查时间
    lb_algo rr    #LVS调度算法
    lb_kind DR   #LVS工作模式
    !persistence 60    #是否保持连接,!不保持
    protocol TCP    #服务采用TCP协议
    real_server 192.168.31.113 80 {
        weight 1    #权重
        TCP_CHECK {    #TCP检查
            connect_port 80   #检查端口80
            connect_timeout 3    #超时时间3秒
            nb_get_retry 3    #重试次数3次
            delay_before_retry 4    #重试间隔4秒
        }
    }
    real_server 192.168.31.150 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
}

重启keepalived服务

systemctl restart keepalived
systemctl enable keepalived

查看虚拟IP

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 31079sec preferred_lft 31079sec
    inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

注意:此时是没有的。因为master和bakcup只能同时存在一个。只有当master异常时,bakcup才会出现虚拟ip。

登录主机lvs1,关掉主服务器的keepalived服务

systemctl stop keepalived

登录主机lvs2,验证备份的keepalived是否生效

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 30713sec preferred_lft 30713sec
    inet 192.168.31.200/32 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

四、web服务器绑定VIP

 2台web服务器为lo:0绑定VIP地址、抑制ARP广播

登录主机web1,web2,编写以下脚本文件realserver.sh

vi /etc/init.d/realserver.sh

内容如下:

#!/bin/bash
#description: Config realserver

VIP=192.168.31.200

#/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"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

exit 0

请根据实际情况,修改VIP地址。

登录主机web1,web2,分别执行脚本

bash /etc/init.d/realserver.sh

执行完了之后,验证一下 使用ifconfig 你会发现 回环地址的网卡会多出一个lo:0的 网卡;

# ifconfig lo:0lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.31.200  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

登录lvs1,查看VIP是否成功映射

# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  MiWiFi-R3P-srv:http rr
  -> 192.168.31.113:http          Route   1      0          0         
  -> 192.168.31.150:http          Route   1      0          0

 五、测试可用性

测试keepalived的监控检测

访问虚拟ip

可以看到,现在是访问的web1 

登录主机web1,关闭nginx进程。

nginx -s stop

刷新页面

 可以发现切换到web2了。

登录主机web1,启动Nginx

nginx

刷新页面

 发现切换到web1了。

测试 keepalived 的HA特性

登录主机lvs1,此时的vip是在master节点上的。关闭keepalived服务

systemctl stop keepalived

查看vip,发现已经没有了

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:04:34:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 42290sec preferred_lft 42290sec
    inet6 fe80::a66d:efde:f19f:9882/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

登录主机lvs2,查看vip,发现已经出现了。

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 42248sec preferred_lft 42248sec
    inet 192.168.31.200/32 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

此时,刷新页面,依然访问正常。

 说明keepalived的HA特性是正常的。

本文参考链接:

https://blog.csdn.net/weixin_42342456/article/details/86100090

https://www.cnblogs.com/aspirant/p/6740556.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 迭代

    如果给定一个list或tuple,可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration) 在Python中,迭代是通过...

    py3study
  • [PYTHON] 核心编程笔记之八-Py

    if make_hard_copy: send_data_to_printer()

    py3study
  • Python 键盘鼠标监听

    异想天开的想记录一下自己每天的键盘键位走向,于是就在网上搜索了一下相关的实现,然后就发现了一个第三方的库pyHook.封装的很好,我们只需要傻瓜式的调用里面的A...

    py3study
  • 18.12 keepalived + LVS

    Keepalived+LVS DR 完整架构需要两台服务器(角色为dir)分别安装keepalived软件,目的是实现高可用,但keepalived本身也有负载...

    运维小白
  • Linux基础(day65)

    18.11 LVS DR模式搭建 LVS DR模式搭建 DR模式搭建 – 准备工作 三台机器 分发器,也叫调度器(简写为dir) 133.130 rs1 1...

    运维小白
  • [689]设置debian的静态IP

    IP地址:10.10.10.155 子网掩码:255.255.255.0 网关:10.10.10.2

    周小董
  • Python语句与语法

    在python里是不使用{}或者别的符号来限制语句的开始和结尾的,一个语句的开始(除了复合语句),就是开头,换行就是结束。在开头,不能随意增加空格:

    没有故事的陈师傅
  • 深度学习在医学影像上的应用(三)——分割

    上一篇给大家介绍了深度学习在医学影像上关于图像重建及后处理,图像标注,图像配准,图像超分辨率和回归的应用,这一篇我将继续分享深度学习在分割上的应用。

    用户7498388
  • Graph Cuts学习笔记2014.5.16----1

    进行了一段时间的论文学习后,现在下载了一些代码,准备从OpenCV跟matlab两个方面着手搭建自己的图像分割平台,计划耗时一个月左右的时间!

    用户1539362
  • 关注了腾讯大牛产品经理胡文翠空间,英文名是janthu。

    用户2240957

扫码关注云+社区

领取腾讯云代金券