Web集群_02

ops/2025/3/21 0:32:11/

Web集群_01

Keepalived

概述
  • Keepalived实现了高可用集群

  • Keepalived最初是为LVS设计 , 专门监控各种服务器节点的状态

  • Keepalived 后加入了 VRRP 功能 , 防止单点故障

    • VRRP ( 虚拟冗余路由协议 )

    • VRRP能在不改变网组的情况下 , 将多台路由器虚拟成一个虚拟路由器 , 通过配置虚拟路由器的IP地址为默认网关 , 实现网关的备份

作用
  • 通过 VRRP 实现服务或网络的高可用性
  • 为LVS设计 , 监控集群各个服务节点的状态
  • 某个节点出现故障时 , Keepalived将检测到后将节点从集群系统中剔除
  • 节点修复后 , 自动将此节点重新加入集群
  • 节点需要手工修复
特点
  1. 部署简单 , 只需要配置一个配置文件即可
  2. 加入了VRRP , 可以保证业务或网络不间断稳定运行
核心功能
  • 健康检查
    • 采用 tcp三次握手 , icmp请求 , http请求 , udp , echo请求等方式
    • 对负载均衡后端实际服务器进行保活
  • 故障切换
    • 主要应用在配置了主备的服务器上
    • 使用ARRP 协议维持主备之间的心跳
    • 当主服务器出现问题时 , 由备服务器承载对应业务
    • 最大限度减少损失 , 并提供服务的稳定性
原理

keepalived 工作在 TCP/IP五层模型中 , 使用 第三层到第五层

网络层 , 传输层 , 应用层

  • 网络层 : 通过 ICMP协议向集群每个节点发送UCMP数据包 , 根据回馈判定节点是否正常运行 , 失效节点则剔除集群
  • 传输层 : 通过 TCP协议的端口连接和扫描技术判断集群节点是否正常 , 若端口无反映则视为失效节点
  • **应用层 : 用户可以编写shell脚本或playbook剧本来运行keepalived , keepalived根据脚本检测各种程序或服务是否正常 . **

配置Keepalived 高可用web集群

