Keepalived高可用集群应用实践

Keepalived高可用软件

Keepalived介绍

Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如: Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断的运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

Keepalived三个重要功能

  • 管理LVS负载均衡
  • 对LVS节点做健康检查(基于端口和URL)healthcheck
  • VRRP高可用 ★failover

Keepalived高可用故障切换转移原理

  • keepalived之间通过VRRP实现高可用的。
  • 通过竞选机制实现高可用,或者说是配置优先级,大的是主,小的是备。

Keepalived服务正常工作时,主master节点会不断地向备节点发送(多播的方式)心跳消息用来告诉Backup自己还活着,当主Master节点发生故障就无法发送心跳消息了,备节点就无法检测到来自Master节点的心跳了,备节点进而调用自身接管程序,接管主Master节点的IP资源和服务。而当主Master节点恢复时,备Backup服务全部交给主Master节点。

关于面试问题

VRRP

1)VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。

2)VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。

3)VRRP是用过P多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信的

4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。

5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

Keepalived

Keepalived高可用对之间是通过VRRP协议进行通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。

准备两个节点

配置 IP 名称
1h2g 192.168.218.136 master
1h2g 192.168.218.137 backup

Nginx的安装

1.下载

官网下载

Keepalived高可用集群应用实践 - 图1

2.上传解压

上传到两个服务器上!

  1. tar -xvf nginx-1.20.2.tar.gz #解压到当前文件夹也可

3.准备编译工具

  1. yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
工具名称 环境介绍
gcc 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境
PCRE PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库,nginx 的 http 模块使用 pcre 来解析正则表达式
pcre-devel pcre-devel 是使用 pcre 开发的一个二次开发库
zlib zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip
OpenSSL OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http)

4.编译安装

  1. cd nginx-1.20.2 #进入到文件夹中
  2. ./configure --with-http_stub_status_module --with-http_ssl_module --with-debug #执行编译脚本
  3. make && make install #编译安装

注意:这里执行编译脚本时,没有设置地址,默认地址为/usr/local/nginx

5.配置环境变量

  1. vim /etc/profile #进入配置文件
  2. export PATH=/usr/local/nginx/sbin:$PATH
  3. source /etc/profile #刷新配置文件

此时输入nginx就启动了nginx

Keepalived高可用集群应用实践 - 图2

Keepalived的安装

Keeaplived对版本要求并不是很高,所以这里用yum安装即可。

  1. yum install -y keepalived #安装keepalived

此时两个节点,master和backup都安装了keepalived和nginx

1.配置keepalived

