LVS+keepalived(双主)+Nginx实现高可用负载均衡

news2024/11/28 9:38:29

#为什么采用双主架构:

单主架构只有一个keepalived对外提供服务,该主机长期处于繁忙状态,而另一台主机却很空闲,利用率低下

#双主架构的优点:

即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率

一、环境说明

#系统:Centos 7

#服务版本:nginx1.20.1、keepalived1.3.5

  • 架构图:

二.LVS+keepalived服务部署

#LVS是linux内核自带的服务,不用安装,只需安装LVS管理工具,第一种叫ipvsadm,第二种叫keepalived。ipvsadm是通过命令行管理,而keepalive读取配置文件管理

1.安装ipvsadm

[root@lvs01 ~]# yum -y install ipvsadm
[root@lvs02 ~]# yum -y install ipvsadm

2.加载ipvsadm模板进系统

[root@lvs01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs01 ~]# lsmod | grep ip_vs
ip_vs                 145497  0 
nf_conntrack          133095  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack
 
 
[root@lvs02 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs02 ~]# lsmod | grep ip_vs
ip_vs                 145497  0 
nf_conntrack          133095  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

3.安装Keepalived

[root@lvs01 ~]# yum install -y keepalived
[root@lvs02 ~]# yum install -y keepalived

4.修改keepalived配置文件

[root@lvs01 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
  router_id lvs01
}

