Linux云计算架构-keepalived心跳检测机制(主备LVS、主主LVS)

喜欢ヅ旅行 2023-03-02 04:56 67阅读 0赞

文章目录

  • Linux云计算架构-keepalived心跳检测机制(主备LVS、主主LVS)
      1. keepalived介绍
      1. keepalived部署
      • 2.1 集群环境介绍
      • 2.2 主备keepalived配置
        • 2.2.1 主备环境介绍
        • 2.2.2 配置主LVS
        • 2.2.3 配置备LVS
        • 2.2.4 测试VIP主备切换
      • 2.3 主主keepalived配置
        • 2.3.1 主主环境介绍
        • 2.3.2 两次主从配置
        • 2.3.3 测试VIP主主切换
      1. keepalived总结

Linux云计算架构-keepalived心跳检测机制(主备LVS、主主LVS)

1. keepalived介绍

keepalived是一款拥有3层检测机制的软件。可以检测web服务器的状态。若keepalived检测到web服务器不可用,则从集群中剔除该服务器,等待人工修复好该服务器后,keepalived又自动的将该服务器加入集群。


























层级 工作位置 作用
layer3 IP网络层 keepalived定期向服务器群中的服务器发送一个ICMP包,即ping包,若发现不通,则认为这台服务器失效,从服务器群中剔除该服务器。
layer4 TCP传输层 keepalived检测服务器的某一个端口是否启动来判断服务器是否正常。如web服务就检测80端口号是否启动,若没启动,则剔除该服务器。
layer5 应用层 用户自定义服务器程序运行检测规则,keepalived根据用户自定义的规则去检查服务器程序的运行是否正常,若不正常,则剔除该服务器。

keepalived的作用:
1.管理VIP:即存在主备分发器,当主分发器挂掉时,VIP自动转移到备分发器上,这时备分发器作为新的主分发器。当主分发器修复后,由于主分发器比备分发器的优先级高,故VIP又会从备分发器转移到原先的主分发器上。

2.监控LVS分发器:为了管理VIP,就要监控LVS分发器是否挂了。主分发器上的keepalived会以组播的形式向备分发器上宣告自己还活着,若备分发器在指定时间内未收到主分发器发来的消息,就会认为主分发器挂了,并开始将VIP转移到备分发器上。

3.管理RS:keepalived会定期访问(elinks)后端真实服务器,看是否正常。如果不正常,则剔除该服务器。即某一个节点挂了。

经典高可用 web 架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs 可选)

keepalived官网https://www.keepalived.org/
在这里插入图片描述

目前最新版是2020年7月13日发布的2.1.5版本。
在这里插入图片描述

2. keepalived部署

2.1 集群环境介绍

网络拓扑图:在这里插入图片描述

生产中,所有的IP地址都应为同一物理网段的IP地址。
主备LVS分发器实现分发器的高可用。也可以配置成主主LVS实现互为主备LVS。

2.2 主备keepalived配置

2.2.1 主备环境介绍




































主机名 IP/子网掩码 网关 作用
mlvs DIP:192.168.10.10/24
VIP:192.168.10.30/32
192.168.10.1 主LVS
slvs DIP:192.168.10.20/24
VIP:192.168.10.30/32
192.168.10.1 备LVS
rs1 192.168.10.40/24 192.168.10.1 rs1后端真实服务器
rs2 1921.68.10.50/24 192.168.10.1 rs2后端真实服务器
  1. # 主备lvs上都要安装ipvsadm和keepalived
  2. # 使用命令ipvsadm -L -n 可以看到,两个分发器都是做负载均衡的,毕竟都没有配后端真实服务器。
  3. # 这不是本文的重点,本文是要测试keepalived的心跳检测机制。
  4. [root@mlvs ~]# yum install ipvsadm keepalived -y
  5. [root@slvs ~]# yum install ipvsadm keepalived -y
  6. [root@mlvs ~]# ipvsadm -L -n
  7. IP Virtual Server version 1.2.1 (size=4096)
  8. Prot LocalAddress:Port Scheduler Flags
  9. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  10. [root@slvs ~]# ipvsadm -L -n
  11. IP Virtual Server version 1.2.1 (size=4096)
  12. Prot LocalAddress:Port Scheduler Flags
  13. -> RemoteAddress:Port Forward Weight ActiveConn InActConn