在master节点配置

  1. vim /etc/keepalived/keepalived.conf #进入配置文件
  2. #配置文件中有很多用不到的功能,这里只讲和修改用到的
  3. ! Configuration File for keepalived
  4. global_defs {
  5. notification_email { #自带的邮件提醒功能
  6. 1182350036@qq.com #表示发送通知邮件时邮件源地址是谁
  7. }
  8. notification_email_from test@test.com#表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个
  9. smtp_server 127.0.0.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
  10. smtp_connect_timeout 30 #连接smtp连接超时时间
  11. router_id a136 #机器标识,在一个网络应该是唯一的
  12. #这里还有4个配置,也一并删除
  13. }
  14. vrrp_script chk_config { #脚本配置
  15. script "/usr/local/sbin/check_ng.sh" #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态
  16. interval 3 #检查时间间断是3秒
  17. }
  18. vrrp_instance VI_1 { #VRRP配置标识 VI_1是实例名称
  19. state MASTER #定义master相关
  20. interface ens33 #通过vrrp协议去通信、去发广播。此为网卡名 ens33和eth33要注意别写错。
  21. virtual_router_id 136 #定义路由器ID ,配置的时候和从机器一致
  22. priority 100 #权重,主角色和从角色的权重是不同的,一般主比从大
  23. advert_int 1 #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒
  24. authentication { #认证相关信息
  25. auth_type PASS #认证类型
  26. auth_pass 1111 #密码的形式是一个字符串
  27. }
  28. virtual_ipaddress { #虚拟IP
  29. 192.168.218.100
  30. }
  31. track_script{ #跟踪执行脚本
  32. chk_nginx
  33. }
  34. }
  35. #在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!!
  36. #在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!!
  37. #在配置文件中会出现下面的配置,如果只做高可用下面必须删除!!!!!!!
  38. virtual_server 192.168.200.100 443 {
  39. delay_loop 6
  40. lb_algo rr
  41. lb_kind NAT
  42. persistence_timeout 50
  43. protocol TCP
  44. real_server 192.168.201.100 443 {
  45. weight 1
  46. SSL_GET {
  47. url {
  48. path /
  49. digest ff20ad2481f97b1754ef3e12ecd3a9cc
  50. }
  51. url {
  52. path /mrtg/
  53. digest 9b3a0c85a887a256d6939da88aabd8cd
  54. }
  55. connect_timeout 3
  56. nb_get_retry 3
  57. delay_before_retry 3
  58. }
  59. }
  60. }
  61. virtual_server 10.10.10.2 1358 {
  62. delay_loop 6
  63. lb_algo rr
  64. lb_kind NAT
  65. persistence_timeout 50
  66. protocol TCP
  67. sorry_server 192.168.200.200 1358
  68. real_server 192.168.200.2 1358 {
  69. weight 1
  70. HTTP_GET {
  71. url {
  72. path /testurl/test.jsp
  73. digest 640205b7b0fc66c1ea91c463fac6334d
  74. }
  75. url {
  76. path /testurl2/test.jsp
  77. digest 640205b7b0fc66c1ea91c463fac6334d
  78. }
  79. url {
  80. path /testurl3/test.jsp
  81. digest 640205b7b0fc66c1ea91c463fac6334d
  82. }
  83. connect_timeout 3
  84. nb_get_retry 3
  85. delay_before_retry 3
  86. }
  87. }
  88. real_server 192.168.200.3 1358 {
  89. weight 1
  90. HTTP_GET {
  91. url {
  92. path /testurl/test.jsp
  93. digest 640205b7b0fc66c1ea91c463fac6334c
  94. }
  95. url {
  96. path /testurl2/test.jsp
  97. digest 640205b7b0fc66c1ea91c463fac6334c
  98. }
  99. connect_timeout 3
  100. nb_get_retry 3
  101. delay_before_retry 3
  102. }
  103. }
  104. }
  105. virtual_server 10.10.10.3 1358 {
  106. delay_loop 3
  107. lb_algo rr
  108. lb_kind NAT
  109. persistence_timeout 50
  110. protocol TCP
  111. real_server 192.168.200.4 1358 {
  112. weight 1
  113. HTTP_GET {
  114. url {
  115. path /testurl/test.jsp
  116. digest 640205b7b0fc66c1ea91c463fac6334d
  117. }
  118. url {
  119. path /testurl2/test.jsp
  120. digest 640205b7b0fc66c1ea91c463fac6334d
  121. }
  122. url {
  123. path /testurl3/test.jsp
  124. digest 640205b7b0fc66c1ea91c463fac6334d
  125. }
  126. connect_timeout 3
  127. nb_get_retry 3
  128. delay_before_retry 3
  129. }
  130. }
  131. real_server 192.168.200.5 1358 {
  132. weight 1
  133. HTTP_GET {
  134. url {
  135. path /testurl/test.jsp
  136. digest 640205b7b0fc66c1ea91c463fac6334d
  137. }
  138. url {
  139. path /testurl2/test.jsp
  140. digest 640205b7b0fc66c1ea91c463fac6334d
  141. }
  142. url {
  143. path /testurl3/test.jsp
  144. digest 640205b7b0fc66c1ea91c463fac6334d
  145. }
  146. connect_timeout 3
  147. nb_get_retry 3
  148. delay_before_retry 3
  149. }
  150. }
  151. }

backup节点

  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 127.0.0.1
  10. smtp_connect_timeout 30
  11. router_id a137
  12. }
  13. vrrp_script chk_config{
  14. script "/usr/local/sbin/check_ng.sh"
  15. interval 3
  16. }
  17. vrrp_instance VI_1 {
  18. state BACKUP
  19. interface ens33
  20. virtual_router_id 136
  21. priority 99
  22. advert_int 1
  23. authentication {
  24. auth_type PASS
  25. auth_pass 1111
  26. }
  27. virtual_ipaddress {
  28. 192.168.218.100
  29. }
  30. track_script{
  31. chk_config
  32. }
  33. }