include /etc/keepalived/conf.d/*.conf         #启用子配置文件

vrrp_instance VI_1 {                          #实例1
    state MASTER
    interface ens32
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.10/24 dev ens32 label ens32:1
    }
}

virtual_server 10.0.0.10 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 10.0.0.107 80 {
        weight 1
        TCP_CHECK {
           connect_timeout 10
           retry 3
           delay_before_retry 3
          connect_port 80
 }
}
    real_server 10.0.0.100 80 {
    weight 1
    TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
 }
}

vrrp_instance VI_2 {                             #实例2
    state BACKUP
    interface ens32
    virtual_router_id 88
    priority 80
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
 }
  virtual_ipaddress {
      10.0.0.20/24 dev ens32 label ens32:1
}

virtual_server 10.0.0.20 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 10.0.0.107 80 {
        weight 1
        TCP_CHECK {
           connect_timeout 10
           retry 3
           delay_before_retry 3
           connect_port 80
 }
}
    real_server 10.0.0.100 80 {
        weight 1
        TCP_CHECK {
           connect_timeout 10
           retry 3
           delay_before_retry 3
           connect_port 80
  }
 }
}
[root@lvs02 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id lvs02
}

include /etc/keepalived/conf.d/*.conf             #启用子配置文件

vrrp_instance VI_1 {                              #实例1
    state BACKUP
    interface ens32
    virtual_router_id 66
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.10/24 dev ens32 label ens32:1
    }
}

virtual_server 10.0.0.10 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 10.0.0.107 80 {
    weight 1
    TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
 }
}

    real_server 10.0.0.100 80 {
    weight 1
    TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
  }
 }
}

vrrp_instance VI_2 {                                #实例2
    state MASTER
    interface ens32
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
 }
 virtual_ipaddress {
     10.0.0.20/24 dev ens32 label ens32:1
 }
}

virtual_server 10.0.0.20 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 10.0.0.107 80 {
    weight 1
    TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
 }
}

    real_server 10.0.0.100 80 {
    weight 1
    TCP_CHECK {
       connect_timeout 10
       retry 3
       delay_before_retry 3
       connect_port 80
  }
 }
}

5.创建子配置目录

[root@lvs01 ~]#mkdir /etc/keepalived/conf.d/
[root@lvs02 ~]#mkdir /etc/keepalived/conf.d/

6.添加配置

[root@lvs01 ~]# vi /etc/keepalived/conf.d/cluster1.conf
vrrp_instance VI_1 {
   state MASTER
   interface ens32
   virtual_router_id 66
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
        10.0.0.10/24 dev ens32 label ens32:1
   }
   unicast_src_ip 10.0.0.112
   unicast_peer{
       10.0.0.113
   }
   notify_master "/etc/keepalived/notify.sh master"
   notify_backup "/etc/keepalived/notify.sh backup"
   notify_fault "/etc/keepalived/notify.sh fault"
}
[root@lvs01 ~]# vi /etc/keepalived/conf.d/cluster2.conf
vrrp_instance VI_2 {
   state BACKUP
   interface ens32
   virtual_router_id 88
   priority 80
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
        10.0.0.20/24 dev ens32 label ens32:1
   }
   unicast_src_ip 10.0.0.112
   unicast_peer{
   10.0.0.113
   }
   notify_master "/etc/keepalived/notify.sh master"
   notify_backup "/etc/keepalived/notify.sh backup"
   notify_fault "/etc/keepalived/notify.sh fault"
}
[root@lvs02 ~]# vi /etc/keepalived/conf.d/cluster1.conf
vrrp_instance VI_1 {
   state BACKUP
   interface ens32
   virtual_router_id 66
   priority 80
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       10.0.0.10/24 dev ens32 label ens32:1
   }
   unicast_src_ip 10.0.0.113
   unicast_peer {
    10.0.0.112
   }
   notify_master "/etc/keepalived/notify.sh master"
   notify_backup "/etc/keepalived/notify.sh backup"
   notify_fault "/etc/keepalived/notify.sh fault"
}
[root@lvs02 ~]# vi /etc/keepalived/conf.d/cluster2.conf
vrrp_instance VI_2 {
   state MASTER
   interface ens32
   virtual_router_id 88
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
        10.0.0.20/24 dev ens32 label ens32:1
   }
   unicast_src_ip 10.0.0.113
   unicast_peer{
   10.0.0.112
   }
   notify_master "/etc/keepalived/notify.sh master"
   notify_backup "/etc/keepalived/notify.sh backup"
   notify_fault "/etc/keepalived/notify.sh fault"
}

7.查看ip地址

[root@lvs01 ~]# hostname -I
10.0.0.112 10.0.0.10

[root@lvs02 ~]# hostname -I
10.0.0.113 10.0.0.20 

三.nginx服务部署

1.安装

[root@nginx01 ~]# yum install -y nginx net-tools
[root@nginx02 ~]# yum install -y nginx net-tools

2.启动

[root@nginx01 ~]# systemctl start nginx
[root@nginx02 ~]# systemctl start nginx

3.关闭VIP的ARP响应

vi /etc/rc.d/init.d/realserver.sh
#!/bin/bash
    SNS_VIP1=10.0.0.10
    SNS_VIP2=10.0.0.20
    /etc/rc.d/init.d/functions
    case "$1" in
    start)
        ifconfig lo:0 $SNS_VIP1 netmask 255.255.255.255 broadcast $SNS_VIP1
        /sbin/route add -host $SNS_VIP1 dev lo:0
        ifconfig lo:1 $SNS_VIP2 netmask 255.255.255.255 broadcast $SNS_VIP2
       /sbin/route add -host $SNS_VIP2 dev lo:1
        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

4.realserver.sh脚本授予执行权限

[root@nginx01 ~]# chmod u+x /etc/rc.d/init.d/realserver.sh
[root@nginx02 ~]# chmod u+x /etc/rc.d/init.d/realserver.sh

5.启动服务

[root@nginx01 ~]# /etc/rc.d/init.d/realserver.sh start 
/etc/rc.d/init.d/realserver.sh: line 3: /etc/rc.d/init.d/functions: Permission denied
RealServer Start OK
 
[root@nginx02 ~]# /etc/rc.d/init.d/realserver.sh  start 
/etc/rc.d/init.d/realserver.sh: line 3: /etc/rc.d/init.d/functions: Permission denied
RealServer Start OK

6.查看ip是否绑定

  7.修改页面显示,方便观察效果

echo "nginx01" > /usr/share/doc/HTML/index.html
echo "nginx02" > /usr/share/doc/HTML/index.html

6.客户端测试访问

四.模拟故障

1.停止lvs01服务

[root@lvs01 ~]# killall keepalived

 2.查看ip地址

#可以发现,虚拟ip地址已经漂到lvs02上了

[root@lvs01 ~]# hostname -I
10.0.0.112 

[root@lvs02 ~]# hostname -I
10.0.0.113 10.0.0.20 10.0.0.10 

3.客户端访问vip,负载正常

4.恢复lvs01服务

[root@lvs01 ~]# systemctl start keepalived

5.查看ip地址

#虚拟ip地址漂移回来了

[root@lvs01 ~]# hostname -I
10.0.0.112 10.0.0.10

[root@lvs02 ~]# hostname -I
10.0.0.113 10.0.0.20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11使用线程类thread的方法

C11 之前,C 语言没有对并发编程提供语言级别的支持。如果需要使用线程,windows系统需要使用CreateThread函数创建线程,而linux需要使用pthread库使用线程。C11 中增加了线程以及线程相关的类,很方便地支持了并发编程。由于可以跨平…

活动星投票十大商业品牌网络评选微信的投票方式线上免费投票

“十大商业品牌”网络评选投票_线上系统免费投票_功能齐全的视频投票_在线投票免费小程序用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投…

CV学习笔记-VGG

VGG 1. 常见的卷积神经网络 VGG属于一种经典的卷积神经网络结构,其出现在AlexNet之后,由于AlexNet的突破证实了卷积神经网络的可行性,VGG的思路主要是将网络层数加深,从某种意义上说,网络层数的加深可以粗略地认为考虑…

编译原理学习笔记14——属性文法与语法制导翻译1

编译原理学习笔记14——属性文法与语法制导翻译114.1 属性文法14.2 属性计算14.1 属性文法 属性文法 综合属性 自下而上传递信息语法规则:根据右 部候选式中的符号 的属性计算左部被 定义符号的综合属性语法树:根据子结 点的属性和父结点 自身的属性…

【日常系列】LeetCode《30·动态规划总结》

动态规划总结 线性动态规划问题总结 打家劫舍总结 最大子数组和总结 dp[i] 依赖于前面一个或者两个状态 dp[i] 依赖于前面多个状态 注意:子序列可以不连续 dp[i] 带有一个或者多个维度 输入为两个数组或者两个字符串 lc 10【剑指 19】【top100】:正…

【LeetCode每日一题:2309. 兼具大小写的最好英文字母~~~模拟+Hash表+贪心】

题目描述 给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字母 b 比另一个英文字母 …

Java生成微信小程序二维码,5种实现方式,一个比一个简单

文章目录前言先看官网一、JDK自带的URLConnection方式二、Apache的HttpClient方式三、okhttp3方式四、Unirest方式五、RestTemplate方式其它细节getAccessToken构建参数mapbyte[]数组源码下载前言 先介绍一下项目场景,主要是通过微信小程序二维码裂变分享&#xff…

一时重构一时爽,一直重构一直爽

笔者(后台技术汇)恭祝各位大佬:2023年春节快乐,兔年祥瑞。距离上次更新,已经过去5个月有余了,有小伙伴疑惑笔者是不是删库跑路了..其实不是,这段时间是在参加一次比较大的项目重构(目…

学习笔记 —— python代码耗时及内存占用测试方法

1、手写耗时测试 先看结果; 主要有三种方法,各自的时钟间隔如下: time.time() timeit time.time_ns() ( time is outputted in ns!). 可见方法2,即timeit 的时钟间隔最短。 注:最后一个是以ns为单位的,前两个是…

二叉树的概念与结构

文章目录前言一、树的概念及结构1.树的概念2.树的相关概念3.树的表示4. 树在实际中的运用二、二叉树概念及结构1.概念2.特殊的二叉树5.二叉树的性质6.二叉树的存储结构(1).顺序存储(2).链式存储结语前言 因为二叉树的知识点太多,一篇文章讲不…

《真象还原》读书笔记——第一章 部署工作环境

环境: 由于平时使用 windows 系统 所以 linux 环境 使用了 linux子系统。 $ cat /proc/version Linux version 4.4.0-22000-Microsoft (MicrosoftMicrosoft.com) (gcc version 5.4.0 (GCC) )1.1 工欲善其事 必先利其器 操作环境很重要呀。 1.2 编译器 GCC: gc…

Java 23种设计模式(8.结构型模式-桥接模式)

结构型模式-桥接模式 代码分析 类图 代码 public interface Implementor {void operation(); }public class ConcreteImplementorA implements Implementor{Overridepublic void operation() {System.out.println("A");} }public class ConcreteImplementorB imple…

(Java高级教程)第四章必备前端基础知识-第二节3:CSS盒模型和浮动

文章目录一:盒模型(1)border(2)padding(3)margin二:flex布局一:盒模型 盒模型:在HTML中,每个标签(或元素)相当于是一个盒…

DaVinci:色彩匹配

z调色页面:色彩匹配Color:Color Match色彩匹配 Color Match调板是专业的一级调色工具,专门用于对视频图像进行精准的校色还原。色彩匹配时,先定位到视频中持有色卡的画面。在检视器左下角快捷菜单中选择“色卡” Color Chart工具&…

C 语言零基础入门教程(十二)

C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……};接下来我们举个例子,比如:一星期有 7 天,如果不用枚举&…

【Linux】vim编辑器的使用

文章目录vim的基本概念vim指令集复制粘贴撤销、剪切光标定位vim的基本概念 vim是一款多模式的编辑器,在我们常用的模式有3~5种。分别是命令模式(command mode)、插入模式(Insert mode)和底行模式( last lin…

【PHP 随记】—— ThinkPHP 配置数据库

👉总目录👈\large\colorbox{skyblue}{👉总目录👈}👉总目录👈​ 文章目录1、数据库连接及导入① 数据库连接② 数据库导入2、配置 ThinkPHP 数据库连接信息① 配置连接信息1、数据库连接及导入 ① 数据库连…

大数据分析案例-基于随机森林算法构建人口普查分析模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Datawhale 202301 设计模式 | 人工智能 现代方法 习题

Exercise 1 绪论 Q:用您自己的话来定义:(a)智能,(b)人工智能,(c)智能体,(d)理性,(e)逻…

【大数据趋势】1月24日 流动、固定汇率和货币政策独立性三者的三者选二,A股持续的会上涨。

前言:昨天写的被朋友看到,认为我写的太水,故意不提日常讨论的那个关键指标,所以下午重新修改了一下。 确定欧美大势市场形态1 - 美元指数 关键位置大概率不会一次就破,有较强反弹可能,带动美股反弹 作为长…