案例:LVS+Keepalived集群

news2024/11/24 7:07:17

目录

Keepalived

原理

Keepalived案例

双机高可用热备案例

配置

修改配置文件

测试

严格模式测试

修改配置文件

测试

模拟故障测试

LVS+Keepalived高可用

案例拓扑图

初步配置

关闭服务

主调度器配置

健康状态检查的方式

调整内核参数

从调度器配置

服务器池配置

模拟故障


Keepalived

LVS集群的缺点就是不具备健康状态检查,而通过Keepalived就可以实现LVS的健康状态检查,如果发现有服务器故障了,就在调度策略中删除该服务器的策略

  • 是专为LVS和HA设计的一款健康状态检查工具
  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)

原理

  • Keepalived采用VRRP热备份协议来实现Linux服务器的多机热备功能
  • 每个热备组可以有多台服务器
  • 热备组的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器

Keepalived案例

  • 企业应用中,单台服务器存在单点故障的问题,单点故障一旦发生,企业服务将会中断

双机高可用热备案例

本案例用于初步了解keepalived,如果想要直接结合LVS,请往下看第二个案例

双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器

  • 漂移地址:192.168.10.72
  • 主、备服务器:192.168.10.101、192.168.10.102
  • 提供的应用服务:Web

操作系统

IP 地址

角色

CentOS7.9

192.168.10.101

Web服务器

CentOS7.9

192.168.10.102

Web服务器

配置

开启两个Linux虚拟机,连接上XShell,然后右键XShell终端空白处,开启会话同步

在101(Master)操作

关闭防火墙和内核安全机制,然后安装keepalived

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install keepalived

cd进入keepalived安装目录下,该工具的配置文件就在该目录下,为了防止误操作,可以备份一份配置文件