设置脚本,两个节点的脚本皆是如此

  1. [master/backup] vim /usr/local/sbin/check_ng.sh #在两个节点中创建脚本文件,内容如下:
  2. d='date --date today +%Y%m%d_%H:%M:S'
  3. n='ps -C nginx --no-heading|wc -l'
  4. if [ $n -eq "0" ]; then
  5. /etc/init.d/nginx start
  6. n2='ps -C nginx --no-heading|wc -l'
  7. if [ $n -eq "0" ]; then
  8. echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
  9. systemctl stop keepalived
  10. fi
  11. fi

2.重启nginx和keepalived

创建nginx.service配置nginx自启

我们用tar包安装的时候,虽然配置了环境变量,但是依然无法使用systemctl控制nginx的启动,所以创建文件设置自启!

  1. [master/backup]vim /lib/systemed/system/nginx.serivce
  2. #写入以下内容
  3. [Unit]
  4. Description=nginx service
  5. After=network.target
  6. [Service]
  7. Type=forking
  8. ExecStart=/usr/local/nginx/sbin/nginx #这里注意nginx的位置
  9. ExecReload=/usr/local/nginx/sbin/nginx -s reload
  10. ExecStop=/usr/local/nginx/sbin/nginx -s quit
  11. PrivateTmp=true
  12. [Install]
  13. WantedBy=multi-user.target
  14. [master/backup]systemctl enable nginx #设置nginx自启
  15. [master/backup]systemctl enable keepalived #设置keepalived自启
  16. [master/backup]systemctl restart nginx keepalived #重启两个服务

查看高可用

前面我们给两个节点配置的IP为192.168.218.100,并且网卡中会出现该IP!所以通过192.168.218.100就可以进入主节点的nginx服务器。

Keepalived高可用集群应用实践 - 图3

此时192.168.218.100进入的是master的136

Keepalived高可用集群应用实践 - 图4

此时我们把master节点的keepalived关闭,再刷新192.168.218.100

  1. [master]systemctl stop keepalived

此时访问的就是backup节点的nginx服务器。

Keepalived高可用集群应用实践 - 图5

除了切换到backup节点,数据再转回到master节点也是同样重要的!我们这里把master节点的keepalived打开!

  1. [master]systemctl start keepalived

此时就转回到master节点了。

Keepalived高可用集群应用实践 - 图6

LVS高并发集群

LVS就是Linux虚拟服务器,Linxu virtual server,是由章文嵩博士主导开发的负载均衡项目。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器。

轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
原文链接:https://blog.csdn.net/weixin_40470303/article/details/80541639

Keepalived高可用集群应用实践 - 图7

集群功能分类

LB:Load Balancing,负载均衡,增加处理能力,有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为根本着眼点。

软件负载均衡设备:LVS,NGINX,HAPROXY。便宜,易用,但是对比于硬件设备功能低一些。三个软件技术之间,各有千秋,企业三种软件都会使用。

HA:High Avaliability 高可用集群(增加服务的可用性)。高可用服务器保持服务器始终在线不宕机。

衡量可用性:在线时间/(在线时间+故障处理时间)。

负载均衡

负载均衡有多种实现方式:

  • Http重定向
    • 搭建HTTP重定向服务器,用户访问到服务器,服务器再响应重定向到web服务器。
    • 优点:简单
    • 缺点:性能差,需要多次访问,并且还会被SEO判断为作弊。

