Web集群_02

embedded/2024/12/22 2:07:26/

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/embedded/15136.html

相关文章

C语言:贪吃蛇游戏(万字解读超详细)

目录 前言 控制台的修改 修改默认终端程序 修改控制台窗口大小 system函数 修改控制台窗口名字 隐藏控制台光标 GetStdHandle函数 GetConsoleCursorInfo函数 SetConsoleCursorInfo函数 测试代码 设置光标位置 COORD自定义类型 SetConsoleCursorPosition函数 按键…

前端工程化01-复习jQuery当中的AJAX

4.1、基础概念 什么是服务器 一台存储网站内容、网站文件的电脑 什么是资源 网站中使用的文件(html、css、图片、…)这些东西就叫做资源数据也是服务器上的资源,而且是一个网站的灵魂 客户端 客户端应该指上网的设备但是在前端开发中&a…

Java web第四次作业

要求:读取xml文件并在页面中显示出来。 采用三种方式实现,并体会其中的原理: 1.常规方式,controlller控制器不分层 代码:RestController public class PoetController { RequestMapping("/listPoet") pu…

java算法day5

哈希表基础哈希表写题基础字符串类有效的字母异位词ArrayList用法两个数组的交集两数之和 哈希表基础 哈希函数: 哈希表使用哈希函数将键转换为数组的索引。理想情况下,哈希函数应该将键均匀分布在数组中,以减少冲突(两个键映射到…

Leetcode刷题之——队列Queue|先入先出FIFO|广度优先搜索BFS|栈Stack|后入先出LIFO|深度优先搜索DFS

Leetcode刷题之——队列Queue|先入先出FIFO|广度优先搜索BFS|栈Stack|后入先出LIFO|深度优先搜索DFS 1. 队列(Queue)——FIFO,先入先出的数据结构1.1 循环队列1.2 内置队列的常用方法(C)1.3 广度优先搜索(BFS) 2.栈(St…

WEB服务的配置与使用 Apache HTTPD

服务端:服务器将发送由状态代码和可选的响应正文组成的 响应 。状态代码指示请求是否成功,如果不成功,则指示存在哪种错误情况。这告诉客户端应该如何处理响应。较为流星的web服务器程序有: Apache HTTP Server 、 Nginx 客户端&a…

Linux_进程

目录 1、冯诺依曼体系 2、Linux下的进程概念 3、PCB结构体 4、在Linux下查看进程 5、父子进程 6、终止进程 7、操作系统的进程状态 7.1 Linux下的进程状态 8、孤儿进程 9、进程优先级 9.1 PRI和NI 结语 前言: 进程作为操作系统中最核心的知识点之…

Mysql学习大纲

文章目录 整体大纲总结 整体大纲 大纲 MySQL在金融互联网行业的企业级安装部署mysql启动关闭原理和实战,及常见错误排查 花钱9.9 订阅了专栏MySQL字符集和校对规则史上最详细的Mysql用户权原理和实战,生产案例InnoDB引擎原理和实战,通俗易懂…