2.2.2 配置主LVS

修改主keepalived的配置文件:

  1. # 可以使用以下命令查看yum安装的软件包的位置
  2. [root@mlvs ~]# rpm -ql keepalived
  3. /etc/keepalived/keepalived.conf
  4. # 在复制进配置文件的时候,要把注释信息去掉。
  5. [root@mlvs ~]# vim /etc/keepalived/keepalived.conf
  6. ! Configuration File for keepalived
  7. global_defs { # 全局配置
  8. notification_email {
  9. root@localhost # 当VIP发生切换时,发送邮件给以下邮箱,一行一个。
  10. }
  11. notification_email_from root@localhost # 发件人
  12. smtp_server localhost # smtp发件服务器地址
  13. smtp_connect_timeout 30 # smtp连接超时时间
  14. router_id mlvs # 标识当前节点的名字,与备lvs不同。
  15. }
  16. vrrp_instance M1 { #定义一个实例
  17. state MASTER # 主LVS,备LVS应设置为BACKUP
  18. interface ens32 # 指定检测网络的接口
  19. virtual_router_id 51 # vrrp组名,备lvs要与主lvs在同一组。
  20. priority 100 # 优先级(1-254)
  21. advert_int 1 # 组播发送消息时间间隔
  22. authentication { # 设置验证信息,两个LVS必须一致
  23. auth_type PASS
  24. auth_pass 1111
  25. }
  26. virtual_ipaddress {
  27. 192.168.10.30 # 指定VIP,两个LVS必须一致
  28. }
  29. }
  30. virtual_server 192.168.10.30 80 { # 添加虚拟服务器VIP
  31. delay_loop 6 # keepalived检测RS的时间间隔
  32. lb_algo rr # 分发算法,rr指轮询
  33. lb_kind DR # lvs模式,这里用DR
  34. nat_mask 255.255.255.0
  35. persistence_timeout 50 # 长连接保持时间,50s内同一IP的请求会发送给同一RS
  36. protocol TCP
  37. real_server 192.168.10.40 80 { # RS设置
  38. weight 1 # 真实服务器节点的权重,数值越大权重越高
  39. TCP_CHECK { # 检查TCP的80端口号,即layer4
  40. connect_timeout 3 # 3s RS无响应则超时
  41. nb_get_retry 3 # 超时重试次数
  42. delay_before_retry 3 # 3s重试一次,即重试间隔
  43. connect_port 80 # 检测端口
  44. }
  45. }
  46. real_server 192.168.10.50 80 {
  47. weight 1
  48. TCP_CHECK {
  49. connect_timeout 3
  50. nb_get_retry 3
  51. delay_before_retry 3
  52. connect_port 80
  53. }
  54. }
  55. }
  56. # 启动主lvs上的keepalived,并设置开机自启。
  57. [root@mlvs ~]# systemctl start keepalived
  58. [root@mlvs ~]# systemctl enable keepalived

一个virtual_server实例就是一个LVS集群,如果要在一台主机上配置多个LVS集群,那么就需要配置多个实例。

  1. # 清空iptables防火墙规则
  2. [root@mlvs ~]# iptables -F
  3. # 使用ipvsadm查看负载均衡的情况
  4. [root@mlvs ~]# ipvsadm -L -n
  5. IP Virtual Server version 1.2.1 (size=4096)
  6. Prot LocalAddress:Port Scheduler Flags
  7. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  8. TCP 192.168.10.30:80 rr persistent 50
  9. # 使用ip a命令查看ens32绑定的所有IP地址
  10. [root@mlvs ~]# ip a | grep ens32
  11. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  12. inet 192.168.8.118/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32
  13. inet 192.168.10.30/32 scope global ens32