# 在两台web服务器上安装keepalived
[root@pubserver cluster]# vim 07-install-keepalived.yml
---
- name: install keepalivedhosts: webserverstasks:- name: install keepalived   # 安装keepalivedyum:name: keepalivedstate: present[root@pubserver cluster]# ansible-playbook 07-install-keepalived.yml# 修改配置文件
[root@web1 ~]# vim /etc/keepalived/keepalived.conf 12    router_id web1    # 设置本机在集群中的唯一识别符13    vrrp_iptables     # 自动配置iptables放行规则... ...20 vrrp_instance VI_1 {21     state MASTER           # 状态,主为MASTER,备为BACKUP22     interface eth0         # 网卡23     virtual_router_id 51   # 虚拟路由器地址24     priority 100           # 优先级25     advert_int 1           # 发送心跳消息的间隔26     authentication {27         auth_type PASS     # 认证类型为共享密码28         auth_pass 1111     # 集群中的机器密码相同,才能成为集群29     }   30     virtual_ipaddress {31         192.168.88.80/24    # VIP地址32     }   33 }
# 删除下面所有行
[root@web1 ~]# systemctl start keepalived# 等几秒服务完全启动后,可以查看到vip
[root@web1 ~]# ip a s eth0 | grep '88'inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0# 配置web2
[root@web1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.200:/etc/keepalived/[root@web2 ~]# vim /etc/keepalived/keepalived.conf 12    router_id web2          # 改id13    vrrp_iptables... ... 20 vrrp_instance VI_1 {21     state BACKUP           # 改状态22     interface eth023     virtual_router_id 5124     priority 80            # 改优先级25     advert_int 126     authentication {27         auth_type PASS28         auth_pass 111129     }30     virtual_ipaddress {31         192.168.88.80/2432     }33 }# 启动服务
[root@web2 ~]# systemctl start keepalived
# 查看地址,eth0不会出现vip
[root@web2 ~]# ip a s | grep '88'inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0# 测试,现在访问88.80,看到是web1上的内容
[root@client1 ~]# curl http://192.168.88.80
Welcome from web1# 模拟web1出现故障
[root@web1 ~]# systemctl stop keepalived.service # 测试,现在访问88.80,看到是web2上的内容
[root@client1 ~]# curl http://192.168.88.80
Welcome from web2# 在web2上查看vip,可以查看到vip 192.168.88.80
[root@web2 ~]# ip a s | grep '88'inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0

监控80端口 , 实现主备切换

实现原理
  • 配置高可用的web集群时,Keepalived只为服务器提供了VIP

  • Keepalived不知道服务器上运行了哪些服务

  • MASTER服务器可以通过跟踪脚本监视本机的80端口,一旦本机80端口失效,则将VIP切换至BACKUP服务器

  • Keepalived对脚本的要求是,退出码为0表示访问成功;退出码为1表示失败。

实施
# 1. 在MASTER上创建监视脚本
[root@web1 ~]# vim /etc/keepalived/check_http.sh
#!/bin/bash
ss -tlnp | grep :80 &> /dev/null && exit 0 || exit 1[root@web1 ~]# chmod +x /etc/keepalived/check_http.sh# 2. 修改MASTER配置文件,使用脚本
[root@web1 ~]# vim /etc/keepalived/keepalived.conf 1 ! Configuration File for keepalived2 3 global_defs {
...略...18 }19 20 vrrp_script chk_http_port {  # 定义监视脚本21     script "/etc/keepalived/check_http.sh"22     interval 2   # 脚本每隔2秒运行一次23 }2425 vrrp_instance VI_1 {26     state MASTER27     interface eth028     virtual_router_id 5129     priority 10030     advert_int 131     authentication {32         auth_type PASS33         auth_pass 111134     }35     virtual_ipaddress {36         192.168.88.80/2437     }38     track_script {    # 引用脚本39         chk_http_port40     }41 }# 3. 重起服务
[root@web1 ~]# systemctl restart keepalived.service # 4. 测试,关闭web1的nginx后,VIP将会切换至web2
[root@web1 ~]# systemctl stop nginx.service 
[root@web1 ~]# ip a s | grep 88inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0
[root@web2 ~]# ip a s | grep 88inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0# 5. 当MASTER的nginx修复后,VIP将会切换回至web1
[root@web1 ~]# systemctl start nginx.service 
[root@web1 ~]# ip a s | grep 88inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0[root@web2 ~]# ip a s | grep 88inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0

配置高可用 , 负载均衡web集群

  • 开启web1 , web2 的虚拟网卡 ifup lo:0 192.168.88.15
  • ifup lo:0
  • 设置开启自动启动
  • /etc/rc.d/rc.local 内为开机执行命令 , 添加 ifup lo:0
LVS-DR模式
  • client1:eth0->192.168.88.10
  • lvs1:eth0->192.168.88.5
  • lvs2:eth0->192.168.88.6
  • web1:eth0->192.168.88.100
  • web2:eth0->192.168.88.200
环境准备
# 关闭2台web服务器上的keepalived,并卸载
[root@pubserver cluster]# vim 08-rm-keepalived.yml
---
- name: remove keepalivedhosts: webserverstasks:- name: stop keepalived       # 停服务service:name: keepalivedstate: stopped- name: uninstall keepalived   # 卸载yum:name: keepalivedstate: absent[root@pubserver cluster]# ansible-playbook 08-rm-keepalived.yml# 创建新虚拟机lvs2
[root@myhost ~]# vm clone lvs2# 为lvs2设置ip地址
[root@myhost ~]# vm setip lvs2 192.168.88.6# 连接
[root@myhost ~]# ssh 192.168.88.6
配置高可用 , 负载均衡
1. 在2台web服务器的lo上配置vip
2. 在2台web服务器上配置内核参数
3. 删除lvs1上的eth0上的VIP地址。因为vip将由keepalived接管
[root@pubserver cluster]# vim 09-del-lvs1-vip.yml
---
- name: del lvs1 viphosts: lvs1tasks:- name: rm viplineinfile:            # 在指定文件中删除行path: /etc/sysconfig/network-scripts/ifcfg-eth0regexp: 'IPADDR2='   # 正则匹配state: absentnotify: restart systemhandlers:- name: restart systemshell: reboot[root@pubserver cluster]# ansible-playbook 09-del-lvs1-vip.yml# 查看结果
[root@lvs1 ~]# ip a s eth0 | grep 88inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
4. 删除lvs1上的lvs规则。因为lvs规则将由keepalived创建
[root@lvs1 ~]# ipvsadm -Ln   # 查看规则
[root@lvs1 ~]# ipvsadm -D -t 192.168.88.15:80
5. 在lvs上配置keepalived
# 在主机清单文件中加入lvs2的说明
[root@pubserver cluster]# vim inventory
...略...
[lb]
lvs1 ansible_host=192.168.88.5
lvs2 ansible_host=192.168.88.6
...略...# 安装软件包
[root@pubserver cluster]# cp 01-upload-repo.yml 10-upload-repo.yml
---
- name: config repos.dhosts: lbtasks:- name: delete repos.dfile:path: /etc/yum.repos.dstate: absent- name: create repos.dfile:path: /etc/yum.repos.dstate: directorymode: '0755'- name: upload local88copy:src: files/local88.repodest: /etc/yum.repos.d/[root@pubserver cluster]# ansible-playbook 10-upload-repo.yml [root@pubserver cluster]# vim 11-install-lvs2.yml
---
- name: install lvs keepalivedhosts: lbtasks:- name: install pkgs    # 安装软件包yum:name: ipvsadm,keepalivedstate: present[root@pubserver cluster]# ansible-playbook 11-install-lvs2.yml[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf 12    router_id lvs1       # 为本机取一个唯一的id13    vrrp_iptables        # 自动开启iptables放行规则
... ...20 vrrp_instance VI_1 {21     state MASTER22     interface eth023     virtual_router_id 5124     priority 10025     advert_int 126     authentication {27         auth_type PASS28         auth_pass 111129     }   30     virtual_ipaddress {31         192.168.88.15       # vip地址,与web服务器的vip一致32     }   33 }# 以下为keepalived配置lvs的规则35 virtual_server 192.168.88.15 80 {   # 声明虚拟服务器地址36     delay_loop 6     # 健康检查延迟6秒开始37     lb_algo wrr      # 调度算法为wrr38     lb_kind DR       # 工作模式为DR39     persistence_timeout 50  # 50秒内相同客户端调度到相同服务器40     protocol TCP     # 协议是TCP41 42     real_server 192.168.88.100 80 {   # 声明真实服务器43         weight 1          # 权重44         TCP_CHECK {       # 通过TCP协议对真实服务器做健康检查45             connect_timeout 3 # 连接超时时间为3秒46             nb_get_retry 3    # 3次访问失败则认为真实服务器故障47             delay_before_retry 3  # 两次检查时间的间隔3秒48         }49     }50     real_server 192.168.88.200 80 {51         weight 252         TCP_CHECK {53             connect_timeout 354             nb_get_retry 355             delay_before_retry 356         }57     }58 }# 以下部分删除# 启动keepalived服务
[root@lvs1 ~]# systemctl start keepalived# 验证
[root@lvs1 ~]# ip a s eth0 | grep 88inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.15/32 scope global eth0[root@lvs1 ~]# 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.88.15:80 wrr persistent 50-> 192.168.88.100:80            Route   1      0          0     -> 192.168.88.200:80            Route   2      0          0    # 客户端连接测试
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
Welcome from web2
Welcome from web2
Welcome from web2
Welcome from web2
Welcome from web2
Welcome from web2# 为了效率相同的客户端在50秒内分发给同一台服务器。为了使用同一个客户端可以看到轮询效果,可以注释配置文件中相应的行后,重启keepavlied。
[root@lvs1 ~]# vim +39 /etc/keepalived/keepalived.conf
...略...# persistence_timeout 50
...略...
[root@lvs1 ~]# systemctl restart keepalived.service # 在客户端验证
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2# 配置LVS2
[root@lvs1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.6:/etc/keepalived/[root@lvs2 ~]# vim /etc/keepalived/keepalived.conf 12    router_id lvs221     state BACKUP24     priority 80[root@lvs2 ~]# systemctl start keepalived
[root@lvs2 ~]# 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.88.15:80 wrr-> 192.168.88.100:80            Route   1      0          0     -> 192.168.88.200:80            Route   2      0          0    
6.验证
# 1. 验证真实服务器健康检查
[root@web1 ~]# systemctl stop nginx
[root@lvs1 ~]# ipvsadm -Ln   # web1在规则中消失
[root@lvs2 ~]# ipvsadm -Ln[root@web1 ~]# systemctl start nginx
[root@lvs1 ~]# ipvsadm -Ln   # web1重新出现在规则中
[root@lvs2 ~]# ipvsadm -Ln# 2. 验证lvs的高可用性
[root@lvs1 ~]# shutdown -h now    # 关机
[root@lvs2 ~]# ip a s | grep 88     # 可以查看到vipinet 192.168.88.6/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.15/32 scope global eth0
# 客户端访问vip依然可用
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2

HAProxy

  • 也是一款实现负载均衡的调度器

  • 适用于负载特别大的web站点

  • HAProxy的工作模式:

    • mode http:只适用于web服务
    • mode tcp:适用于各种服务
    • mode health:仅做健康检查,很少使用
初始化配置
  • client1:eth0 -> 192.168.88.10
  • HAProxy:eth0 -> 192.168.88.5
  • web1:eth0 -> 192.168.88.100
  • web2:eth0 -> 192.168.88.200
# 关闭192.168.88.6
[root@lvs2 ~]# shutdown -h now# 配置192.168.88.5为haproxy服务器
[root@pubserver cluster]# vim 12-config-haproxy.yml
---
- name: config haproxyhosts: lvs1tasks:- name: rm lvs keepalived     # 删除软件包yum:name: ipvsadm,keepalivedstate: absent- name: rename hostname       # 修改主机名shell: hostnamectl set-hostname haproxy1- name: install haproxy       # 安装软件包yum:name: haproxystate: present[root@pubserver cluster]# ansible-playbook 12-config-haproxy.yml
# web服务器,不需要配置vip,不需要改内核参数。但是存在对haproxy也没有影响。

http://www.ppmy.cn/ops/15027.html

相关文章

书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)

书生浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版) 环境,模型准备LMDeploy chatTurmind和Transformer的速度对比LMDeploy模型量化(lite)LMDeploy服务(serve) 环境,模型准备 InternStudio 可以直接使用 studio-conda -t …

Golang实现一个批量自动化执行树莓派指令的软件(3)下载

简介 话接上篇 Golang实现一个批量自动化执行树莓派指令的软件(2)指令, 这次实现文件的下载。 环境描述 运行环境: Windows, 基于Golang, 暂时没有使用什么不可跨平台接口, 理论上支持Linux/MacOS 目标终端:树莓派Debi…

【 Vue 路由 跳转 路由守卫 】

Vue Router replace 编程式导航缓存路由组件 路由跳转的replace方法 作用:控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式:push 和 replacereplace是替换当前记录,路由跳转时候默认为push方式 replace 标签写法 : &…

【每日一题】2007. 从双倍数组中还原原数组-2024.4.18

题目: 2007. 从双倍数组中还原原数组 一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 。 给你一个数组 changed ,如果 change 是 双…

Linux常用命令总结(四):文件权限及相关命令介绍

1. 文件属性信息解读 1. 文件类型和权限的表示 0首位表示类型。在Linux中第一个字符代表这个文件是目录、文件或链接文件 符号对应文件类型-代表文件dd 代表目录l链接文档(link file); 1-3位确定属主(该文件的所有者)拥有该文件的权限。 4-6…

处理突发事件—中断

中断是计算机操作系统中用来处理突发事件的一种机制,它允许CPU在执行正常程序流程时暂时停下来,去处理更紧急的任务,处理完成后再恢复原来的任务。中断是现代计算机系统中不可或缺的组成部分,它提高了系统的效率和响应性。 中断的…

ABAP Visual Code 新建sap系统连接

本文主要介绍如何新建SAP前端系统链接 前提是你已经都扩展完了 1.点击SAP fiori--》点击新建 2.选择 abap on premise 3.输入如下信息 4.这里介绍下URL 如何获取 SMICM-->点击service 明细里面可以看到你的host name 和 port 当然你也可以随便找一个你的odata 服务看下ur…

数据库--Sqlite3

1、思维导图 2sqlite3在linux中是实现数据的增删&#xff0c;改 #include<myhead.h> int main(int argc, const char *argv[]) { //1、定义一个数据库句柄指针 sqlite3* ppDb NULL; //2、创建或打开数据库 if(sqlite3_open("./mydb…