Keepalived高可用集群应用实践 - 图8

  • DNS负载均衡
    • 我们无法实现,必须花钱。在DNS解析时获得负载能力,DNS服务器的算法进行域名分配。
    • 优点:将负载均衡交给了DNS,省去了网站管理和负载均衡服务器的麻烦。
    • 缺点:目前的DNS解析时多级解析,每一级DNS都可能化缓存记录A,当模拟服务器下线后,DNS记录依然存在,导致分配到该服务器的用户访问失败。
    • DNS负载均衡的控制权在服务商手里,网站可能无法做出过多的改善和管理,不能够按照服务器处理能力来分配负载均衡。不能区分服务器之间的差异,不能反映服务器当前运行状态。
  • 反向代理负载均衡
    • 反向代理处于web服务器这边,反向代理服务器提供负载均衡的功能,同时管理一组web服务器,它根据负载均衡算法将请求的浏览器访问转发到不同的店web服务器处理,处理结果经过反向服务器返回给浏览器。
    • 优点:部署简单,处于http协议层面
  • IP负载均衡
    • IP网络层负载均衡(根据IP进行转发)
      • 在网络层和传输层(ip和端口)通过修改目标地址进行负载均衡。用户访问请求到达负载均衡服务器,服务器在操作系统内核进程获取网络数据包,根据算法得到一台真是服务器地址,然后将用户请求的目标地址改成真是服务器地址,数据处理完后返回给负载均衡服务器,服务器收到响应后将自身地址修改成原用户访问地址后再讲数据返回回去。类似于反向服务器负载均衡。
      • 优点:速度很快
      • 缺点:无法处理比较高级的请求
    • 数据链路层负载均衡(根据MAC地址进行转发)
      • 在数据链路层修改Mac地址进行负载均衡。负载均衡服务器的IP和它所管理的web服务群的虚拟IP一致;负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址;通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问。
      • 优点:不需要负载均衡器进行IP地址转换,也就是进入时会被分配到不同MAC相同IP的服务器,回来时由当前服务器直接返回。
      • 缺点:对负载均衡服务器网卡要求较高
  • F5硬件负载均衡
    • 前面技术有的,他都有。能根据URL,IP,MAC,DNS都能转发。
    • 缺点:贵

四层负载和七层负载

第四层:传输层

第七层:应用层

所谓四层就是基于IP+端口的负载均衡,主要代表有LVS。

七层负载也称内容交换,就是基于URL等应用信息的负载均衡,主要代表有nginx。

LVS概述

LVS工作在一台server上提供Directory(负载均衡器/目录服务器)的功能,本身并不提供服务,只是把特定的请求转发给对应的real server(真正提供服务的主机),从而实现集群环境中的负载均衡。

工作模式

  • NAT转发模式

Network Address Translation 网络地址转发模式

工作原理:

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标IP地址改为了后端服务器的RIP地址并将报文根据算法发送出去。

③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。

④.然后lvs将此报文的源地址修改为本机并发送给客户端。

优点:

网络隔离更安全

节约IP地址

缺点:

随着数据的加大,目录服务器会成为系统性能的瓶颈,容易被卡脖子。

  • DR直接路由模式

DR模式和NAT模式的区别,Client还是访问LVS服务器,LVS服务器将流量带到内网web服务器中,但是数据的返回将不再经过LVS服务器,而是直接返回数据到Client。

direct routing 直连路由。

优点:

集群节点和director必须在一个物理网络内。

RIP可以使用公网地址或私有地址。

director仅处理入站请求,服务器压力比较小。

集群节点网关不指向director,故出站不经过director。

不支持端口映射。

大多数操作系统可以作为realserver,要支持隔离arp广播。

  • TUN-IP隧道模式
  • FULL-NAT
  • 模式对比

LVS-Nat实战案例

创建四台机器

节点名称 作用 网卡 IP
LVS-LVS LVS服务器 NAT网卡/仅主机网卡 192.168.218.140/192.168.63.101
client 模拟用户 仅主机网卡 192.168.63.100
LVS-web1 网页服务器① NAT网卡 192.168.138
LVS-web2 网页服务器② NAT网卡 192.168.139

LVS服务器必须要有两张网卡,一张网卡用来模拟外网(仅主机),一张网卡连接内网(NAT)。LVS服务器的作用就是以仅主机网卡,通信NAT网卡进入内网。所以clinet节点只需要有外网网卡即可(仅主机)。而web服务器只需要内网网卡(NAT)。

web节点配置

两个节点都进行配置

  1. systemctl stop firewalld #关闭防火墙
  2. systemctl disable firewalld #关闭防火墙自启
  3. setenforce 0 #关闭selinux
  4. sed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinux
  5. yum install vim net-tools httpd -y #安装Apache和一些工具
  6. systemctl start httpd #启动httpd
  7. systemctl enable httpd #设置httpd自启