2.2.3 配置备LVS

  1. # 发送主lvs的keepalived配置文件给备lvs主机。
  2. [root@mlvs ~]# scp /etc/keepalived/keepalived.conf root@192.168.8.120:/etc/keepalived/
  3. [root@slvs keepalived]# vim keepalived.conf
  4. ! Configuration File for keepalived
  5. global_defs {
  6. notification_email {
  7. root@localhost
  8. }
  9. notification_email_from root@localhost
  10. smtp_server localhost
  11. smtp_connect_timeout 30
  12. router_id slvs # 从lvs标识
  13. }
  14. vrrp_instance M1 {
  15. state BACKUP # 设置该实例为从LVS
  16. interface ens32
  17. virtual_router_id 51
  18. priority 90 # 优先级调低,主为100,从为90
  19. advert_int 1
  20. authentication {
  21. auth_type PASS
  22. auth_pass 1111
  23. }
  24. virtual_ipaddress {
  25. 192.168.10.30
  26. }
  27. }
  28. virtual_server 192.168.10.30 80 {
  29. delay_loop 6
  30. lb_algo rr
  31. lb_kind DR
  32. nat_mask 255.255.255.0
  33. persistence_timeout 50
  34. protocol TCP
  35. real_server 192.168.10.40 80 {
  36. weight 1
  37. TCP_CHECK {
  38. connect_timeout 3
  39. nb_get_retry 3
  40. delay_before_retry 3
  41. connect_port 80
  42. }
  43. }
  44. real_server 192.168.10.50 80 {
  45. weight 1
  46. TCP_CHECK {
  47. connect_timeout 3
  48. nb_get_retry 3
  49. delay_before_retry 3
  50. connect_port 80
  51. }
  52. }
  53. }
  54. # 启动从lvs上的keepalived,并设置开机自启。
  55. [root@slvs ~]# systemctl start keepalived.service
  56. [root@slvs ~]# systemctl enable keepalived.service
  57. # 清空iptables防火墙规则
  58. [root@slvs ~]# iptables -F
  59. # 验证下VIP绑定情况,可以看到VIP是没有绑定到从LVS上的。
  60. [root@slvs ~]# ipvsadm -L -n
  61. IP Virtual Server version 1.2.1 (size=4096)
  62. Prot LocalAddress:Port Scheduler Flags
  63. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  64. TCP 192.168.10.30:80 rr persistent 50
  65. [root@slvs ~]# ip a | grep ens32
  66. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  67. inet 192.168.8.120/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32

2.2.4 测试VIP主备切换

停止主LVS的keepalived服务,可以看到VIP从主LVS漂移到从LVS上了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重启主LVS上的keepalived服务,可以看到VIP从从LVS漂移回到主LVS上。
可以通过从LVS的日志看到,在主LVS恢复后,从LVS的动作为先检查优先级,再切换到BACKUP模式,最后移除VIP。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.3 主主keepalived配置

2.3.1 主主环境介绍




































主机名 IP/子网掩码 网关 作用
mlvs1 DIP:192.168.10.10/24
VIP1:192.168.10.30/32
192.168.10.1 主LVS,也是备LVS
mlvs2 DIP:192.168.10.20/24
VIP2:192.168.10.60/32
192.168.10.1 主LVS,也是备LVS
rs1 192.168.10.40/24 192.168.10.1 rs1后端真实服务器
rs2 1921.68.10.50/24 192.168.10.1 rs2后端真实服务器

2.3.2 两次主从配置

