lvs + keepalived + gninx 高性能负载均衡
1,nginx 作为负载均衡器,在应用层实现了负载均衡和反向代理,在分布式集群中,能够有效的去处理大数据量,高访问的应用。但是,如果nginx 服务挂了怎么办?
为此,可以实现两台nginx或者多台nginx服务器,也就是双机主从热备,或者多机多主多从。当主nginx(master)挂了之后,备机器(backup)顶上。
主nginx 和备nginx 由谁来控制?lvs
主nginx 和备nginx 都挂了怎么办?keepalived
2,lvs + keepalived + gninx
lvs 简介:
LVS是一个开源的软件,可以实现传输层四层负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
LVS 在linux 2.6 之后,已经嵌入到Linux 内核之中,所以不需要单独安装
虚拟ip
keepalived:
keepalived是一个类似于Layer2,4,7交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。
keepalived的工作原理:
keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障
VRRP原理:https://www.cnblogs.com/pickKnow/p/11236532.html
3,搭建

实现效果,本地开启服务192.168.178.1:8080 ,192.168.178.1:8081 ,由主的nignx 服务器分发,192.168.178.1:8082,192.168.178.1:8083 由备用的nignx 服务器分发
nginx 集群:192.168.178.115(MASTER),192.168.178.110(BACKUP),由lvs+ keepalived 分发,nginx 的主次是由keepalived 服务决定的
Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,
用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。
于是就会调 用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。
默认情况下,是由主的nginx 分发至web 集群(8080.8081),当主nginx服务宕机之后,自动切换到备机。
step 1: 本地开启了四个服务192.168.178.1:8080 ,192.168.178.1:8081,192.168.178.1:8082,192.168.178.1:8083
step2: linux 两台机器分别是192.168.178.115 (master) 192.168.178.110 (backup),虚拟vip 192.168.178.116
step3: 在115 和 110 机器上分别安装 nginx 和 keepalived
安装keepalived 如下:
1.下载keepalived
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
2.解压安装:
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
3.下载插件openssl
yum install -y openssl openssl-devel(需要安装一个软件包)
4.开始编译keepalived
cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
5.make一下
make && make install 报错: eepalived执行./configure --prefix=/usr/local/keepalived时报错:configure: error: Popt libraries is required
出现此错误的原因:
未安装popt的开发包
解决方法:
yum install popt-devel
安装好popt的开发包。重新./configure 即可。 keepalived安装成Linux系统服务 将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:
首先创建文件夹,将keepalived配置文件进行复制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后复制keepalived脚本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived/sbin/
可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!
keepalived 常用命令
service keepalived start
service keepalived stop 启动报错Starting keepalived (via systemctl): Job for keepalived.service failed. See 'systemctl status keepalived.service' and 'journalctl -xn' for details.
解决办法
[root@edu-proxy-01 sbin]# cd /usr/sbin/
[root@edu-proxy-01 sbin]# rm -f keepalived
[root@edu-proxy-01 sbin]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
step4:115,110 机器上分别配置keepalived
115:
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 心跳检测的脚本,去执行这个sh 文件
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 20
weight -20
} vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 121
mcast_src_ip 192.168.178.115
priority 100
nopreempt
advert_int 1 authentication {
auth_type PASS
auth_pass 1111
}
# 心跳检测的脚本
track_script {
chk_nginx
} virtual_ipaddress {
192.168.178.116
} }
脚本sh 文件如下:
#!/bin/bash
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then /usr/local/nginx/sbin/nginx; sleep 5; if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived; fi; fi
意思就是查看有没有nginx线程,如果nginx 挂了,重启nginx 服务,睡眠5秒,如果重启失败,则关闭这个主的keepalived 服务。
当主的keepalived 服务挂了之后,根据vrrp 协议,虚拟vip 会切换到backup 机器(也就是192.168.178.110),这就是心跳检测,加上故障转移。但是我这边没有成功,脚本没有执行。问题还没找到。
110:操作也是一样,就是个别地方需要改一下:
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2 #检测时间间隔
weight -20 #如果条件成立的话,则权重 -20
}
vrrp_instance VI_2 {
state BACKUP #来决定主从
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.178.110 #填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
track_script {
chk_nginx
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.178.116 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
脚本sh 文件如下:
#!/bin/bash
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then /usr/local/nginx/sbin/nginx; sleep 5; if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived; fi; fi
step5: 两台机器上分别设置nginx 负载均衡,反向代理
upstream aiyuesheng {
server 192.168.178.1:8080;
server 192.168.178.1:8081;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://aiyuesheng;
index index.html index.htm;
}
###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
###nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
upstream aiyuesheng {
server 192.168.178.1:8082;
server 192.168.178.1:8083;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://aiyuesheng;
index index.html index.htm;
}
###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
###nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
step6:效果:115,110,分别启动nignx ,keepalived ,通过 ip a 命令可以看到115 机器上多了个ip 192.168.178.116
浏览器输入192.168.178.116(虚拟vip),转发到了nginx 集群上的192.168.178.115 机器上,nginx 服务又通过反向代理和负载均衡分发到192.168.178.1:8080,192.168.178.1:8081
当把192.168.178.115 的nginx 服务stop ,192.168.178.116(虚拟vip)因该到192.168.178.110 机器上,nginx 服务又通过反向代理和负载均衡分发到192.168.178.1:8082,192.168.178.1:8083
最后一步没有成功,原因还不清楚。
注意:写shell 脚本要在linux 上写,因为windows 上格式和linux 不一样,windows 换行\r\n linux 编译不出来
web 集群,也可以做备用服务,比如一直访问 192.168.178.1:8080,当192.168.178.1:8080 挂了之后才访问192.168.178.1:8081
upstream testproxy {
server 192.168.178.1:8080;
server 192.168.178.1:8081 backup;
}
所以,综上,当生产的项目出现宕机,对应的策略是:
1,故障转移.....从master 转到 backup
2, 心跳检测,keepalived每隔多长时间会执行脚本,查看nginx 服务是否还在
3,自动重启,检查服务不在了,会执行/usr/local/nginx/sbin/nginx 的命令开启nginx
lvs + keepalived + gninx 高性能负载均衡的更多相关文章
- lvs+keepalived+nginx高性能负载均衡集群
项目发布时候,别人还能访问呢? 双机主从热备 LVS作用 LVS是一个开源的软件,可以实现传输层四层负载均衡.LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器.目前有 ...
- 配置LVS + Keepalived高可用负载均衡集群之图文教程
负载均衡系统可以选用LVS方案,而为避免Director Server单点故障引起系统崩溃,我们可以选用LVS+Keepalived组合保证高可用性. 重点:每个节点时间都同步哈! C++代码 [r ...
- 测试LVS+Keepalived高可用负载均衡集群
测试LVS+Keepalived高可用负载均衡集群 1. 启动LVS高可用集群服务 此时查看Keepalived服务的系统日志信息如下: [root@localhost ~]# tail -f /va ...
- 使用LVS+keepalived实现mysql负载均衡的实践和总结
前言 经过一段时间的积累,数据库的架构就需要根据项目不断的进行变化. 从单台数据库,到了两台数据库的主从,再到读写分离,再到双主,现在进一步需要更多的数据库服务器去支撑更加可怕的访问量. 那么经过那么 ...
- LVS+Keepalived高可用负载均衡集群架构实验-01
一.为什么要使用负载均衡技术? 1.系统高可用性 2. 系统可扩展性 3. 负载均衡能力 LVS+keepalived能很好的实现以上的要求,LVS提供负载均衡,keepalived提供健康检查, ...
- lvs+keepalived+bind实现负载均衡高可用智能dns【转】
转:https://www.cnblogs.com/mikeluwen/p/7068356.html 整体架构: 1.IP地址规划: Dns1:172.28.0.54 Dns2:172.28.0.55 ...
- lvs+keepalived+bind实现负载均衡高可用智能dns
整体架构: 1.IP地址规划: Dns1:172.28.0.54 Dns2:172.28.0.55 Dr服务器主:172.28.0.57 Dr服务器从:172.28.0.67 Vip:172.28.0 ...
- lvs+keepalived高可用负载均衡
一.实验环境和网络拓扑图 本实验需要5台虚拟机,一台客户机,2台lvs调度器,两台web服务器. 客户机:192.168.0.6/24 lvs1:192.168.0.201/24 lvs2:192.1 ...
- Ubuntu构建LVS+Keepalived高可用负载均衡集群【生产环境部署】
1.环境说明: 系统版本:Ubuntu 14.04 LVS1物理IP:14.17.64.2 初始接管VIP:14.17.64.13 LVS2物理IP:14.17.64.3 初始接管VIP:14 ...
随机推荐
- fsLayuiPlugin数据字典使用
概述 数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用. 1.多个页面下拉框使用同样的数据,改一个地方需要把所有页面都要修改 2.数据表格转义代替自己手动写templet解析 ...
- echarts实现饼图及横向柱状图的绘制
项目中需要绘制饼图,因此简单学习了下echarts的基本使用.head中引入js文件: <script src="/static/frame/echarts/echarts.min.j ...
- Tomcat 之startup.bat启动失败案例
今天我在部署一个Tomcat环境时,各种变量都配置完了,最后启动Tomcat时,Tomcat一闪而过,当时我的内心是崩溃的~~ 然后我就开始百度.定位问题.进入cmd命令行窗口,cd进入到Tomcat ...
- JavaScript对象(一)
Part One:对象的创建对象的创建,可以使用new Object() 或者 Object.creat(),该方法为静态函数 var foo = Object.create({x:1,y:2}); ...
- eetcode必要技巧--动态规划(一)
首先我们要搞清楚什么是动态规划 动态规划是运筹学中用于求解决策过程中的最优化数学方法.当然,我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法. 当然这个很难理解,但是按 ...
- 修改js文件,引发的404问题
记录一个bug,本地测不出来,客户后台却404,web测试可参考.(不知道是不是通用的) 先介绍下背景 我们是web产品,存在发布机.管理机.js文件,页面会引用到这些js文件.出于安全考虑,规定js ...
- 配置XNA以适用VS2017进行开发
Win10似乎已不再支持使用XNA进行游戏开发,安装XNA Game Studio经常会出现错误,显示不兼容,即使安装VS2010也不行.下面给出方法,可以使用VS2017配合XNA进行游戏开发. 1 ...
- [项目分享]JSP+Servlet+JDBC实现的云端汽修后台管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/chenlinSir/CloudDemo-servlet 难度等级:简单 基于JSP+Servlet+Jdbc的云端 ...
- 2016 Multi-University Training Contest 1 T3
题目要求出所有合法点对间的最短路径的平均值,因此我们应当求出所有合法最短点对的最 短路径之和,再除以合法点对个数. 题目中Guard之间有着很不自然的制约关系,每个Guard的周围和同行.列都不能有其 ...
- BigInteger实现除法取余
BigInteger实现除法取余 BigInteger是什么? Java中,整形的最大范围是64位的long型整数.但是如果我们使用的整数超过了64位呢?这时候就用到了BigInteger.BigIn ...