两个web服务器路由配置

  1. route add -net 192.168.63.0/24 gw 192.168.218.140
  2. #外网网段 #LVS内网IP作为网关

route add: 添加路由

-net: 设置网络段

gw: 写网关,因为数据要从网关出来

因为我们的数据要从外网进,内网出,如果web服务器接收到了外网的流量请求,数据要从网关返回,我们的网关就是LVS。

也就是LVS把流量从外网口领到了LVS内网网卡,由内网网卡进入到内网服务器,然后服务器统一返回数据到LVS网关(LVS的内网口)。

LVS服务器节点配置

基础配置

  1. systemctl stop firewalld #关闭防火墙
  2. systemctl enable firewalld #关闭防火墙自启
  3. setenforce 0 #关闭selinux
  4. sed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinux
  5. yum install vim net-tools -y #安装一些工具

路由功能配置

  1. echo 1 > /proc/sys/net/ipv4/ip_forward #启动路由功能
  2. #必须启动转发功能

当Linux接收到一个不是自己的包的时候,设备默认是丢弃的,会认为这个包传递错误。而我们现在需要将数据包进行传递,所以这样是行不通的。

但是现在的LVS服务器比较特殊,按照上面的解释就是,Client节点访问LVS服务器,LVS要将数据传递给web服务器,web服务器需要再通过LVS服务器传递给Client节点。

当将ip_forwad内容修改为1的时候,这个LVS服务器就具有路由转发功能了。

安装并配置LVS

  1. yum install ipvsadm -y #安装LVS

暴露对外虚拟服务器(-A),使用TCP协议(-t),暴露的ip为LVS的外网网卡(192.168.63.101),使用策略(-s)为轮巡策略(rr)。

rr轮巡策略:就是无任何条件限制逐个分配服务器。

  1. ipvsadm -A -t 192.168.63.101:80 -s rr

对内暴露真实服务器(-a),使用TCP协议(-t),以对外IP路由连接到真实服务器(-r)中(192.168.218.138/139)。

  1. ipvsadm -a -t 192.168.63.101:80 -r 192.168.218.138:80 -m
  2. ipvsadm -a -t 192.168.63.101:80 -r 192.168.218.139:80 -m

Client访问LVS服务器公网IP,LVS服务器啥都干不了只能转发流量,然后转发到内网中。

此时使用curl 192.168.63.101 即可查看是否配置成功。

Keepalived高可用集群应用实践 - 图9

LVS-DR实战案例

四台机器都需要在同一个网段。

节点名称 作用 网卡 IP
client 模拟用户 NAT 192.168.218.128
web1 web节点1 NAT 192.168.218.138
web2 web节点2 NAT 192.168.218.139
LVS-LVS LVS服务器 NAT 192.168.218.141

LVS创建虚拟IP和路由

对外暴露的一个IP,真实服务器也用这个IP。

  1. ifconfig ens33:0 192.168.218.100 broadcast 192.168.218.255 netmask 255.255.255.0 up

使用ifconfig工具,给ens33网卡配置一个子接口,设置IP为192.168.218.100,设置广播地址为192.168.218.255,netmask子网掩码为255.255.255.0,设置为开启。

Keepalived高可用集群应用实践 - 图10

  1. route add -host 192.168.218.100 dev ens33:0

添加主机路由,只要有人访问该IP,只允许ens33:0子接口进行通讯。

  1. vim /etc/sysctl.conf #进入配置文件,设置路由转发
  2. net.ipv4.ip_forward = 1 #开启路由转发
  3. net.ipv4.conf.all.send_redirects = 0 #禁止转发重定向报文
  4. net.ipv4.conf.ens33.send_redirects = 0 #禁止ens33转发重定向报文
  5. net.ipv4.conf.default.send_redirects = 0 #禁止转发默认重定向报文

开启路由转发后,那怕访问的不是该机器,该机器也会帮你把数据传输到指定位置。

LVS设置负载均衡条目/规则