[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf
[root@localhost keepalived]# cp keepalived.conf  keepalived.conf.bak
修改配置文件

打开keepalived的配置文件,修改下面几个参数,然后启动服务

[root@localhost keepalived]# vim keepalived.conf
router_id LVS_01    # 第12行,router_id用于区分设备,可以重复但不建议(不影响使用)
interface ens33     # 第21行,填写本机网卡插槽名
virtual_router_id 51 # 第22行,虚拟路由id,用于划分主机到同一个热备组
192.168.10.172    # 第30行
[root@localhost keepalived]# systemctl start keepalived

然后来到第33行,切换为命令模式,按下小写字母d,再按下大写G,删除剩下的内容。

这里我们只是为2个主机做高可用的环境,那么上面的配置就够了,删除的行是为服务做健康状态检查的

关闭会话同步,为102修改作为备份服务器的配置

在102(Backup)操作

修改以下内容,启动服务

[root@localhost keepalived]# vim keepalived.conf
state BACKUP    # 第20行,角色
priority 90
    # 第23行,Backup的优先级必须比Master低
[root@localhost keepalived]# systemctl start keepalived

在101、102分别操作

在两个主机分别在启动服务后,都使用ip a命令查看有没有虚拟ip

[root@localhost keepalived]# ip a

确保101主机显示虚拟IP(192.168.10.172)而102不显示

因为Master主机才会承载虚拟IP,除非Master故障,虚拟IP漂移到Backup主机

101主机(Master):
ens33:
    inet 192.168.10.101/24
    inet 192.168.10.172/32
102主机(Backup):
ens33: 
    inet 192.168.10.102/24

测试

由于我们没有配置针对服务做健康状态检查的参数,所以我们这里需要手动暂停101(Master)主机,来模拟故障

在102(Backup)操作

然后来到Backup主机使用ip a命令,可以看到虚拟IP就过来了

2: ens33:
    inet 192.168.10.102/24
    inet 192.168.10.172/32

但是此时如果再恢复101主机,然后重启keepalived会发现虚拟IP并没有从原Backup主机回到原Master主机

[root@localhost ~]# systemctl restart keepalived

在101、102分别操作

如果为两个主机关闭NetworkManager服务

[root@localhost ~]# systemctl stop NetworkManager

然后再次模拟故障,等待101恢复正常后,再重启keepalived服务,此时虚拟IP就能飘回优先级高的主机了

[root@localhost ~]# systemctl restart keepalived    # 分别输入
101主机
2: ens33:
    inet 192.168.10.102/24
    inet 192.168.10.172/32
102主机:
2: ens33:
    inet 192.168.10.102/24

严格模式测试

此时再打开一台虚拟机(192.168.10.103)作为客户端来测试

在101、102分别操作

然后为101和102主机都安装httpd服务,启动httpd服务,关闭防火墙

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd

在101(Master)操作

再为两个主机添加不同的网站内容

[root@localhost ~]# echo "Test Web 01" > /var/www/html/index.html

在102(Backup)操作

[root@localhost keepalived]# echo "Test Web 02" > /var/www/html/index.html

在103(客户端)测试

在客户端如果访问两个服务器的真实IP就可以访问到Web服务,但是如果访问虚拟IP,就访问不到Web服务(包括ping命令)

[root@localhost ~]# curl 192.168.10.101
Test Web 01
[root@localhost ~]# curl 192.168.10.102
Test Web 02
[root@localhost ~]# curl 192.168.10.172
^C
修改配置文件

因为keepalived是默认开启VRRP的严格模式的,严格模式启用的情况下,VRRP协议生成的VIP是不支持单播的通信

所以我们去两台主机的keepalived配置文件中把严格模式的行注释掉或者删除,然后重启服务

在101、102分别操作

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
#vrrp_strict    # 第14行
保存并退出
[root@localhost ~]# systemctl restart keepalived
测试

在103(客户端)测试

此时去客户端测试,可以与虚拟IP通信了

[root@localhost ~]# curl 192.168.10.172
Test Web 01
[root@localhost ~]# ping 192.168.10.172
PING 192.168.10.172 (192.168.10.172) 56(84) bytes of data.
64 bytes from 192.168.10.172: icmp_seq=1 ttl=64 time=0.357 ms
64 bytes from 192.168.10.172: icmp_seq=2 ttl=64 time=0.219 ms
模拟故障测试

此时再暂停101(原Master)主机,让虚拟IP飘到102主机

再去客户端测试,仍然可以访问到服务,只是网页内容变了

在103(客户端)测试

[root@localhost ~]# curl 192.168.10.172
Test Web 02
[root@localhost ~]# ping 192.168.10.172
PING 192.168.10.172 (192.168.10.172) 56(84) bytes of data.
64 bytes from 192.168.10.172: icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from 192.168.10.172: icmp_seq=2 ttl=64 time=0.224 ms

如果此时再恢复101主机的状态,那么访问的网页内容就会又变成101主机的内容了

这就是高可用


LVS+Keepalived高可用

案例拓扑图

这里我们简化一下案例,不再实现NFS共享存储的服务器,105作为客户端来测试

操作系统

IP 地址

角色

CentOS7.9

192.168.10.101

主调度器

CentOS7.9

192.168.10.102

从调度器

CentOS7.9

192.168.10.103

Web服务器①

CentOS7.9

192.168.10.104

Web服务器②

CentOS7.9

192.168.10.105

客户端(测试机)

本案例需要5台Linux虚拟机,全部恢复系统最初的快照

初步配置

本次案例使用DR模式作为工作模式

启动5台虚拟机并全部使用XShell连接

关闭服务

开启除了客户端的会话同步 统一关闭防火墙和内核安全机制

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
主调度器配置

关闭103和104的会话同步

只开启两个调度器服务器的会话同步(101、102)

在101(主调度器)操作

关闭NetworkManager服务,安装keepalived

[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# yum -y install keepalived

打开keepalived配置文件,修改以下内容

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
   router_id LVS_01
   #vrrp_strict
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        192.168.10.172
    }

因为要针对服务进行负载均衡,所以在33行后的内容要配置好集群和真实服务器

我们这里用TCP的方式检查健康状态,所以删除一些内容,然后改为TCP_CHECK

virtual_server 192.168.10.172 80 {
    delay_loop 6  # 回环延迟时间
    lb_algo wrr   # 调度算法
    lb_kind DR    # 负载均衡的工作模式
    #persistence_timeout 50 会话保持时间
    protocol TCP

    real_server 192.168.10.103 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.10.104 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
# 剩下的内容删除
# 命令模式下:d + G
保存并退出
健康状态检查的方式
  • SSL_GET
    • 通过SSL,GET一下网站根目录的网页文件,如果有内容,就是正常的
  • TCP_CHECL
    • 工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。
  • HTTP_GET
    • 工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,在一台服务器有多个虚拟主机的情况下使用。
  • MISC_CHECK
    • 用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内,根据脚本的返回值来判断
调整内核参数
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0
[root@localhost ~]# sysctl -p
从调度器配置

关闭会话同步

在102(从调度器)操作

再次打开配置文件,修改作为从调度器的参数

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
router_id LVS_02
state BACKUP
priority 99
保存并退出

在keepalived配置文件中配置了集群和真实服务器的参数,其实就是配置好了调度策略,所以不用再使用管理工具添加调度策略了

在101、102分别操作

分别开启两个调度器的keepalived服务,然后使用ip a命令查看虚拟IP是否正常

[root@localhost ~]# systemctl start keepalived
[root@localhost ~]# ip a

服务器池配置

为103和104开启会话同步

在103(Web服务器①)操作

创建本地回环虚拟网卡,改为虚拟IP

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.172
NETMASK=255.255.255.255
#NETWORK=127.0.0.0
#BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

保存退出后,重启服务。然后使用ifconfig查看是否创建成功

[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
lo:0:
        inet 192.168.10.172

添加路由条目,如果访问的IP是172那么就交给lo:0设备处理

然后修改内核配置文件,添加以下内容,让后端服务器不参与ARP的应答

最后使用sysctl -p应用内核设置

[root@localhost ~]# route add -host 192.168.10.172 dev lo:0
[root@localhost ~]# vim /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
[root@localhost ~]# sysctl -p

安装Apache网站服务,启动服务

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd

关闭全部会话同步

在103(Web服务器①)操作

使用重定向在存放网站文件的目录下创建测试网页

[root@localhost ~]# echo "web01" > /var/www/html/index.html

在104(Web服务器②)操作

[root@localhost ~]# echo "web02" > /var/www/html/index.html

在105(客户端)操作

测试网站服务是否实现负载均衡

[root@localhost ~]# curl 192.168.10.172
web02
[root@localhost ~]# curl 192.168.10.172
web01
模拟故障

此时把101主机(主调度器)暂停

再测试,可以看到在几秒后, 服务可以正常访问,实现高可用(主调度器和备调度器之间切换Master和VIP)

[root@localhost ~]# curl 192.168.10.172
web02

此时再开启101主机,然后在102使用ipvsadm -ln可以看到keepalived帮我们创建出对应的LVS策略

[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.172:80 rr
  -> 192.168.10.103:80            Route   1      0          0         
  -> 192.168.10.104:80            Route   1      0          0 

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

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

相关文章

失业后才会明白,职场上有4个扎心的现象

最近一段时间,因为疫情的原因,很多企业都在经历着前所未有的困难,其中就包括华为这样的大型企业。 任正非在接受媒体采访的时候表示:“全球经济持续衰退,未来3到5年内都不可能转好……把寒气传递给每个人。 这句话一…

python中的魔术方法(特殊方法)

文章目录 1. 前言2. __init__方法3. __new__方法4. __call__方法5. __str__方法6. __repr__方法7. __getitem__方法8. __setitem__方法9. __delitem__方法10. __len__方法11. 富比较特殊方法12. __iter__方法和__next__方法13. __getattr__方法、__setattr__方法、__delattr__方…

深度学习DeepLearning Inference 学习笔记

神经网络预测 术语 隐藏层神经元多层感知器 神经网络概述 应当选择正确的隐藏层数和每层隐藏神经元的数量,以达到这一层的输出是下一层的输入,逐层变得清晰,最终输出数据的目的。 在人脸识别的应用中,我们将图片视作连续的像…

【Java 第九篇章】多线程实际工作中的头大的模块

多线程是一种编程概念,它允许多个执行路径(线程)在同一进程内并发运行。 一、多线程的概念和作用 1、概念 线程是程序执行的最小单元,一个进程可以包含多个线程。每个线程都有自己的程序计数器、栈和局部变量,但它们…

Motionface ai工具有哪些?

Motionface Android/PC 用一张静态含有人脸相片来生成一个能说会唱的虚拟主播。使用简单便捷,极致的流畅度体验超乎您的想象。 免费下载 Respeak PC电脑软件 任意视频一键生成虚拟主播,匹配音频嘴型同步,保留原视频人物神态和动作&#xff0c…

核显硬刚RTX 4070,AMD全新APU杀疯了

这年头,一台平民玩家低预算主流桌面电脑主机是什么配置? Intel i5 12400F CPU、B760 主板、NVIDIA RTX 4060 显卡、双 8G DDR4 内存、1T 固态硬盘的组合,想必相当具有代表性了吧! 但仔细掰开后我们不难发现,这套不到…

生物信息学入门:Linux学习指南

还没有使用过生信云服务器?快来体验一下吧 20核心256G内存最低699元半年。 更多访问 https://ad.tebteb.cc 介绍 大家好!作为一名生物信息学的新人,您可能对Linux感到陌生,但别担心,本教程将用简单明了的方式&#xff…

Cache结构

Cache cache的一般设计 超标量处理器每周期需要从Cache中同时读取多条指令,同时每周期也可能有多条load/store指令会访问Cache,因此需要多端口的Cache L1 Cache:最靠近处理器,是流水线的一部分,包含两个物理存在 指…

解决windows安装docker desktop打开报错问题

下载docker windows版本: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_sourcedocker&utm_mediumwebreferral&utm_campaigndd-smartbutton&utm_locationmodule 正常安装,然后运行,弹出这个报错: 试了…

力扣 两数之和

致每一个初学算法的你。 题目 时间复杂度&#xff1a;O(N^2)&#xff0c; 空间复杂度&#xff1a;O(1) 。 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {if (nums[i] …

RK3568平台开发系列讲解(文件系统篇)Linux内核中 文件的三个数据结构

在内核中,与文件描述符相关的三个主要数据结构分别是: 文件描述符表(进程级):这是每个进程所拥有的数据结构,用于维护进程中打开的所有文件描述符。每个 fd 在这个表中都有一个对应的条目,指向更底层的文件表示结构。 打开文件列表(系统级):这是一个全系统范围内的数…

DC-5靶场实战模拟

信息收集 端口和网段信息&#xff1a;使用nmap扫描 //扫描网段中存货的主机 nmap -sP 192.168.10.0/24 //进行对主机进行猜测-》发现接口&#xff1a;80存活 nmap -sV 192.168.10.245 目录信息 &#xff1a;使用dirbuster 指纹信息 找漏洞 发现web 中contact有提交界面进行…

[设备] 关于手机设备中几种传感器的研究

一、手机设备中三位坐标系概念 X轴的方向&#xff1a;沿着屏幕水平方向从左到右&#xff0c;如果手机如果不是是正方形的话&#xff0c;较短的边需要水平 放置&#xff0c;较长的边需要垂直放置。Y轴的方向&#xff1a;从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端Z轴…

linux操作——yum、systemctl、firewall、hostname、、、

一、什么是yum yum是一种在Linux操作系统中使用的软件包管理器。它可以用来从软件仓库中下载、安装、更新和删除软件包。yum可以自动解决软件包之间的依赖关系&#xff0c;并且可以方便地查找和安装各种软件。在大多数基于Red Hat的Linux发行版中&#xff0c;如CentOS和Fedora&…

牛客 JZ31.栈的压入,弹出序列 C++写法

牛客 JZ31.栈的压入&#xff0c;弹出序列 C写法 思路&#x1f914;&#xff1a; 创建一个栈&#xff0c;push压入序列&#xff0c;然后用栈顶跟弹出序列比&#xff0c;如果一样就出栈并且继续比较&#xff0c;不一样就再次push入栈&#xff0c;直到压入序列走完&#xff0c;如果…

部署伪分布式 Hadoop集群

部署伪分布式 Hadoop集群 一、JDK安装配置1.1 下载JDK1.2 上传解压1.3 java环境配置 二、伪分布式 Hadoop 安装配置2.1 Hadoop 下载2.2 上传解压2.3 Hadoop 文件目录介绍2.4 Hadoop 配置2.4.1 修改 core-site.xml 配置文件2.4.2 修改 hdfs-site.xml 配置文件2.4.3 修改 hadoop-…

【从零开始一步步学习VSOA开发】URL 资源标识

URL 资源标识 概念 在 VSOA 的世界里&#xff0c;所有的差异化均得到统一&#xff0c;所有的硬件、软件服务均提供统一的资源标签 URL。类似 http://&#xff0c;VSOA 的 URL 以 vsoa:// 开始。下面通过 2 个例子介绍 VSOA 统一资源标识的好处&#xff1a; 匹配规则 URL 标…

Modbus poll和Modbus Mbslave的使用

读取Modbus Mbslave中的数据 首先创建COM1和COM2端口 然后 using System.IO.Ports; ​ namespace 通信 {internal class Program{static void Main(string[] args){Console.WriteLine("Hello, World!");SerialPort serialPort new SerialPort("COM1",960…

前缀和专题

板子&#xff1a; &#xff08;占坑&#xff09; Leetcode 238. 除自身以外数组的乘积 优化前&#xff1a;使用前后缀数组记录 class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int n nums.size();vector<int> pre(n, 1),…

JMeter 压测Http接口

前言 今天产品在会议上吐槽说我们的服务接口连一点点压力都扛不住&#xff0c;用户稍微用下翻译功能&#xff0c;就报错 429。我一听 429 就觉得不对劲&#xff0c;明明4xx 的错误码应该找前端才对的&#xff0c;怎么能找我这个前端后端运维测试工程师呢&#xff1f; 如果是产…