永久免费的网站推荐,文字图片制作网站,编程网课哪家好,建一个展示网站下班多少钱一 Keepalived热备
1 概述
调度器出现单点故障#xff0c;如何解决?Keepalived实现了高可用集群Keepalived最初是为LVS设计的#xff0c;专门监控各服务器节点的状态Keepalived后来加入了VRRP功能#xff0c;防止单点故障
2 运行原理
Keepalived检测每个服务器节点状…一 Keepalived热备
1 概述
调度器出现单点故障如何解决?Keepalived实现了高可用集群Keepalived最初是为LVS设计的专门监控各服务器节点的状态Keepalived后来加入了VRRP功能防止单点故障
2 运行原理
Keepalived检测每个服务器节点状态当服务器节点异常或工作出现故障 Keepalived将故障节点从集群系统中剔除故障节点恢复后Keepalived再将其加入到集群系统中所有工作自动完成无需人工千预
3 配高可用的web拓扑
使用keepalived为主从设备提供VIP地址漂移 二 案列1使用Keepalived实现web服务器的高可用
Web服务器IP地址分别为192.168.88.100和192.168.88.200Web服务器的VIP地址为192.168.88.80客户端通过访问VIP地址访问Web页面
1 环境说明
web1eth0-192.168.88.100/24web2eth0-192.168.88.200/24
2 配置keepalived
# 在两台web服务器上安装keepalived
[rootpubserver cluster]# vim 07-install-keepalived.yml
---
- name: install keepalivedhosts: webserverstasks:- name: install keepalived # 安装keepalivedyum:name: keepalivedstate: present
[rootpubserver cluster]# ansible-playbook 07-install-keepalived.yml# 修改配置文件
[rootweb1 ~]# 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 }
# 删除下面所有行[rootweb1 ~]# systemctl start keepalived
# 等几秒服务完全启动后可以查看到vip
[rootweb1 ~]# ip a s eth0 | 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# 配置web2
[rootweb1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.200:/etc/keepalived/
[rootweb2 ~]# 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 }# 启动服务
[rootweb2 ~]# systemctl start keepalived
# 查看地址eth0不会出现vip
[rootweb2 ~]# ip a s | grep 88inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0# 测试现在访问88.80看到是web1上的内容
[rootclient1 ~]# curl http://192.168.88.80
Welcome from web1# 模拟web1出现故障
[rootweb1 ~]# systemctl stop keepalived.service # 测试现在访问88.80看到是web2上的内容
[rootclient1 ~]# curl http://192.168.88.80
Welcome from web2# 在web2上查看vip可以查看到vip 192.168.88.80
[rootweb2 ~]# 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
三 案例2配置track_script脚本
通过track script脚本控制监视MASTER服务器的80端口实现主备切换
创建/etc/keepalived/check_http.sh脚本该脚本检查本机是否监听在80端口如果正在监听端口退出码设置为0否则为1修改KeepAlived配置利用创建的脚本决定是否要切换VIP到BACKUP节点
1 跟踪脚本
KeepAlived默认只提供一个VIP对运行的服务无感知track_script用于检查一个脚本的返回值如果返回值为0则认为当前主机处于正常状态如果返回值为1则认为当前主机处于异常状态需要将VIP地址切换到另一台备用机器上track_script来检测应用程序或服务是否正常可以增加VIP地址更准确、可靠的自动切换功能提高系统的可用性和可靠性
2 实现原理
配置高可用的web集群时Keepalived只为服务器提供了VIPKeepalived不知道服务器上运行了哪些服务MASTER服务器可以通过跟踪脚本监视本机的80端口一旦本机80端口失效则将VIP切换至BACKUP服务器Keepalived对脚本的要求是退出码为0表示访问成功退出码为1表示失败。
3 实施
# 1. 在MASTER上创建监视脚本
[rootweb1 ~]# vim /etc/keepalived/check_http.sh
#!/bin/bashss -tlnp | grep :80 /dev/null exit 0 || exit 1[rootweb1 ~]# chmod x /etc/keepalived/check_http.sh# 2. 修改MASTER配置文件使用脚本
[rootweb1 ~]# 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.sh22 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. 重起服务
[rootweb1 ~]# systemctl restart keepalived.service # 4. 测试关闭web1的nginx后VIP将会切换至web2
[rootweb1 ~]# systemctl stop nginx.service
[rootweb1 ~]# ip a s | grep 88inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0
[rootweb2 ~]# 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
[rootweb1 ~]# systemctl start nginx.service
[rootweb1 ~]# 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
[rootweb2 ~]# ip a s | grep 88inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0
四 案列3Keepalived LVS服务器
准备5台服务器两台用于Real ServerI两台用于搭建高可用、负载平衡集群一台作为路由器在RealServer上配置VIP并调整内核参数两台调度器节点均安装Keepalived和LVS通过Keepalived配置DR模式的LVS
1 项目拓扑图
使用Keepalived高可用解决调度器单点失败问题主、备调度器上配置LVS主调度器异常时Keepalived启用备用调度器调度器
2 环境准备
环境说明LVS-DR模式
client1eth0-192.168.88.10lvs1eth0-192.168.88.5lvs2eth0-192.168.88.6web1eth0-192.168.88.100web2eth0-192.168.88.200 # 关闭2台web服务器上的keepalived并卸载
[rootpubserver cluster]# vim 08-rm-keepalived.yml
---
- name: remove keepalivedhosts: webserverstasks:- name: stop keepalived # 停服务service:name: keepalivedstate: stopped- name: uninstall keepalived # 卸载yum:name: keepalivedstate: absent
[rootpubserver cluster]# ansible-playbook 08-rm-keepalived.yml# 创建新虚拟机lvs2
[rootmyhost ~]# vm clone lvs2# 为lvs2设置ip地址
[rootmyhost ~]# vm setip lvs2 192.168.88.6# 连接
[rootmyhost ~]# ssh 192.168.88.6 配置高可用、负载均衡
在2台web服务器的lo上配置vip在2台web服务器上配置内核参数删除lvs1上的eth0上的VIP地址。因为vip将由keepalived接管
[rootpubserver 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
[rootpubserver cluster]# ansible-playbook 09-del-lvs1-vip.yml# 查看结果
[rootlvs1 ~]# ip a s eth0 | grep 88inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
删除lvs1上的lvs规则。因为lvs规则将由keepalived创建
[rootlvs1 ~]# ipvsadm -Ln # 查看规则
[rootlvs1 ~]# ipvsadm -D -t 192.168.88.15:80
在lvs上配置keepalived
# 在主机清单文件中加入lvs2的说明
[rootpubserver cluster]# vim inventory
...略...
[lb]
lvs1 ansible_host192.168.88.5
lvs2 ansible_host192.168.88.6
...略...# 安装软件包
[rootpubserver 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/
[rootpubserver cluster]# ansible-playbook 10-upload-repo.yml [rootpubserver cluster]# vim 11-install-lvs2.yml
---
- name: install lvs keepalivedhosts: lbtasks:- name: install pkgs # 安装软件包yum:name: ipvsadm,keepalivedstate: present
[rootpubserver cluster]# ansible-playbook 11-install-lvs2.yml[rootlvs1 ~]# 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服务
[rootlvs1 ~]# systemctl start keepalived# 验证
[rootlvs1 ~]# 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
[rootlvs1 ~]# ipvsadm -Ln # 出现规则
IP Virtual Server version 1.2.1 (size4096)
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 # 客户端连接测试
[rootclient1 ~]# 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。
[rootlvs1 ~]# vim 39 /etc/keepalived/keepalived.conf
...略...# persistence_timeout 50
...略...
[rootlvs1 ~]# systemctl restart keepalived.service
# 在客户端验证
[rootclient1 ~]# 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
[rootlvs1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.6:/etc/keepalived/
[rootlvs2 ~]# vim /etc/keepalived/keepalived.conf 12 router_id lvs221 state BACKUP24 priority 80
[rootlvs2 ~]# systemctl start keepalived
[rootlvs2 ~]# ipvsadm -Ln # 出现规则
IP Virtual Server version 1.2.1 (size4096)
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
验证
# 1. 验证真实服务器健康检查
[rootweb1 ~]# systemctl stop nginx
[rootlvs1 ~]# ipvsadm -Ln # web1在规则中消失
[rootlvs2 ~]# ipvsadm -Ln[rootweb1 ~]# systemctl start nginx
[rootlvs1 ~]# ipvsadm -Ln # web1重新出现在规则中
[rootlvs2 ~]# ipvsadm -Ln# 2. 验证lvs的高可用性
[rootlvs1 ~]# shutdown -h now # 关机
[rootlvs2 ~]# 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依然可用
[rootclient1 ~]# 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
1 简介
它是免费、快速并且可靠的一种解决方案适用于那些负载特大的web站点这些站点通常又需要会话保持或七层处理可以提供高可用性、负载均衡以及基于TCP和HTTP应用的代理
2 衡量负责均衡器性能的因素
Session rate 会话率每秒钟产生的会话数Session concurrency 并发会话数服务器处理会话的时间越长并发会话数越多Data rate数据速率以MB/s或Mbps衡量
3 工作模式
mode http - 客户端请求被深度分析后再发往服务器只适用于web服务mode tcp - 4层调度不检查第七层信息适用于各种服务mode health - 仅做健康状态检查已经不建议使用
六 案列4 配置HAProxy负载平衡集群
准备三台虚拟机两台做Web服务器一台安装HAProxy安装并配置HAProxy发往HAProxy的连接请求分发到真正的Web服务器-把HAProxy设置为开机自动启动设置HAProxy以实现监控并查看监控信息
1 项目拓扑图 2 环境准备
client1eth0 - 192.168.88.10HAProxyeth0 - 192.168.88.5web1eth0 - 192.168.88.100web2eth0 - 192.168.88.200
3 初始化配置
# 关闭192.168.88.6
[rootlvs2 ~]# shutdown -h now# 配置192.168.88.5为haproxy服务器
[rootpubserver 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
[rootpubserver cluster]# ansible-playbook 12-config-haproxy.yml# web服务器不需要配置vip不需要改内核参数。但是存在对haproxy也没有影响。
配置haproxy
# 修改配置文件
[roothaproxy1 ~]# vim /etc/haproxy/haproxy.cfg
# 配置文件中global是全局配置default是缺省配置如果后续有和default相同的配置default配置将会被覆盖。
# 配置文件中frontend描述haproxy怎么和用户交互backend描述haproxy怎么和后台应用服务器交互。这两个选项一般不单独使用而是合并到一起名为listen。
# 将64行之后全部删除写入以下内容64 #---------------------------------------------------------------------65 listen myweb # 定义虚拟服务器66 bind 0.0.0.0:80 # 监听在所有可用地址的80端口67 balance roundrobin # 定义轮询调度算法# 对web服务器做健康检查2秒检查一次如果连续2次检查成功认为服务器是健康的如果连续5次检查失败认为服务器坏了68 server web1 192.168.88.100:80 check inter 2000 rise 2 fall 569 server web2 192.168.88.200:80 check inter 2000 rise 2 fall 570 71 listen stats # 定义虚拟服务器72 bind 0.0.0.0:1080 # 监听在所有可用地址的1080端口73 stats refresh 30s # 设置监控页面自动刷新时间为30秒74 stats uri /stats # 定义监控地址是/stats75 stats auth admin:admin # 监控页面的用户名和密码都是admin# 启服务
[roothaproxy1 ~]# systemctl start haproxy.service
# 使用firefox访问监控地址 http://192.168.88.5:1080/stats# 客户端访问测试
[rootclient1 ~]# for i in {1..6}; do curl http://192.168.88.5/; done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1# client1上使用ab访问
[rootclient1 ~]# yum install -y httpd-tools
[rootclient1 ~]# ab -n1000 -c200 http://192.168.88.5/
监控地址 http://192.168.88.5:1080/stats如下 Queue队列长度。Cur当前队列长度Max最大队列长度Limit限制长度Session rate会话率每秒钟的会话数Sessions会话数Bytes字节数。In收到的字节数Out发出的字节数Denied拒绝。Req请求Resp响应Errors错误Warning警告Status状态LastChk上一次检查。L4OK第四层tcp检查通过Wght权重
七 负载均衡调度器比较
LVS适用于需要高并发性和稳定性的场景Nginx适用于静态文件服务和反向代理等应用层负载均衡场景HAProxy则具备较为丰富的功能和灵活性适用于多种负载均衡场景。
1 LVSLinux Virtual Server
优点
高性能LVS使用Linux内核中的IP负载均衡技术能够实现非常高的并发处理能力。稳定性LVS经过长时间的实践应用成熟稳定被广泛使用。可用性支持高可用性的配置可以实现故障自动切换提供无中断的服务。灵活性可根据需要采用多种负载均衡算法如轮询、加权轮询、哈希等。
缺点
配置复杂相对于其他两个技术LVS的配置相对较为复杂需要更深入的了解和配置。功能相对局限LVS主要是一种传输层负载均衡技术无法像Nginx和HAProxy那样对应用层协议进行处理。
2 Nginx
优点
高性能Nginx采用了基于事件驱动的异步非阻塞架构能够处理大量并发连接。负载均衡Nginx具备内置的负载均衡功能可以根据配置进行请求的转发。丰富的功能Nginx支持反向代理、静态文件服务、缓存、SSL等在Web服务器领域有很广泛的应用。
缺点
功能相对较少相对于LVS和HAProxyNginx在负载均衡算法和健康检查等方面的功能相对较少。限制于应用层协议Nginx只能对HTTP和HTTPS等应用层协议进行处理无法处理其他协议。
3 HAProxy
优点
灵活性HAProxy支持丰富的负载均衡算法和会话保持方式可以根据需求进行灵活配置。完整的功能HAProxy支持高可用性配置、健康检查、故障恢复、SSL等功能在负载均衡领域应用广泛。高性能HAProxy性能优良能够处理大量并发连接并且支持异步IO模型。
缺点
内存占用相对于Nginx和LVSHAProxy在处理大量连接时消耗的内存稍高一些。高可用性HAProxy需要借助额外的工具来实现高可用性例如Keepalived。