设置IPVSADM

  1. yum install -y ipvsadm #安装LVS
  2. ipvsadm -C #清除ipvsadm规则
  3. ipvsadm -A -t 192.168.218.100:80 -s rr #添加VIP规则
  4. ipvsadm -a -t 192.168.218.100:80 -r 192.168.218.138:80 -g
  5. #当有人访问100时,我将你的访问转移到真实服务器138中,并且是以DR模式
  6. ipvsadm -a -t 192.168.218.100:80 -r 192.168.218.139:80 -g
  7. ipvsadm-save > /etc/sysconfig/ipvsadm #将配置保存到该文件,即可重启后依然保存配置
  8. systemctl enable ipvsadm #设置自启

web集群配置

在两个web服务器做以下操作:

安装apache

  1. yum install -y httpd #安装Apache
  2. systemctl start httpd #启动apache
  3. systemctl disable httpd #设置Apache自启
  4. echo wuhu > /var/www/html/index.html #设置index界面

配置虚拟IP

  1. ifconfig lo:0 192.168.218.100/32

lo:loop back 虚拟网卡不做通信,我们要配置假接口下的子接口。

web服务器设置内核参数

  1. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  2. #忽略arp响应,不允许接收
  3. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

两条命令最简单的理解是:有人喊我我听不见,但是发包了我接收并送出去。

此时LVS-DR已经配置完成

curl 192.168.218.100

Keepalived高可用集群应用实践 - 图11

资源信息查看

  1. tail /var/log/httpd/access_log #查看Apache日志
  2. ipvsadm -Lnc #查看本机被访问过的信息
  3. ipvsadm -Ln #检查本机配置的规则信息

Keepalived高可用集群应用实践 - 图12

LVS理论知识

  1. ipvsadm -A -t 192.168.63.100 -s rr #这里给LVS服务器配置轮巡算法

1.RR 轮巡

交替进行循环,也就是逐个分配到服务器中。

2.WRR 加权轮巡

根据服务器处理不同的能力,设置不同的权重,来调度访问请求。这样可以保证处理能力强的服务器可以处理更多的访问流量。

3.LC 最少连接

调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

4.WLC 加权最少连接

在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

LVS工作模式模式对比


VS/NAT VS/TUN VS/DR
服务器操作系统 任意 支持隧道 多数(支持non-arp)
服务器网络 私有网络 局域网/广域网 局域网
服务器数目 10-20 100 大于100
服务器网关 负载均衡器 自己的路由 自己的路由
效率 一般 最高

LVS命令解释

命令 解释
-A 对外暴露虚拟服务器
-t 使用TCP协议
-a 对内暴露真实地址
-r 真实服务器
-m 地址伪装,指定LVS的工作模式为NAT模式
-w 真实服务器权值
-g 设置为DR模式
-E 修改虚拟服务器的算法
-D 删除虚拟服务器
-C 删除所有LVS配置
-Ln 检查当前配置的虚拟机和各个RS的权重
-Lnc 查看当前ipvs模块中记录的连接


Keepalived进阶版

高可用衡量标准,MTTF,平均无故障时间。

描述 通俗叫法 可用性级别 年度停机时间
基本可用性 2个9 99% 87.6小时
较高可用性 3个9 99.9% 8.8小时
具有故障自动修复的可用性 4个9 99.99% 53分钟
极高可用性 5个9 99.999% 5分钟

自动切换/故障转移

自动切换阶段某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。

通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。

通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等)从该不具备法定票数的集群节点转移到故障转移域(Failover Domain,可以接收故障资源转移的节点)。

自动侦测

自动侦测阶段由主机上的软件通过冗余侦测线,经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。

常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。

脑裂

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为两个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果或者共享资源被瓜分、两边”服务”都起不来了;或者两边”服务”都起来了,但同时读写”共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

常见解决方案:

添加冗余的心跳线(常用):例如双线条线,心跳也HA,尽量减少脑裂发生的几率。

磁盘锁:正在服务一方锁住共享 磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动”解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。一个人用的时候另一个人不能用,大家不能同时用,只能一个人用。

设置仲裁机制:例如设置参考IP(如网关IP或某一个服务器),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续〉应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

脑裂监控报警:邮件手机短信或者值班人员。例如zabbix。