由于上面已经配置了一次主从,接下来再配置一次主从即可。

  1. # 配置为M1实例的主,M2实例的从。一个实例可以看作是一个集群。
  2. [root@mlvs2 ~]# vim /etc/keepalived/keepalived.conf
  3. ! Configuration File for keepalived
  4. global_defs {
  5. notification_email {
  6. root@localhost
  7. }
  8. notification_email_from root@localhost
  9. smtp_server localhost
  10. smtp_connect_timeout 30
  11. router_id mlvs
  12. }
  13. vrrp_instance M1 {
  14. state MASTER
  15. interface ens32
  16. virtual_router_id 51
  17. priority 100
  18. advert_int 1
  19. authentication {
  20. auth_type PASS
  21. auth_pass 1111
  22. }
  23. virtual_ipaddress {
  24. 192.168.10.30
  25. }
  26. }
  27. vrrp_instance M2 {
  28. state BACKUP
  29. interface ens32
  30. virtual_router_id 52
  31. priority 90
  32. advert_int 1
  33. authentication {
  34. auth_type PASS
  35. auth_pass 1111
  36. }
  37. virtual_ipaddress {
  38. 192.168.10.60
  39. }
  40. }
  41. virtual_server 192.168.10.30 80 {
  42. delay_loop 6
  43. lb_algo rr
  44. lb_kind DR
  45. nat_mask 255.255.255.0
  46. persistence_timeout 50
  47. protocol TCP
  48. real_server 192.168.10.40 80 {
  49. weight 1
  50. TCP_CHECK {
  51. connect_timeout 3
  52. nb_get_retry 3
  53. delay_before_retry 3
  54. connect_port 80
  55. }
  56. }
  57. real_server 192.168.10.50 80 {
  58. weight 1
  59. TCP_CHECK {
  60. connect_timeout 3
  61. nb_get_retry 3
  62. delay_before_retry 3
  63. connect_port 80
  64. }
  65. }
  66. }
  67. virtual_server 192.168.10.60 80 {
  68. delay_loop 6
  69. lb_algo rr
  70. lb_kind DR
  71. nat_mask 255.255.255.0
  72. persistence_timeout 50
  73. protocol TCP
  74. real_server 192.168.10.40 80 {
  75. weight 1
  76. TCP_CHECK {
  77. connect_timeout 3
  78. nb_get_retry 3
  79. delay_before_retry 3
  80. connect_port 80
  81. }
  82. }
  83. real_server 192.168.10.50 80 {
  84. weight 1
  85. TCP_CHECK {
  86. connect_timeout 3
  87. nb_get_retry 3
  88. delay_before_retry 3
  89. connect_port 80
  90. }
  91. }
  92. }
  93. # 检测主1上的VIP情况,可以看到只绑定了一个VIP。因为主1只是实例M1的主LVS。
  94. [root@mlvs1 ~]# systemctl restart keepalived.service
  95. [root@mlvs1 ~]# iptables -F
  96. [root@mlvs1 ~]# ip a |grep ens32
  97. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  98. inet 192.168.8.118/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32
  99. inet 192.168.10.30/32 scope global ens32
  100. [root@mlvs1 ~]# ipvsadm -L -n
  101. IP Virtual Server version 1.2.1 (size=4096)
  102. Prot LocalAddress:Port Scheduler Flags
  103. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  104. TCP 192.168.10.30:80 rr persistent 50
  105. TCP 192.168.10.60:80 rr persistent 50
  106. # 配置为M2实例的主,M1实例的从。
  107. [root@mlvs2 ~]# cat /etc/keepalived/keepalived.conf
  108. ! Configuration File for keepalived
  109. global_defs {
  110. notification_email {
  111. root@localhost
  112. }
  113. notification_email_from root@localhost
  114. smtp_server localhost
  115. smtp_connect_timeout 30
  116. router_id slvs
  117. }
  118. vrrp_instance M1 {
  119. state BACKUP
  120. interface ens32
  121. virtual_router_id 51
  122. priority 90
  123. advert_int 1
  124. authentication {
  125. auth_type PASS
  126. auth_pass 1111
  127. }
  128. virtual_ipaddress {
  129. 192.168.10.30
  130. }
  131. }
  132. vrrp_instance M2 {
  133. state MASTER
  134. interface ens32
  135. virtual_router_id 52
  136. priority 100
  137. advert_int 1
  138. authentication {
  139. auth_type PASS
  140. auth_pass 1111
  141. }
  142. virtual_ipaddress {
  143. 192.168.10.60
  144. }
  145. }
  146. virtual_server 192.168.10.30 80 {
  147. delay_loop 6
  148. lb_algo rr
  149. lb_kind DR
  150. nat_mask 255.255.255.0
  151. persistence_timeout 50
  152. protocol TCP
  153. real_server 192.168.10.40 80 {
  154. weight 1
  155. TCP_CHECK {
  156. connect_timeout 3
  157. nb_get_retry 3
  158. delay_before_retry 3
  159. connect_port 80
  160. }
  161. }
  162. real_server 192.168.10.50 80 {
  163. weight 1
  164. TCP_CHECK {
  165. connect_timeout 3
  166. nb_get_retry 3
  167. delay_before_retry 3
  168. connect_port 80
  169. }
  170. }
  171. }
  172. virtual_server 192.168.10.60 80 {
  173. delay_loop 6
  174. lb_algo rr
  175. lb_kind DR
  176. nat_mask 255.255.255.0
  177. persistence_timeout 50
  178. protocol TCP
  179. real_server 192.168.10.40 80 {
  180. weight 1
  181. TCP_CHECK {
  182. connect_timeout 3
  183. nb_get_retry 3
  184. delay_before_retry 3
  185. connect_port 80
  186. }
  187. }
  188. real_server 192.168.10.50 80 {
  189. weight 1
  190. TCP_CHECK {
  191. connect_timeout 3
  192. nb_get_retry 3
  193. delay_before_retry 3
  194. connect_port 80
  195. }
  196. }
  197. }
  198. # 检测主2上的VIP情况,可以看到只绑定了一个VIP。因为主2只是实例M2的主LVS。
  199. [root@mlvs2 ~]# systemctl restart keepalived.service
  200. [root@mlvs2 ~]# iptables -F
  201. [root@mlvs2 ~]# ip a | grep ens32
  202. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  203. inet 192.168.8.120/24 brd 192.168.8.255 scope global noprefixroute dynamic ens32
  204. inet 192.168.10.60/32 scope global ens32
  205. [root@mlvs2 ~]# ipvsadm -L -n
  206. IP Virtual Server version 1.2.1 (size=4096)
  207. Prot LocalAddress:Port Scheduler Flags
  208. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  209. TCP 192.168.10.30:80 rr persistent 50
  210. TCP 192.168.10.60:80 rr persistent 50

