Linux集群之高可用负载均衡lvs+keepalived
LVS简介
LVS介绍
LVS是Linux Virtual Server的缩写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,属于4层负载均衡
ipvs和ipvsadm的关系
我们使用配置LVS的时候,不能直接配置内核中的ipvs,需要使用ipvs的管理工具ipvsadm进行管理
LVS术语
LVS转发原理
LVS负载均衡器接受所有入站请求,并根据调度算法决定哪个realserver处理该请求
LVS调度算法
- 轮询(rr):按照请求顺序轮流分发到后端RS
- 加权轮询(wrr):权值高的获得的任务更多
- 最小连接数(lc):动态的将请求建立到连接数较少的RS上
- 加权最小连接数(wlc):调度器自动询问RS的真实负载情况,并动态的调整权
LVS调度算法生产环境选型
一般的网络服务,如:http、mail、MySQL等,常用的调度算法为:
- 基本轮询调度rr算法
- 加权轮询调度wrr算法
- 加权最小连接调度wlc算法
LVS转发模式
- NAT(Network Address Translation)
- DR(Direct Routing)
- TUN
LVS-DR模式
转发流程
将所有入站请求转发给后端realserver,后端realserver处理完直接将结果发给客户端
原理
当用户请求到达Direct Server,此时报文的源IP为CIP、MAC为CIP-MAC,目标IP为VIP、MAC为VIP-MAC
Direct Server根据调度算法确定一台处理请求的realserver,将请求转发给对应的realserver,此时源IP和目标IP均未改变,仅修改了源MAC为DIP-MAC,目标MAC为RIP-MAC
对应的realserver处理完请求,直接将结果发给客户端,此时源IP为VIP、MAC为VIP-MAC,目标IP为CIP、MAC为CIP-MAC
特性
- 通过在调度器上修改数据包的目的MAC地址实现转发
- Real-Server和Direct-Server必须在同一网段
- Real-Server的lo接口必须绑定VIP
为什么要抑制ARP请求
- 由于后端Real-Server要将VIP绑定到lo网卡上,这就出现了一个问题,客户端请求到达LVS前端路由器的时候,前端路由器会发送一个{*目标地址为VIP*}的请求报文,所以需要抑制Real-Server的ARP,保证让Direct-Server收到这个报文,而不是realserver收到这个报文
- /proc/sys/net/ipv4/conf/all/arp_ignore 的值为1,/proc/sys/net/ipv4/conf/lo/arp_ignore 的值为1
- /proc/sys/net/ipv4/conf/all/arp_announce的值为2,/proc/sys/net/ipv4/conf/lo/arp_announce的值为2
- 一句话说明抑制Real-Server原因:保证前端路由将目标地址为VIP的报文发给Direct-Server,而不是Real-Server
优势
只有请求报文经过调度器,而Real-Server响应处理后无需经过调度器,因此并发量大的时候效率很高
LVS-NAT模式
转发流程
将所有入站请求转发给后端Real-Server,后端Real-Server处理完再发给Direct-Server,Direct-Server再发给客户端
特性
- 既有RIP也有VIP
- Real-Server必须得跟Direct-Server在同一网段
- Real-Server必须将网关指向Direct-Server
优势
只需要一个公网IP给Direct-Server,Direct-Server始终跟外接打交道
劣势
需要依赖Direct-Server把请求转发给Real-Server,Real-Server处理完把结果发给Direct-Server,Direct-Server再把结果转发出去,并发高的时候会成为瓶颈
LVS三种模式对比
ipvsadm介绍
ipvsadm参数
添加虚拟服务器
语法:ipvsadm -A [-t|u|f] [vip_addr:port] [-s:指定算法]
-A:添加
-t:TCP协议
-u:UDP协议
-f:防火墙标记
-D:删除虚拟服务器记录
-E:修改虚拟服务器记录
-C:清空所有记录
-L:查看
添加后端RealServer
语法:ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g|i|m] [-w 指定权重]
-a:添加
-t:TCP协议
-u:UDP协议
-f:防火墙标记
-r:指定后端realserver的IP
-g:DR模式
-i:TUN模式
-m:NAT模式
-w:指定权重
-d:删除realserver记录
-e:修改realserver记录
-l:查看
通用:
ipvsadm -ln:查看规则
service ipvsadm save:保存规则
ipvsadm配置LVS负载均衡
需求
用LVS实现后端两台httpd的负载均衡
环境说明
lb01 | 192.168.0.91 | lvs |
realserver-1 | 192.168.0.92 | httpd |
realserver-2 | 192.168.0.93 | httpd |
test | 192.168.0.94 | 用来测试负载均衡 |
负载均衡器端
安装LVS
yum -y install ipvsadm
ipvsadm
添加绑定VIP
ip addr add 192.168.0.89/24 dev eth0 label eth0:1
配置LVS-DR模式
ipvsadm -A -t 192.168.0.89:80 -s rr
ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.93 -g
ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.94 -g
Real-Server端
配置httpd省略
curl 192.168.0.93 #测试realserver-1网站是否正常
192.168.0.93
curl 192.168.0.94 #测试realserver-2网站是否正常
192.168.0.94
绑定VIP到lo网卡
ip addr add 192.168.0.89/32 dev lo label lo:1 #由于DR模式需要realserver也有VIP
抑制ARP
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
客户端测试
[root@test ~]#curl 192.168.0.89
192.168.0.93
[root@test ~]#curl 192.168.0.89
192.168.0.94
配置LVS+keepalived
需求
- LVS给两台httpd做负载均衡
- keepalived做lvs高可用,同时做Real-Server健康检查,如果发现Real-Server80端口没开,就认为故障,从集群中剔除
- 在keepalived配置文件内就能配置LVS
环境说明
lb01 | 192.168.0.91 | lvs keepalived-master |
lb02 |
192.168.0.92 | lvs keepalived-backup |
realserver-1 | 192.168.0.93 | httpd |
realserver-2 | 192.168.0.94 | httpd |
在负载均衡器端配置lvs+keepalived
lb01节点
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
##################全局配置##########################
global_defs {
#如有故障,发邮件地址
notification_email {
9618154@qq.com #收件人
}
notification_email_from Alexandre.Cassen@firewall.loc #keepalived报警邮件,发件人
smtp_server 192.168.200.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器超时时间
router_id LVS_01 #类似于MySQL的server-id,每个keepalived节点不能相同
}
#################keepalived配置#####################
vrrp_instance VI_1 {
state MASTER #keepalived角色,MASTER和BACKUP
interface eth0 #通信接口,下面的virtual_ipaddress(VIP)绑定到这个网卡
virtual_router_id 51 #vrrp_instance的唯一标识
priority 150 #keepalived权重,数值越大权重越大,MASTER应大于BACKUP
advert_int 1 #发送心跳间隔,如果backup1秒收不到心跳就接管,单位是秒
authentication { #每个keepalived节点通过这里设置的验证通信,必须得设置成一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.89/24 #VIP
}
}
##################LVS配置##############
#添加虚拟服务器
#相当于 ipvsadm -A -t 192.168.0.89:80 -s wrr
virtual_server 192.168.0.89 80 {
delay_loop 6 #服务健康检查周期,单位是秒
lb_algo wrr #调度算法
lb_kind DR #模式
nat_mask 255.255.255.0
persistence_timeout 50 #回话保持时间,单位是秒
protocol TCP #TCP协议转发
#添加后端realserver
#相当于 ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.93:80 -w 1
real_server 192.168.0.93 80 { #realserver的真实IP
weight 1 #权重
#健康检查
TCP_CHECK {
connect_timeout 8 #超时时间
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
connect_port 80 #检查realserver的80端口,如果80端口没监听,就会从集群中剔除
}
}
real_server 192.168.0.94 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
} }
lb02节点
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
################全局配置###########################
global_defs {
notification_email {
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_02
}
################keepalived配置#####################
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.89/24
}
}
################lvs配置##########################
virtual_server 192.168.0.89 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.0.93 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.0.94 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
} }
配置后端Real-Server
确保网站服务是正常的
curl 192.168.0.93
192.168.0.93
curl 192.168.0.94
192.168.0.94
绑定VIP到lo网卡
ip addr add 192.168.0.89/32 dev lo label lo:0
抑制ARP
[root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@realserver-1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@realserver-1 ~]#echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
客户端测试
- 负载均衡是否正常
- 后端Real-Server出问题是否自动剔除
- lvs高可用是否正常,提供服务的LVS宕机,vip漂移到另一台LVS继续提供服务
温馨提示:
如果在是实际环境中使用Keepalived做高可用集群解决方案时,为了解决脑裂的问题,我们需要把MASTER与BACKUP服务器的Keepalived的主配置文件(keepalived.conf)中的 "state" 状态都改为 "BACKUP" 优先级 "priority" 选项的值不要设置为相同,可以设置一个数值大另一个数值小;如优先级分别为:priority 100 priority 90
Linux集群之高可用负载均衡lvs+keepalived的更多相关文章
- Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)
Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...
- 高可用负载均衡 haproxy+keepalived
服务器 20.0.0.206 10.0.0.206 bs-hk-hk01 高可用负载均衡节点 2c2g 20.0.0.207 10.0.0.207 bs-hk-hk02 高可用负载均衡节点 ...
- Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群
一.前言 前两节分别介绍了 Linux 的高可用集群和负载均衡集群,也可以将这两者相结合,即 Keepalived+LVS 组成的高可用负载均衡集群,Keepalived 加入到 LVS 中的原因有以 ...
- LVS+Keepalived搭建MyCAT高可用负载均衡集群
LVS+Keepalived 介绍 LVS LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国 ...
- Heartbeat+LVS构建高可用负载均衡集群
1.heartbeat简介: Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统.心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里 ...
- Haproxy+Keepalived搭建Weblogic高可用负载均衡集群
配置环境说明: KVM虚拟机配置 用途 数量 IP地址 机器名 虚拟IP地址 硬件 内存3G 系统盘20G cpu 4核 Haproxy keepalived 2台 192.168.1.10 192 ...
- 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)
1.熟悉几个组件 1.1.apache —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...
- 搭建MySQL高可用负载均衡集群
1.简介 使用MySQL时随着时间的增长,用户量以及数据量的逐渐增加,访问量更是剧增,最终将会使MySQL达到某个瓶颈,那么MySQL的性能将会大大降低.这一结果也不利于软件的推广. 那么如何跨过这个 ...
- Keepalived+Nginx实现高可用负载均衡集群
一 环境介绍 1.操作系统CentOS Linux release 7.2.1511 (Core) 2.服务keepalived+nginx双主高可用负载均衡集群及LAMP应用keepalived-1 ...
随机推荐
- springmvc httprequest 使用@Autowired注解
springmvc httprequest 使用@Autowired注解我一直有个疑问,就是注解后每次的httprequest 是不是都一样的了,然后会不会引发多线程问题? 代码如下: import ...
- windows下使用MYSQL的mysqldumpslow进行慢日志分析
1.首先安装好perl环境. 2.在dos环境中,切换到perl目录中,例如我的目录是 dos 命令 cd c:\Perl\bin 3.在此目录输入perl mysqldumpslow的路径\mysq ...
- I/O————流
流的关系图 缓冲流分为字节和字符缓冲流(图中是经常用的搭配,PrintWrite与BufferedWrite都继承java.io.Write) 字节缓冲流为: BufferedInputStream— ...
- 基于TypeScript从零重构axios
一.在GitHub上创建一个代码仓库 找到仓库地址:git@github.com:QianDingweiCharles/ts-axios.git 二.项目配置 本地新建一个文件夹axios 用VSco ...
- 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
你的飞碟在这儿 难度:☆ Code: #include<iostream> #include<cstring> #include<cstdio> using nam ...
- css hack 浏览器携带自身特有的属性 (二)
css hack 浏览器携带自身特有的属性,才是我们真正要解决的css 兼容问题. 这里只是分享思路. 举例子: 1 outline,尤其是一些 自带继承特性的属性.这里指的是 隐性的inherite ...
- iOS - NSString 封装
在实际项目开发过程中,发现字符串使用频率还是非常高的,NSString提供了很多相关的API,但是在开发过程中发现很多业务功能都是相同的.因此根据在开发过程中遇到的字符串使用场景,进行了简单封装.具体 ...
- Intellij IDEA项目添加资源文件
添加了一个资源文件,但读取的时候出错了 prop.load(Config.class.getResourceAsStream("/resources/dbconfig.properties& ...
- python3操作mysql数据库表01(封装查询单条、多条数据)
#!/usr/bin/env python# -*- coding:UTF-8 -*- import pymysql# import os'''封装查询单条.多条数据'''# os.environ[' ...
- 家校通Code
9 http://dlwt.csdn.net/fd.php?i=621573845033702&s=44d46a459acce7fef39aa4dcff51bfba