其他高可用方案:heartbeat,pacemaker,piranha。

Keepalived工作原理

将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip) , master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master

Keepalived的三个模块

分别是core、check和vrrp。

core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析check负责健康检查,包括常见的各种检查方式。

vrrp模块是来实现VRRP协议的。

Keepalived实战案例

创建两个节点

节点 IP 配置
master 192.168.218.143 1h2g
backup 192.168.218.144 1h2g

两个节点做以下操作:

安装keepalived,修改配置文件

  1. systemctl stop firewalld #关闭防火墙
  2. systemctl disable firewalld #关闭防火墙自启
  3. setenforce 0 #关闭selinux
  4. sed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinux
  5. rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm #下载nginx rpm包
  6. yum install vim keepalived net-tools nginx -y #安装所需要的工具
  7. systemctl start nginx.service #启动nginx.service
  8. systemctl enable nginx.service #设置自启nginx.service

修改配置文件

在master节点:

  1. vim /etc/keepalived/keepalived.conf #进入配置文件
  2. #删除配置文件全部信息,将以下内容加入
  3. ! Configuration File for keepalived
  4. global_defs { #全局变量
  5. router_id a01 #设备在组中的标识,设置的不一样即可
  6. }
  7. #vrrp_script chk_nginx { #健康检查
  8. # srcipt "/etc/keepalived/ck_ng.sh" #检查脚本
  9. # interval 2 #检查频率
  10. # weight -5 #priority减少5
  11. # fall 3 #失败3次
  12. #}
  13. vrrp_instance VI_1 { #VI_1 实例两台路由器要相同
  14. state MASTER #设置主或者从状态
  15. interface ens33 #监控网卡
  16. mcast_src_ip 192.168.218.143 #心跳源IP
  17. virtual_router_id 10 #虚拟路由编号,主从要一致
  18. priority 100 #优先级
  19. advert_int 1 #心跳间隔
  20. authentication { #为防止不认识的集群加入设置秘钥认证。
  21. auth_type PASS
  22. auth_pass 123456
  23. }
  24. virtual_ipaddress { #虚拟IP
  25. 192.168.218.110
  26. }
  27. #track_script { #应用脚本
  28. # chk_nginx
  29. #}
  30. }

backup节点

  1. vim /etc/keepalived/keepalived.conf #进入配置文件
  2. #删除配置文件全部信息,将以下内容加入
  3. ! Configuration File for keepalived
  4. global_defs { #全局变量
  5. router_id a02 #设备在组中的标识,设置的不一样即可
  6. }
  7. #vrrp_script chk_nginx { #健康检查
  8. # script "/etc/keepalived/ck_ng.sh" #检查脚本
  9. # interval 2 #检查频率
  10. # weight -5 #priority减少5
  11. # fall 3 #失败3次
  12. #}
  13. vrrp_instance VI_1 { #VI_1 实例两台路由器要相同
  14. state MASTER #设置主或者从状态
  15. interface ens33 #监控网卡
  16. mcast_src_ip 192.168.218.144 #心跳源IP
  17. virtual_router_id 10 #虚拟路由编号,主从要一致
  18. priority 99 #优先级
  19. advert_int 1 #心跳间隔
  20. authentication { #为防止不认识的集群加入设置秘钥认证。
  21. auth_type PASS
  22. auth_pass 123456
  23. }
  24. virtual_ipaddress { #虚拟IP
  25. 192.168.218.110
  26. }
  27. #track_script { #应用脚本
  28. # chk_nginx
  29. #}
  30. }
  1. systemctl restart keepalived #分别重启keepalived
  2. #可以通过关闭网卡/关闭keepalived来进行查看。

Keepalived感知网页服务

虽然在上线我们把网线拔了,但是nginx/apache实际上还在运行。如果nginx出bug导致网页无法运行,此时keepalived还在发心跳包,我们的也就会访问出现bug的nginx。我们不能这样。

现在尴尬的情况,服务器跑的服务出问题,但是keepalived没问题。导致我们依然会访问出问题的网页。我们可以写监控脚本来感知服务

