先来解释一个三个概念:
-
集群的种类:
负载均衡(Load Balance)集群,简称LB:
硬件的实现: – F5 负载均衡器
软件的实现: – LVS(4层,传输层) – Nginx(7层,应用层)高可用(High Availability)集群,简称 HA 集群
高性能计算(High Perfermance Computing)集群,简称 HPC 集群 -
LVS集群–LVS(Linux Virtual Server)
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一,是根据iptables的实现来开发的,所以使用时候会和iptables相当类似
官网:http://www.linuxvirtualserver.org/
中文站点: http://zh.linuxvirtualserver.org/LVS提供了三种包转发方式:NAT(网络地址映射)、IP Tunneling(IP隧道)、Direct Routing(直接路由)。不同的转发模式决定了不同的cluster的网络结构
LVS 集群工作结构图:
-
Keepalived概述:
keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件,也就是我们平时说的第 3 层、第 4 层和第 5层交换。 Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自动将web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web 服务器。具体可参考链接:OSI七层模型与TCP/IP五层模型
拓展一下Keepalived工作原理:
Layer3,4&5 工作在 IP/TCP 协议栈的 IP 层, TCP 层,及应用层,。
Layer3: Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向服务器群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序) , 如果发现某台服务的 IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。 Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。
Layer4: 主要以 TCP 端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。
Layer5: Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除。
Keepalived的作用与构建:
-
管理 VIP,VIP 会在 LVS 之间漂移
-
监控 LVS分发器:
运行在主分发的 Keepalived 会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认为主 LVS 挂了,开始接手主分发器工作,把 VIP 配给自己。
-
管理 RS
Keepalived 会每隔一个时间段去做一次类似于访问的操作如:
探针: elinks http://192.168.3.64 –dump
经典高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选)
http://www.keepalived.org/下载:http://www.keepalived.org/download.html
-
Nginx在应用层做负载均衡转发请求
网络拓扑图:
环境准备以及规划:
- Client IP: 192.168.88.133
- VIP:192.168.88.140
- Nginx负载均衡IP1,Keepalived MASTER节点:192.168.88.130
- Nginx负载均衡IP2,Keepalived BACKUP节点:192.168.88.131
- Web站点1:192.168.88.129
- Web站点1:192.168.88.130
安装Nginx,实现负载均衡,反向代理
-
安装Nginx部署可参考:
https://blog.csdn.net/qq_24333367/article/details/107757760 -
Nginx反向代理配置部分如下:
在配置文件nginx.conf的最后一行}前,添加以下内容:
upstream ecstest {
server 192.168.88.129:80;
server 192.168.88.130:80;
}
在server段里面的location加上proxy_pass http://ip:端口;:
proxy_pass http://ecstest;[root@cs02 conf]# grep -v "#" nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; client_max_body_size 0m; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; proxy_pass http://ecstest; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } upstream ecstest { server 192.168.88.129:80; server 192.168.88.130:80; } } [root@cs02 conf]#
-
访问Nginx 负载均衡IP,查看是否进行轮询转发:
[root@client ~]# curl http://192.168.88.131 Test Server:192.168.88.129 Static Server [root@client ~]# curl http://192.168.88.131 Test Server:192.168.88.130 Static Server [root@client ~]# curl http://192.168.88.131 Test Server:192.168.88.129 Static Server [root@client ~]# curl http://192.168.88.131 Test Server:192.168.88.130 Static Server [root@client ~]#
安装Keepalived:
1. 使用yum 进行安装
yum install keepalived -y
2. 配置keepalived.conf,设置MASTER/BACKUP(主备)
MASTER配置:
[root@cs02 conf]# cat /etc/keepalived/keepalived.conf
vrrp_script check_nginx_pid {
script "/etc/keepalived/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔,单位是秒)
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens34 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
check_nginx_pid #(调用检测脚本)
}
virtual_ipaddress {
192.168.88.140 # 定义虚拟ip(VIP),可多设,每行一个
}
}
[root@cs02 conf]#
BACKUP配置
[root@cs03 keepalived]# cat keepalived.conf
vrrp_script check_nginx_pid {
script "/etc/keepalived/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔,单位是秒)
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens34 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 90 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
check_nginx_pid #(调用检测脚本)
}
virtual_ipaddress {
192.168.88.140 # 定义虚拟ip(VIP),可多设,每行一个
}
}
-
编写Nginx检查脚本,给脚本赋执行权限:
[root@cs02 keepalived]# cat check_nginx_pid.sh #!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then echo "nginx down ######## no nginx" >> /var/log/messages /usr/local/nginx/sbin/nginx pkill keepalived fi [root@cs02 keepalived]# chmod +x check_nginx_pid.sh [root@cs02 keepalived]# ll 总用量 20 -rwxr-xr-x. 1 root root 194 8月 4 19:22 check_nginx_pid.sh -rw-r--r--. 1 root root 1111 8月 4 17:30 keepalived.conf -rw-r--r--. 1 root root 951 8月 4 12:19 keepalived.conf.0804 -rw-r--r--. 1 root root 1159 8月 4 17:00 keepalived.conf.1604 -rw-r--r--. 1 root root 3598 8月 4 10:24 keepalived.conf.bak [root@cs02 keepalived]#
4.启动Nginx,Keepalived 测试VIP是否正常提供服务:
启动Keepalived ,查看是否启动成功:
查看VIP是否绑定在ens34网卡上:
查询Linux系统日志发现Keepalived MASTER已工作:
[root@cs02 keepalived]# tail -f /var/log/messages
用curl 发起请求,看VIP是否已经正常工作:[root@client ~]# curl http://192.168.88.140 Test Server:192.168.88.129 Static Server [root@client ~]# curl http://192.168.88.140 Test Server:192.168.88.130 Static Server [root@client ~]# curl http://192.168.88.140 Test Server:192.168.88.129 Static Server [root@client ~]# curl http://192.168.88.140 Test Server:192.168.88.130 Static Server [root@client ~]#
5.停掉MASTER节点的Nginx,测试VIP是否漂移:
[root@cs02 keepalived]# /usr/local/nginx/sbin/nginx -s stop [root@cs02 keepalived]#
MASTER节点的系统日志/var/log/messages:
BACKUP节点的系统日志/var/log/messages:
测试VIP漂移时访问是否有影响6.恢复MASTER节点的Nginx,测试VIP是否回到MASTER :
[root@cs02 keepalived]# ./check_nginx_pid.sh [root@cs02 keepalived]# systemctl restart keepalived [root@cs02 keepalived]#
BACKUP节点的系统日志/var/log/messages:
MASTER节点的系统日志/var/log/messages:
VIP漂移时访问情况:
查看VIP是否在BACKUP节点上:
踩坑总结:
- 重启keepalived 不生效,报错Can’t open PID file /var/run/keepalived.pid (yet?) after start: No such file or directory
- VIP访问不漂移:
解决办法,kill掉keepalived存在的服务,重启keepalived服务:
[root@cs02 keepalived]# ps -ef|grep keepalived
root 14910 14259 0 17:05 pts/2 00:00:00 grep --color=auto keepalived
[root@cs02 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: inactive (dead)
8月 04 17:01:48 cs02 systemd[1]: Starting LVS and VRRP High Availability Monitor...
8月 04 17:01:48 cs02 systemd[1]: Can't open PID file /var/run/keepalived.pid (yet?) after start: No such file or directory
8月 04 17:01:48 cs02 systemd[1]: Started LVS and VRRP High Availability Monitor.
8月 04 17:05:38 cs02 Keepalived[3007]: Stopping
8月 04 17:05:38 cs02 Keepalived_healthcheckers[3008]: Removing service [192.168.88.132]:80 from VS [192.168.88.140]:80
8月 04 17:05:38 cs02 Keepalived_healthcheckers[3008]: Stopped
8月 04 17:05:38 cs02 Keepalived_vrrp[3009]: VRRP_Instance(cs1) sent 0 priority
8月 04 17:05:38 cs02 Keepalived_vrrp[3009]: VRRP_Instance(cs1) removing protocol VIPs.
8月 04 17:05:39 cs02 Keepalived_vrrp[3009]: Stopped
8月 04 17:05:39 cs02 Keepalived[3007]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
[root@cs02 keepalived]# pkill keepalived
[root@cs02 keepalived]# ps -ef|grep keepalived
root 14910 14259 0 17:05 pts/2 00:00:00 grep --color=auto keepalived