2.3.3 测试VIP主主切换

可以看到,配置完成后,一台LVS主机是绑定一个VIP的。mlvs1绑定的是192.168.10.30mlvs2绑定的是192.168.10.60
停止mlvs1上的keepalived服务,可以看到VIP漂移了。
在这里插入图片描述
在这里插入图片描述
启动mlvs1上的keepalived服务,可以看到VIP漂移回来了。
在这里插入图片描述
在这里插入图片描述
停止mlvs2上的keepalived服务,可以看到VIP漂移了。
在这里插入图片描述
在这里插入图片描述
启动mlvs2上的keepalived服务,可以看到VIP漂移回来了。
在这里插入图片描述
在这里插入图片描述

3. keepalived总结

①从keepalived的工作原理可以知道,它是在IP网络层、TCP传输层以及应用层这三个层次进行服务器检测的。若服务器不可用则从集群中剔除,若修复服务器后,则将该服务器加入集群。

②keepalived主要有3个作用:管理VIP、监控LVS分发器、管理RS。

③在本文集群中,主LVS和备LVS属于同一个vrrp分组,主LVS定期以组播的方式向备LVS宣告自身还活着,这时备LVS就不会喧宾夺主。但是当备LVS在一个周期内未收到主LVS的宣告,备LVS就会自动提升自己为主LVS,VIP也会自动从主LVS漂移到备LVS。

④keepalived常与web服务器、mysql服务器构建集群。本文就是keepalived+lvs+DR+http架构,如后端real_server监控的是3306端口,则该架构就转换为keepalived+lvs+DR+mysql。

⑤每一个vrrp_instance都是一个集群,配置主LVS和备LVS都是属于配置同一个集群,故vrrp_instance实例名要相同。主LVS为了能以组播的方式宣告自己还活着,virtual_route_id VRRP组ID必须相同。每一个keepalived又是属于自身的,故拥有不一样的route_id。区分主备可以通过state定义,当主LVS故障后,VIP根据state和集群中节点的优先级priority进行VIP漂移。一般会漂移到state为BACKUP、priority在备LVS中最高的节点上。通过以上配置,可以扩展为一主多备,多主多备。

⑥2台服务器可以实现主备、主主。主备属于同一集群,而主主可以看作是两个主备。3台服务器可以一主二备,三主。一主二备属于同一集群,而三主可以看作是三个一主二备。这样,当主LVS挂了,会有备LVS接收VIP,当备LVS挂了,会有另一台备LVS接收。实现生产环境不中断服务的高可用架构。

发表评论

表情:
评论列表 (有 0 条评论,67人围观)

还没有评论,来说两句吧...

相关阅读