两个节点做如下操作:

  1. vim /etc/keepalived/ch_ng.sh #编写脚本
  2. #!/bin/bash
  3. #检查nginx进程是否存在
  4. counter=$(ps -C nginx --no-heading|wc -l)
  5. if [ "${counter}" = 0 ]; then
  6. #尝试启动一次nginx 停止5秒后再检测
  7. service nginx start
  8. sleep 5
  9. counter=$(ps -C nginx --no-heading|wc -l)
  10. if [ "${counter}" = 0 ]; then
  11. service keepalived stop
  12. fi
  13. fi
  14. chmod +x /etc/keepalived/ch_ng.sh #给脚本添加权限
  15. systemctl restart /etc/keepalived/ch_ng.sh #重启keepalived

将前面配置文件注释去掉,即可调用脚本文件。

Keepalived+LVS实战案例

上面的案例都是一个LVS加上多个集群,如果LVS出现故障呢?此时我们就需要给LVS配置高可用。

准备节点服务器

节点名称 作用 网卡 IP
web1 web节点1 NAT 192.168.218.143
web2 web节点2 NAT 192.168.218.144
LVS-master LVS服务器 NAT 192.168.218.145
LVS-backup LVS服务器 NAT 192.168.218.146

在两台LVS服务器上操作

  1. systemctl stop firewalld #关闭防火墙
  2. systemctl disable firewalld #关闭防火墙自启
  3. setenforce 0 #关闭selinux
  4. sed -i 's/SELINUX=enforcing/SELINUX=disalbed' #永久关闭selinux
  5. yum install -y keepalived ipvsadm #安装lvs和keepalived

填写配置文件

lvs-master

  1. !Configuration File for keepalived
  2. global_defs {
  3. router_id Director1
  4. }
  5. vrrp_instance VI_1 {
  6. state MASTER
  7. interface ens33
  8. virtual_router_id 51
  9. priority 150
  10. advert_int 1
  11. authentication {
  12. auth_type PASS
  13. auth_passwd 1111
  14. }
  15. virtual_ipaddress {
  16. 192.168.218.111/24 dev ens33
  17. }
  18. }
  19. virtual_server 192.168.218.111 80 { #LVS配置
  20. delay_loop 3 #服务轮巡时间间隔,每3秒检查一次real_server状态
  21. lb_algo rr #使用rr算法
  22. lb_kind DR #设置DR集群模式
  23. protocol TCP #TCP 检查
  24. real_server 192.168.218.143 80{
  25. weight 1
  26. TCP_CHECK {
  27. connect_timeout 3 #健康检查超时时间
  28. }
  29. }
  30. real_server 192.168.218.144 80
  31. weight 1
  32. TCP_CHECK {
  33. connect_timeout 3
  34. }
  35. }

重启keepalived

  1. systemctl start keepalived
  2. systemctl enable keepalived
  3. systemctl restart keepalived

配置两台web服务器

两台web服务器都做以下配置

  1. yum install -y httpd && systemctl enable httpd && systemctl start httpd #安装http并配置自启

配置虚拟地址

  1. cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0 #复制本地虚拟网卡配置文件
  2. vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #进入并修改配置文件
  3. DEVICE=lo:0 #网卡接口名称
  4. IPADDR=192.168.218.111 #虚拟IP
  5. NETMASK=255.255.255.255 #子网掩码
  6. ONBOOT=yes #自动启动
  7. #没有的删除,不一样的修改
  8. systemctl restart network

配置服务器路由

  1. vim /etc/rc.local #进入自启动配置文件,让他每次开机都能自动设置路由
  2. /sbin/route add -host 192.168.218.111 dev lo:0
  3. vim /etc/sysctl.conf #进入配置文件,设置路由转发
  4. net.ipv4.conf.all.arp_announce = 2
  5. net.ipv4.conf.default.arp_ignore = 1
  6. net.ipv4.conf.default.arp_announce = 2
  7. net.ipv4.conf.lo.arp_ignore = 1 #忽略arp请求
  8. net.ipv4.conf.lo.arp_announce = 2 #可以回复请求

此时重启全部机器,检查错误,开启服务。

通过浏览器访问网页,会发现实现了负载均衡。尝试停止一个LVS服务器,依然可以访问网页。

Keepalived高可用集群应用实践 - 图13