如何实现跨网段高可用,dns,nginx lvs 负载均衡或lvs.什么都行

当前位置:&>&&>&
Lvs DR模式实现负载均衡
发布时间:编辑:
LVS即Linux Virtual Server,Linux虚拟服务器,适应LVS可以构建高性能的负载均衡系统,LVS有三种模式即:LVS/NAT(网络地址转换)、LVS/TUN(IP隧道)、LVS/DR(直接路由),通常用的是DR模式。
测试环境:使用虚拟IP192.168.1.243,调度机的IP地址是192.168.1.245,两台真实的IP分别是192.168.1.246、192.168.1.247。
1,首先,在调度机上安装ipvsadm
复制代码 代码示例:
-y install ipvsadm
调度机设置虚拟IP
复制代码 代码示例:
ifconfig :0 192.168.1.243 netmask 255.255.255.255
route add -host 192.168.1.243 dev eth0:0
两台真实服务器设置虚拟IP
复制代码 代码示例:
ifconfig lo:0 192.168.1.243 netmask 255.255.255.255
route add -host 192.168.1.243 dev lo:0
真实服务器配置arp忽略(有几台配置几台)
vi /data0/arp_ignore.sh
复制代码 代码示例:
echo 1 & /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 & /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 & /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 & /proc/sys/net/ipv4/conf/all/arp_announce
赋予可执行权限
复制代码 代码示例:
chmod a+x /data0/arp_ignore.sh
2,LVS调度机 配置LVS脚本
vi /data0/lvs.sh
复制代码 代码示例:
ipvsadm -C
ipvsadm -At 192.168.1.243:80 -s rr
ipvsadm -at 192.168.1.243:80 -r 192.168.1.246:80 -g
ipvsadm -at 192.168.1.243:80 -r 192.168.1.247:80 -g
ipvsadm -L -n
赋予可执行权限:
复制代码 代码示例:
chmod a+x /data0/lvs.sh
在调度机及各个服务器上执行lvs.sh和arp_ignore.sh脚本,然后测试下效果。
与 Lvs DR模式实现负载均衡 有关的文章
本文标题:
本页链接:
12345678910
12345678910& 配置LVS + Keepalived高可用负载均衡集群之图文教程
配置LVS + Keepalived高可用负载均衡集群之图文教程
& & & &负载均衡系统可以选用LVS方案,而为避免Director Server单点故障引起系统崩溃,我们可以选用LVS+Keepalived组合保证高可用性。& & & &重点:每个节点时间都同步哈!
[root@DR2&~]#&ntpdate&&&&&hwclock&-w&&1、环境简介:1)虚拟机:VMware ESXi 5.5 (CentOS 6.4 x86-64安装在其中)2): CentOS 6.4 x86-643)Keepalived版本: Keepalived-1.2.94)IPVS管理工具IPVSadm-1.265) Linux/Unix工具Xmanager 4.0 (Xshell)2、禁掉防火墙和Selinux(1) 禁掉防火墙(2) 禁掉Selinux
vim&/etc/selinux/config&&&(3) 最后,必须重新启动系统
shutdown&-r&now&&重点: DR2、Real Server1和Real Server2如下图所述完成!3、检查DR1与DR2的连通性://在DR1上分别ping DR2的public IP和private IP,如下图所示://在DR2上分别ping DR1的public IP和private IP,如下图所示:&&&一、理论篇:1. LVS简介:LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。章文嵩博士目前工作于阿里集团,主要从事集群技术、操作系统、对象存储与数据库的研究。(摘自《BAIDU百科》)2. LVS集群的组成:LVS服务器系统由三部分组成:1)负载均衡层:位于整个集群系统的最前端,避免单点故障一般最少由2台或2台以上负载调度器组成。2)服务器群组层:是一组真正运行应用服务器的机器组成,Real Server可以是Web、FTP、DNS、Mail 、视频等服务器中的一个或N个,每个Real Server之间通过高速的LAN/WAN相连接。为了节省宝贵的资源,在生产环境中,Director Server同时身兼Real Server的角色!3)共享存储层:为Real Server提供共享存储空间和内容一致性的存储区域。可以为磁盘阵列、Red Hat的GFS文件系统、Oracle的OCFS2文件系统等。Director Server是整个LVS的核心!到目前为止,Director server只能安装在Linux、FreeBSD上,如果Linux内核是2.6及以上时,则已经内置了LVS的各个模块,不用作任何的设置就支持LVS功能。Real Server服务器几乎为所有有系统平台,如:Windows、Linux、Solaris、AIX、BSD等系统平台。3. LVS集群的特点:(1) IP负载均衡和负载调度算法;(2) 高可用性;(3) 高可靠性;(4) 适用环境;(5) 开源软件。4. LVS集群系统的优缺点:LVS集群系统的优点:(1) 抗负载能力强工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器I/O的性能不会受到大流量的影响;(2) 工作稳定自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat; & &(3) 应用范围比较广可以对所有应用做负载均衡; & &(4) 配置性比较低既是优点,也是缺点,因为没有太多配置,所以并不需要太多接触,大大减少了人为出错的几率; & &LVS集群系统的缺点:(1) 软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。 & &&(2) 如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx/HAProxy+Keepalived就简单多了。集群根据业务目标而分为以下几种:(1) High Availability (高可用): 目的是保持业务的持续性。(2) Load Balancing(负载均衡): 将请求一个个分担到不同一计算机上去,每台计算机独立完成一个用户的请求的。(3) High Performance (高性能): 需要一组计算机共同完成一件事情。5. 实现集群产品:*HA(1)RHCS: 企业内用得比较多(2)heartbeat:(3)keepalived:(*)黄金组合: LVS + Keepalived (重点)*LB(负载均衡)(1)HAP(2)LVS;(3)N(4)硬件F5;(5)Piranha :红帽光盘自带的,但在Linux 6.0中又去掉了*HPC6. LVS负载均衡技术:(1)LVS-DR模式(Direct routing):直接路由模式。用得最多!可以跟100个以上Real Server(2)LVS-NAT模式(Network Address Translaton): 只能跟3~5个Real S(3)LVS-TUN模式(IP Tunneling): 应用于远程,尤其是外网等7. LVS-NAT特性:(1)Real Server必须与Director在同一网络,仅用于与Director服务器通讯;(2)Director接收所有的数据包通讯(包括客户端与Director、Director和real server直接的通讯);(3)Real Server的默认网关指向Director的真实IP地址;(4)Director支持端口映射,可以将客户端的请求映射到Real Server的另一个端口;(与DR模式的区别)(5)支持任意操作系统; 如:Windows、Linux、FreeBSD、AIX等(6)单一的Director是整个集群的瓶颈(故一般都是2台或2台以上的Director机器)8. LVS负载均衡的调度算法(静态)(1)轮循调度(Round Robin)(rr)(最笨的调度算法)调度器通过&轮循&调度算法将外部请求按顺序轮流分配到集群中的Real Server上,均等每一台Server,而不管Server上实际的连接和系统负载。(2)加权轮循(Weighted Round Robin)(wrr)调度器通过&加权轮循&调度算法根据真实服务器的不同处理能力来调访问请求。如此保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。(3)目标地址散列(Destination Hashing)(DH)(有缓存,目标不变,则不变)它的调度算法根据请求的目标IP地址,作为散列(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,则将请求发送到该服务器,否则返回空。(4)源地址散列(Source Hashing)(SH) (有缓存,源不变,则不变)是根据请求的源IP地址,作为散列键(Hash key)从静态分配的散列表找出对应的服务器,若该 服务器是可用的且未超载,将请求发送到该服务器,否则返回空。9. LVS负载均衡的调度算法(动态)(5)最少链接(Least Connections)(LC)调度器通过&最少连接&调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。若集群系统的真实服务器具有相近的系统性能,采用&最少连接&调度算法可以较好地均衡负载。公式:LC = 活动连接数*256 + 非活动连接数例如:(6)加权最少链接(Weighted Least Connections)(WLC) 注:目前最优秀的调度算法!适应:在集群系统中的服务器性能差异较大的情况下,调度器采用&加权最少链接&调算法优化负载均衡性能。具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。例如:在上表加入Real Server1权值 为3,Real Server2权值为1时,则公式:WLC = (活动连接数*256 + 非活动连接数)/权重(7)最短的期望的延时(Shortest Expected Delay)(SED)sed只是在WLC上做了些微调而已。只计算活动连接数!公式:LC = (活动连接数+1)*256 &权重(8)最少队列调度(Never Queue Scheduling)(NQS)无需队列。若Real Server的连接数=0,就直接分配过去,不需要再进行sed运算。只计算活动连接数!(9)基于局部性的最少连接(Locality-Based Least Connections)(LBLC)它的调度算法针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用&最少连接&的原则选出一个可用的服务器,将请求发送到该服务器。(HD动态算法)(10)带复制的基于局部最少链接(Locality-Based Leat Connections Witch Replication)(LBLCR)此调算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按&最小连接&原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载,则按&按最少连接&原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。二、实战篇:1. 安装LVS软件:(分别在DR1和DR2中)LVS软件包括二部分:① IPVS模块,LVS已经是Linux标准内核的一部分,直接被编译在内核中!② IPVS管理工具IPVSadm ,如:IPVSadm-1.261)检查是否安装了IPVS模块: 注:LVS已经是Linux标准内核的一部分,直接被编译在内核中!方法1: 查看IPVS模块是否真的编译到内核中去了,如下图所示:由上可知,有3个项,说明这个功能已经编译到内核中了!方法2: 使用modprobe命令查看,如下图所示:由上可知,明显安装了支持LVS的IPVS模块!2)在DR1上安装IPVS管理软件:方法1:源码安装
[root@DR1&src]#&cd&ipvsadm-1.26&&
[root@DR1&ipvsadm-1.26]#&make&&//make时,出现如下所示:&解决方法:安装以下4个包: (rpm &ivh 软件包名)(1) popt-1.13-7.el6.x86_64.rpm(2) libnl-1.1-14.el6.x86_64.rpm(3) libnl-devel-1.1-14.el6.x86_64.rpm(4)popt-static-1.13-7.el6.x86_64.rpm重点:安装以上4个包后,安装成功,如下图所示:方法2: yum安装
yum&-y&install&ipvsadm&&//检查ipvsadm安装是否成功:&如果显示了ipvsadm的各种用法,则说明ipvsadm安装成功了!2. 安装Keepalived (分别在DR1和DR2中)&
[root@DR1&src]#&cd&keepalived-1.2.9&&
[root@DR1&keepalived-1.2.9]#&./configure&--sysconf=/etc\&&
&&--with-kernel-dir=/usr/src/kernels/2.6.32-358.el6.x86_64/&&重点: 确保下面3行是 yes !如下图所示://编译之
[root@DR1&keepalived-1.2.9]#&make&&//安装//做个软链接
[root@DR1&keepalived-1.2.9]#&ln&-s&/usr/local/sbin/keepalived&/sbin/&&//检验安装是否成功:如果显示了Keepalived的各种用法,则说明Keepalived安装成功了!//同理DR2中安装keepalived,现在检查安装是否成功:3. 配置keepalived(1)在DR1上配置keepalived:最简单的方法:先在记事本中,手工创建之。复制到/etc/keepalived/keepalived.conf中,保存即可!//手工创建keepalived.conf文件(vim /etc/keepalived/keepalived.conf)
!&Configuration&File&for&keepalived&&
global_defs&{&&
&&&notification_email&{&&
&&&&&acassen@firewall.loc&&&#设置报警邮件地址,可以设置多个,每行1个,&&
&&&&&failover@firewall.loc&&#需开启邮件报警及本机的Sendmail服务。&&
&&&&&sysadmin@firewall.loc&&
&&&notification_email_from&Alexandre.Cassen@firewall.loc&&
&&&smtp_server&192.168.200.1&&#设置SMTP&Server地址;&&
&&&smtp_connect_timeout&30&&
&&&router_id&LVS_DEVEL&&
&&&&&&&&&&&########VRRP&Instance########&&
vrrp_instance&VI_1&{&&
&&&&state&MASTER&&&&#指定Keepalived的角色,MASTER为主机服务器,BACKUP为备用服务器&&
&&&&interface&eth0&&#BACKUP为备用服务器&&
&&&&virtual_router_id&51&&
&&&&priority&100&&&&#定义优先级,数字越大,优先级越高,主DR必须大于备用DR。&&
&&&&advert_int&1&&
&&&&authentication&{&&
&&&&&&&&auth_type&PASS&&#设置验证类型,主要有PASS和AH两种&&
&&&&&&&&auth_pass&1111&&#设置验证密码&&
&&&&virtual_ipaddress&{&&
&&&&&&&&192.168.1.200&&#设置主DR的虚拟IP地址(virtual&IP),可多设,但必须每行1个&&
&&&&&&&&&&&########Virtual&Server########&&
virtual_server&192.168.1.200&80&{&&#注意IP地址与端口号之间用空格隔开&&
&&&&delay_loop&6&&&&&&&&#设置健康检查时间,单位是秒&&
&&&&lb_algo&rr&&&&&&&&&&#设置负载调度算法,默认为rr,即轮询算法,最优秀是wlc算法&&
&&&&lb_kind&DR&&&&&&&&&&#设置LVS实现LB机制,有NAT、TUNN和DR三个模式可选&&
&&&&nat_mask&255.255.255.0&&
&&&&persistence_timeout&50&&#会话保持时间,单位为秒&&
&&&&protocol&TCP&&&&&&&&#指定转发协议类型,有TCP和UDP两种&&
&&&&real_server&192.168.1.132&80&{&&
&&&&&&&&weight&1&&&&&&&&&&#配置节点权值,数字越大权值越高&&
&&&&&&&&TCP_CHECK&{&&
&&&&&&&&&&&&connect_timeout&3&&&&&#表示3秒无响应,则超时&&
&&&&&&&&&&&&nb_get_retry&3&&&&&&&&#表示重试次数&&
&&&&&&&&&&&&delay_before_retry&3&&#表示重试间隔&&
&&&&&&&&}&&
&&&&real_server&192.168.1.133&80&{&&#配置服务器节点,即Real&Server2的public&IP&&
&&&&&&&&weight&3&&&&&&&&&&&&#配置节点权值,数字越大权值越高&&
&&&&&&&&TCP_CHECK&{&&
&&&&&&&&&&&&connect_timeout&3&&&&&&&#表示3秒无响应,则超时&&
&&&&&&&&&&&&nb_get_retry&3&&&&&&&&&&#表示重试次数&&
&&&&&&&&&&&&delay_before_retry&3&&&&#表示重试间隔&&
&&&&&&&&}&&
}&&//启动哈keepalived、设置keepalived服务自动启动、检查是否生效,如下图所示:(2)在DR2上配置keepalived:先将上面记事本中的keepalived.conf配置文件,仅仅修改2处,如下图所示:No.1处:把&stateMASTER&修改为&stateBACKUP& #即备用服务器;No.2处:把&priority 100&修改为&priority 90& #优先级为90。修改好后,复制到DR2的/etc/keepalived/keepalived.conf中,保存即可!//启动哈keepalived、设置keepalived服务自动启动、检查是否生效,如下图所示:4. 配置Real Server节点:1)yum &y install httpd2)启动httpd服务时,出错://vim /etc/httpd/conf/httpd.conf中,依如下操作:#265 ServerName :80 //去掉前面的#号即可!3)在RealServer1和RealServer2上的脚本realserver.sh:
#add&for&chkconfig&&
#chkconfig:&&&#234都是文本界面,5就是图形界面X,70启动顺序号,30系统关闭,脚本&&
#止顺序号&&
#description:&RealServer's&script&&#关于脚本的简短描述&&
#processname:&realserver.sh&&&&&&&#第一个进程名,后边设置自动时会用到&&
#!/bin/bash&&
VIP=192.168.1.200&&
source&/etc/rc.d/init.d/functions&&
case&&$1&&in&&
&&&&&&&ifconfig&lo:0&$VIP&netmask&255.255.255.255&broadcast&$VIP&&
&&&&&&&/sbin/route&add&-host&$VIP&dev&lo:0&&
&&&&&&&echo&&1&&&/proc/sys/net/ipv4/conf/lo/arp_ignore&&
&&&&&&&echo&&2&&&/proc/sys/net/ipv4/conf/lo/arp_announce&&
&&&&&&&echo&&1&&&/proc/sys/net/ipv4/conf/all/arp_ignore&&
&&&&&&&echo&&2&&&/proc/sys/net/ipv4/conf/all/arp_announce&&
&&&&&&&echo&&RealServer&Start&OK&&&
&&&&&&&;;&&
&&&&&&&ifconfig&lo:0&down&&
&&&&&&&route&del&$VIP&&/dev/null&2&&1&&
&&&&&&&echo&&0&&&/proc/sys/net/ipv4/conf/lo/arp_ignore&&
&&&&&&&echo&&0&&&/proc/sys/net/ipv4/conf/lo/arp_announce&&
&&&&&&&echo&&0&&&/proc/sys/net/ipv4/conf/all/arp_ignore&&
&&&&&&&echo&&0&&&/proc/sys/net/ipv4/conf/all/arp_announce&&
&&&&&&&echo&&RealServer&Stoped&&&
&&&&&&&;;&&
&&&&&&&*)&&
&&&&&&&echo&&Usage:&$0&{start|stop}&&&
&&&&&&&exit&1&&
exit&0&&//为realserver.sh添加权限5. 启动keepalived + LVS集群系统:6. 测试分为三个部分:1)高可用性功能测试:高可用性是通过LVS的两个DR1和DR2完成的。为了模拟故障,先将DR1上的Keepalived服务停止或者干脆关掉节点DR1,然后观察备用DR2上Keepalived是否获得虚拟IP地址,即VIP 192.168.1.200//在DR1查看哈,信息如下图所示:由上可知,虚拟IP地址在DR1节点上,即VIP 192.168.1.200//在DR2查看哈,信息如下图所示:【思考】自己查查看,一定会成功!方法1:命令检验法使用命令ipvsadm &Ln和ip addr list/show查看虚拟IP漂移情况来判断。//关闭DR1,模拟宕机,如下图所示:由上图可知,DR1确实宕机了,而DR2得到了虚拟IP地址(上图红框中的192.168.1.200)且访问依然正常,再次证明了高可用性,如下图所示:方法2:查看日志法//关闭DR1/停止DR1的keepalived服务,模拟宕机,在DR2中查看日志,如下图日志所示://再查看DR2是否立刻检测到DR1出现故障,确实非常快就检测到DR1的故障,并马上接管主机的虚拟IP地址(192.168.1.200),注意观察上图和下图!2)负载均衡测试:为了便于测试,我们在Real Server1和Real Server2分别配置www服务的网页且内容也好识别,如下图所示:方法1:客户端浏览器中测试由上可知,我们在VMWare中的XP操作系统和物理机器win 7的浏览器中分别输入http://192.168.1.200且不断地刷新之都可访问!方法2:用压力测试法
[root@CentOS6&~]#&ab&&c&100&&n&10000&http:&&3)故障切换测试故障切换是测试在某个节点出现故障后,keepalived监控模块能否及时发现,然后屏蔽故障节点,同时将服务转移到正常节点上执行之。停掉节点Real Server2服务,模拟该节点出现故障,然后查查看主、备机器日志信息:方法1:查看主、备机器日志信息//先停掉节点Real Server2的httpd服务,如下图所示://再查看DR1上的日志,如下图所示://再查看DR2上的日志,如下图所示:由上可知,故障切换测试成功!方法2:客户端浏览器中测试& &不断刷新网页一直就显示如上图所示:Real Server1内容!可见故障切换成功!
除非特别注明,文章均为原创
转载请标明本文地址:
作者:鸡啄米
&&( 23:30:1)&&( 23:9:1)&&( 22:54:3)&&( 13:21:24)&&( 21:9:17)&&( 21:8:30)
技术含量好高啊
感谢你的分享
打一个小广告
要买定量包装秤的请点击我~~
下午好 文章不错 感谢博主分享
我只是很有节操的过来打广告的~~
慢慢学习学习
相当好文啊。
完全随机文章查看:2258|回复:4
为了把问题解释清楚,文字比较多,请各位师傅耐心看下,谢谢
目前有2台LVS服务器(负做载 DR模式)+1台nginx服务器+DNS服务器+一台web服务器组成了一个反向代理服务器,用于外网不同的域名或者二级域名更快速度访问web服务器上不同网站。例如:
路由上公网地址:1.1.1.1
LVS1:192.168.1.251;eth0:192.168.1.199
LVS2:192.168.1.252;&&eth0:192.168.1.199
nginx:192.168.1.253;VIP:192.168.1.199
DNS:192.168.1.100
web serv:192.168.1.200
目的:访问到web服务器上的指定网页
现在我能查到的现象是:访问路由的时候,被转发到VIP;在DNS中:正向解析到了web服务器;也做了反向解析,主机头也绑定了对应了网页目录(内网可以访问);nginx上也做了转发如图1
以上是我能查到的,现在的问题是:1、它的数据转发流程是什么样的,特别是VIP向后直到能访问到web服务器内容的转发过程
2、我按照同样的设置,把123更换成456,却无法访问,在DNS,web,nginx方面的配置是跟与原来的一模一样的?
感谢各位师傅一定指教下小弟,研究了好长时间都无法参透其中原理(原配置人员已经无法联系到),再次感谢各位师傅!若有不明白的,请一定加我Q:
提问详细,有自己的见解
提示: 作者被禁止或删除 内容自动屏蔽
为什么负载均衡跟nginx的vip是一样的?
还有为什么要用lvs使用DR模式&&nginx有负载均衡功能啊。
nginx反向代理:必须将域名指定到这个服务,然后nginx里的server_name必须指定你访问的这个 proxy_pass指定到IP,缓存功能开启。哪些事缓存的&&哪些是不缓存的 都是需要你自己定义的。如果你在这需要做负载均衡那么就调用upstream这个模块,所以你在编译的时候必须加缓存模块跟upstream模块。其余的自己根据需求添加。
未使用upstream,具体配置文件,请看附件,谢谢
麻烦看下,如果,我需要添加个二级域名
需要做那些操作,我之前的操作中是否有漏掉的?非常感谢!引用:原帖由 只是zero 于
09:26 发表
为什么负载均衡跟nginx的vip是一样的?
还有为什么要用lvs使用DR模式&&nginx有负载均衡功能啊。
nginx反向代理:必须将域名指定到这个服务,然后nginx里的server_name必须指定你访问的这个 proxy_pass指定到IP,缓存功能开 ...
15:43, 下载次数: 75
优秀技术经理
首先,不要说我是复制的,如果你能从网上找到我下面的全部内容,再说我是复制的不迟!BS那些无证据还说别人是复制的家伙
LVS三种模式:
LVS/NAT:NAT模式,节点服务器配置私网IP,负载均衡器配置一个VIP(VIRTUAL IP外网IP),客户机请求
先到负载均衡器,负载均衡器按照不同算法把请求分配到各节点服务器,节点服务器处理完成后再发给
负载均衡器,最后由负载均衡器把结果返回给用户。
& &&&real server和director必须在同一子网
& &&&Real server配置私网IP,网关指向Director
& &&&Director同时处理入站和出站连接
& &&&可以实现端口映射
& &&&Real server可以是任意操作系统
& &&&Director容易成为性能瓶颈
优点:节省IP
LVS/TUN:隧道模式,节点服务器配置公网IP(可以不在一个WAN),负载均衡器也是公网IP,客户机请求先到负载均衡器,负载均衡器通过IPIP协议把客户机的请求得重新封包,然后按照不同算法把请求分配到各节点服务器,各节点服务器拆IPIP包,然后根据包里客户机的地址信息将结果直接回复给客户端,回应请求的时候,不经过负载均衡器。
& &&&Real server跟director不需要在同一个物理网络中
& &&&RIP一定不能是私有地址
& &&&Director仅处理入站请求
& &&&Real server的网关一定不能指向Director
& &&&不支持端口映射
& &&&仅有那些支持IP隧道协议的操作系统,才能用于Real server
LVS/DR:直接路由模式,节点服务器配置公网IP(必须在同一网段),负载均衡器配置公网IP,客户机请求先到负载均衡器,负载均衡器按照算法,选择合适的节点服务器,将请求包的MAC地址改写为目的服务器的MAC地址,再将此包广播到服务器节点所在的网段。每个服务器结点都设有一个虚拟的网络设备(LO:0),这个设备绑定了和均衡器一样的VIP,只是该设备并不响应对VIP的ARP解析。然后通过处理直接将数据包应答给客户。应答数据不通过负载均衡器。
& &&&Real server和Director必须在同一个物理网络
& &&&RIP可以使用公网地址
& &&&Director仅处理入站请求,Real server处理出站请求
& &&&Real server不能指向Director
& &&&不支持端口映射
& &&&大多数的操作都可以用于real server,隔离ARP
& &&&Director压力要小于LVS/NAT,性能较好
佩服!!!mexp 的BLOG
用户名:mexp
文章数:29
评论数:18
访问量:14184
注册日期:
阅读量:5863
阅读量:12276
阅读量:337953
阅读量:1041167
51CTO推荐博文
keepalived是一个C语言开发的,能够基于Linux基础架构提供一个HA实现的软件。HA是基于VRRP协议实现,可以为LVS、Nginx、HAProxy等实现的LB提供高可用。
下图是keepalived的软件架构图
主要核心模块:
Checkers:负责对Real Server进行健康检查。
VRRP栈:实现了VRRP协议,实现了vrrp_sync_group扩展,不依赖于LVS可以独立的使用。例如下面第一个实验keepalived+nginx反代。
IPVS Wrapper:将keepalived的控制数据转换成ipvs的规则
Netlink Reflector:设定VRRP VIPs。
2. 实验前提
搭建时间服务器
为192.168.23.0/24网络提供统一时钟,此网络中所有机器都开启ntpd守护进程,时间源指向192.168.23.123这台时间服务器。即在配置文件中server部分增加一条,并启动ntpd。
# vim /etc/ntp.conf
server 192.168.23.123
# service ntpd start
# chkconfig ntpd on
3. 高可用反向代理
这里使用LNNMP,在第一级N上实现反向代理的高可用。实验中上游服务器用2台nginx的WEB服务器,Mysql和PHP略去。LNNMP可以参照博文《》。
3.2 keepalived的安装
CentOS6.4之后就已经收录了keepalived,因此直接可以yum安装。
# yum Cy install keepalived
# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf
/etc/rc.d/init.d/keepalived
/etc/sysconfig/keepalived
/usr/sbin/keepalived
可以看到默认的一个配置文件已经放在了/etc/keepalived下,只要对其根据规划修改就可以了。
3.3 各服务器配置
3.3.1 WEB1配置
nginx.conf
# vim /usr/local/nginx/conf/nginx.conf
/var/run/nginx.
/var/log/nginx/error.
worker_connections
default_type
application/octet-
log_format
'$remote_addr - $remote_user [$time_local] &$request& '
'$status $body_bytes_sent &$http_referer& '
'&$http_user_agent& &$http_x_forwarded_for&';
access_log
/var/log/nginx/access.
#keepalive_timeout
keepalive_timeout 5;
server_name
add_header X-upS
WEB1-$server_addr:$server_
#charset koi8-r;
#access_log
logs/host.access.
location / {
/web/nginx/
index.html index.
#error_page
# redirect server error pages to the static page /50x.html
error_page
500 502 503 504
location = /50x.html {
index.html
# vim /web/nginx/static/index.html
&title&static&/title&
&h1 align=&center&&OK! This is a static page of WEB1&/h1&
3.3.2 WEB2配置
nginx.conf
# vim /usr/local/nginx/conf/nginx.conf
/var/run/nginx.
/var/log/nginx/error.
worker_connections
default_type
application/octet-
log_format
'$remote_addr - $remote_user [$time_local] &$request& '
'$status $body_bytes_sent &$http_referer& '
'&$http_user_agent& &$http_x_forwarded_for&';
access_log
/var/log/nginx/access.
#keepalive_timeout
keepalive_timeout 5;
server_name
add_header X-upS
WEB2-$server_addr:$server_
#charset koi8-r;
#access_log
logs/host.access.
location / {
/web/nginx/
index.html index.
#error_page
# redirect server error pages to the static page /50x.html
error_page
500 502 503 504
location = /50x.html {
index.html
# vim /web/nginx/static/index.html
&title&static&/title&
&h1 align=&center&&OK! This is a static page of WEB2&/h1&
3.3.3 Proxy1(keepalived MASTER)
nginx.conf
# vim /usr/local/nginx/conf/nginx.conf
/var/run/nginx.
/var/log/nginx/error.
worker_connections
default_type
application/octet-
log_format
'$remote_addr - $remote_user [$time_local] &$request& '
'$status $body_bytes_sent &$http_referer& '
'&$http_user_agent& &$http_x_forwarded_for&';
access_log
/var/log/nginx/access.
#keepalive_timeout
keepalive_timeout 5;
upstream static {
server 192.168.23.80;
server 192.168.23.81:8080;
server 127.0.0.1:8080
add_header X-Proxy Proxy100-$server_addr:$server_
#charset koi8-r;
#access_log
logs/host.access.
location ~ \.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
location ~ \.(js|css)$ {
expires 1h;
location / {
proxy_pass http://
#error_page
# redirect server error pages to the static page /50x.html
error_page
500 502 503 504
location = /50x.html {
add_header X-Sorry
SorryServer-$server_addr:$server_
location / {
rewrite .* /maintenance.html break;
maintenance.html
# vim /usr/local/nginx/html/maintenance.html
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8& /&
&title&Sorry&/title&
&h1 align=&center&&Down for maintenance&/h1&
keepalived.conf
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PROXY_HA1
vrrp_instance VI_PROXY_HA {
state MASTER
interface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 192pass
virtual_ipaddress {
172.16.23.80
3.3.4 Proxy2(keepalived BACKUP)
nginx.conf
# vim /usr/local/nginx/conf/nginx.conf
/var/run/nginx.
/var/log/nginx/error.
worker_connections
default_type
application/octet-
log_format
'$remote_addr - $remote_user [$time_local] &$request& '
'$status $body_bytes_sent &$http_referer& '
'&$http_user_agent& &$http_x_forwarded_for&';
access_log
/var/log/nginx/access.
#keepalive_timeout
keepalive_timeout 5;
upstream static {
server 192.168.23.80;
server 192.168.23.81:8080;
server 127.0.0.1:8080
add_header X-Proxy Proxy101-$server_addr:$server_
#charset koi8-r;
#access_log
logs/host.access.
location ~ \.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
location ~ \.(js|css)$ {
expires 1h;
location / {
proxy_pass http://
#error_page
# redirect server error pages to the static page /50x.html
error_page
500 502 503 504
location = /50x.html {
add_header X-Sorry
SorryServer-$server_addr:$server_
location / {
rewrite .* /maintenance.html break;
maintenance.html
# vim /usr/local/nginx/html/maintenance.html
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8& /&
&title&Sorry&/title&
&h1 align=&center&&Down for maintenance&/h1&
keepalived.conf
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PROXY_HA2
vrrp_instance VI_PROXY_HA {
state BACKUP
interface eth0
virtual_router_id 10
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 192pass
virtual_ipaddress {
172.16.23.80
从以上配置可以看出,使用唯一的资源就是VIP 172.16.23.80。这些配置都非常的简单,这里不做解释。关于nginx的配置,可以参照博文《》。
为了区别,特意在nginx的代理服务器的配置中增加了header,2台代理是不一样的,这样在验证HA效果的时候可以判断是那一台代理服务器在工作。
(1) 开启backup节点
先开启Proxy2的nginx代理和keepalived服务,WEB1和WEB2的nginx的WEB服务。Proxy1的服务器暂不开启。
上图中,启动了backup的keepalived。由于只有它一个节点,因此它成为主节点,并配置VIP开始工作。
上面2图,使用了自定义的响应首部X-Proxy,说明了从172.16.23.80上80提供了代理,并轮询调度用户请求至上游服务器响应。
(2) 开启master节点
开启Proxy1的nginx代理和keepalived服务,由于Proxy1的优先级高,将成为名副其实的MASTER,将VIP资源夺回,配置在自身指定的接口上,同时Proxy2释放VIP资源。
上图中master节点成为MASTER状态,配置VIP。
而backup节点成为BACKUP状态,并释放IP资源。
从首部信息看出,响应的代理服务器实际上发生了变化,这个Nginx代理服务器编译时修改了版本信息,因此Server:MeXP/1.0.1,这说明是另一个Proxy提供的代理服务。由于使用同样的VIP对外提供服务,因此X-Proxy是一样的,当然这个也可以设置不一样。
依然实现对上游服务器的轮询调度。
从以上的测试中可以看到,VIP确实可以在不同的节点流动,但是有一个问题,如果nginx停止工作,VIP这个资源并不会转移,但是拥有VIP的节点实际上是不能提供WEB服务了。所以我们要增加对tcp 80端口的验证,只要WEB服务能够返回一个页面,或者能够返回状态码为200,就认为该节点正常,否则重新启动nginx或者迁移VIP资源。
下来对keepalived的配置文件做一些改进。
3.5 状态转换的通知机制
notify_master
specify a shell script to be executed during transition to master state
notify_backup
specify a shell script to be executed during transition to backup state
notify_fault
specify a shell script to be executed during transition to fault state
由上表可知,keepalived在做状态变化的时候,可以调用一个脚本。这样我们可以把处理nginx服务的逻辑放在里面。
我们要实现状态变成master,处理配置VIP还要启动nginx。其他状态都是移除VIP并关闭nginx。
以backup节点为例,其配置文件修改如下:
! Configuration File for keepalived
global_defs {
router_id PROXY_HA2
vrrp_instance VI_PROXY_HA {
state BACKUP
interface eth0
virtual_router_id 10
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 192pass
virtual_ipaddress {
172.16.23.80
notify_master &/etc/rc.d/init.d/nginx start&
notify_backup &/etc/rc.d/init.d/nginx stop&
notify_fault &/etc/rc.d/init.d/nginx stop&
这样,以后nginx启动的事情就可以交给keepalived来做了,所以在2台代理服务器上请停止nginx服务,并设置成开机不启动。
# service nginx stop
# chkconfig nginx off
现在服务跟着主节点走,VIP也跟着主节点走。
还是有一个问题,如果代理服务器上的nginx自己关闭了,怎么办?
检测主节点nginx进程,如果失败就将权重减去一个大值,这样backup节点就提升为一个主节点,原主节点降为backup节点后会重启nginx服务,一旦启动成功,其权重恢复,这样重新投票它将重新获得主节点地位。
master节点
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id PROXY_HA1
vrrp_script chk_nginx {
script &killall -0 nginx&
interval 1
vrrp_instance VI_PROXY_HA {
state MASTER
interface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 192pass
track_script {
virtual_ipaddress {
172.16.23.80
notify_master &/etc/rc.d/init.d/nginx start&
notify_backup &/etc/rc.d/init.d/nginx restart&
notify_fault &/etc/rc.d/init.d/nginx stop&
backup节点
! Configuration File for keepalived
global_defs {
router_id PROXY_HA2
vrrp_script chk_nginx {
script &killall -0 nginx&
interval 1
vrrp_instance VI_PROXY_HA {
state BACKUP
interface eth0
virtual_router_id 10
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 192pass
track_script {
virtual_ipaddress {
172.16.23.80
notify_master &/etc/rc.d/init.d/nginx start&
notify_backup &/etc/rc.d/init.d/nginx restart&
notify_fault &/etc/rc.d/init.d/nginx stop&
看看测试的效果,在BACKUP节点观察
上图中首先启动BACKUP节点,它进入MASTER状态配置了VIP后,调用了/etc/rc.d/init.d/nginx脚本启动nginx服务。
随后,启动MASTER节点,BACKUP节点转入BACKUP状态,移除VIP,调用了/etc/rc.d/init.d/nginx脚本停止nginx服务。
4. 高可用LVS
使用VS/NAT完成。
和上例的规划图非常相似,只不过keepalived内部集成IPVS Wrapper。
因此需要修改master和backup的配置文件。注意如果在上例的基础上做,因为nginx代理监听tcp 80端口,为了避免引起疑惑,还是把nginx停止或移除较好。
注:本实验中ipvs也要检查发往80端口的数据,但是这和上例实验本质是不同。因为ipvs在内核中就已经把数据报文截获,并处理转发。
4.2 网关设置
使用VS/NAT模型,LVS中Director做的是DNAT,所以要在内网主机上WEB1、WEB2、sorry server上配置路由,但是因为2个keepalived节点上的内网地址不同,路由实际上也是变化的,如何做呢?
可以在master和backup上配置同一个内网地址资源192.168.23.105,这个资源和VIP一样是跟随着主节点的,并使它成为这几台为外部提供WEB服务的主机网关,因此配置接口增加网关配置。
在内网主机上配置网关,如下:
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=192.168.23.105
4.3 ipvsadm的安装
安装ipvsadm是为了验证keepalived是否加入了规则,ipvsadm其实可以不安装
# yum -y install ipvsadm
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-& RemoteAddress:Port
Forward Weight ActiveConn InActConn
可以看到没有任何规则
提供测试页、计算测试网页的md5值
# cd /web/nginx/static/
# vim test.html
Just test for WEB1
# md5sum test.html
60f16b089b6c69717ffdd41fc0896652
提供测试页、计算测试网页的md5值
# cd /web/nginx/static/
# vim test.html
Just test for WEB2
# md5sum test.html
4.6 master节点配置
keepalived的配置、开通主机路由
! Configuration File for keepalived
global_defs {
router_id PROXY_HA1
vrrp_sync_group VGM {
VI_LOCAL_ADDR
vrrp_instance VI_LOCAL_ADDR {
state MASTER
interface eth1
vs_sync_daemon_inteface eth1
virtual_router_id 11
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 168pass
virtual_ipaddress {
192.168.23.105
vrrp_instance VI_LVS_HA {
state MASTER
interface eth0
vs_sync_daemon_inteface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 192pass
virtual_ipaddress {
172.16.23.80
virtual_server 172.16.23.80 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 5
protocol TCP
sorry_server 192.168.23.121 8080
real_server 192.168.23.80 80 {
HTTP_GET {
path /test.html
digest 60f16b089b6c69717ffdd41fc0896652
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
real_server 192.168.23.81 8080 {
HTTP_GET {
path /test.html
digest be026078
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
# sed -i 's/net.ipv4.ip_forward =.*/net.ipv4.ip_forward = 1/' /etc/sysctl.conf
# sysctl Cp
4.7 backup节点配置
keepalived的配置文件、开通主机路由
! Configuration File for keepalived
global_defs {
router_id PROXY_HA2
vrrp_sync_group VGM {
VI_LOCAL_ADDR
vrrp_instance VI_LOCAL_ADDR {
state BACKUP
interface eth1
lvs_sync_daemon_inteface eth1
virtual_router_id 11
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 168pass
virtual_ipaddress {
192.168.23.105
vrrp_instance VI_LVS_HA {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 10
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 192pass
virtual_ipaddress {
172.16.23.80
virtual_server 172.16.23.80 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 5
protocol TCP
sorry_server 192.168.23.121 8080
real_server 192.168.23.80 80 {
HTTP_GET {
path /test.html
digest 60f16b089b6c69717ffdd41fc0896652
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
real_server 192.168.23.81 8080 {
HTTP_GET {
path /test.html
digest be026078
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
# sed -i 's/net.ipv4.ip_forward =.*/net.ipv4.ip_forward = 1/' /etc/sysctl.conf
# sysctl Cp
4.8 sorry server配置
nginx的配置,并启动。maintenance.html内容已将在上面提供过了。
/var/run/nginx.
/var/log/nginx/error.
worker_connections
default_type
application/octet-
log_format
'$remote_addr - $remote_user [$time_local] &$request& '
'$status $body_bytes_sent &$http_referer& '
'&$http_user_agent& &$http_x_forwarded_for&';
access_log
/var/log/nginx/access.
#keepalive_timeout
keepalive_timeout 5;
add_header X-Sorry
SorryServer-$server_addr:$server_
location / {
rewrite .* /maintenance.html break;
先启动backup节点,后启动master节点,看看backup节点的变化
可以看到直接是由后端的real server响应的。其他测试不再赘述。
4.10 keepalived节点究竟做了什么?
keepalived的MASTER状态的节点获得VIP,同时它也成为了LVS的director,并且做DNAT后,把客户端数据发送至后端服务器,后端服务器响应请求,并发送数据给网关director,由网关替换源地址为VIP后,将数据发往客户端。
2) VRRP协议心跳
keepalived所有节点都在向组播地址发心跳包
3) 健康状态检测
不断的向内网探测后端服务器的健康状况,这里是用访问测试页并用其md5值来判断。这样的好处是,真正由WEB服务返回数据,比ping服务器、监控WEB服务的方式好。因为ping通一台主机或者监控web服务进程存在不能说明web服务能够真正的提供服务。
4.11 sorry server
将WEB1和WEB2上的测试网页test.html改名,2台keepalived节点的测试发现test.html找不到了,认为real server故障,便移除2台real server,最后只能指向sorry server。
[ 抓包分析 ]
可以看到对index.html的请求转向了192.168.23.121的8080来响应,返回维护页面。
对测试页面test.html的访问返回了404错误,找不到test.html了。因此keepalived就在ipvs中把WEB1和WEB2的调度移除,加入sorry server。
至此基于keepalived完成VS/NAT模型的高可用实验。
可以看出,在NAT模式下,数据做了DNAT后,发往Real Server,所以服务器必须指定网关或路由,但是由于HA集群中当前为master的节点不一定,所以也不清楚究竟哪一个内网地址可以作为网关,因此再引入一个网关IP地址资源,让它跟随着master节点迁移,而网关指向这个地址就可以了。这样就能保证数据一般情况下会从来路返回给客户端。
keepalived对测试页面的HTTP_GET测试,使用的是内网地址,按照配置的策略不断测试。只要keepalived启动,不管是否是主从节点,都会进行测试。
5. 进阶双主模型
这里就有了一个大的麻烦,为了解决数据报文的原路返回,使用了一个内网地址的资源192.168.23.105。
如果做成一个双主模型,势必内网地址也得有2个,这样内网中上游服务器的路由又没有办法配置路由了。因为上游服务器返回数据的时候一定要原路返回,而上游服务器发出的包的目标地址是客户端IP,不是Director,所以上游服务器不知道从哪一个Director进来的,该发回给哪一个Director,因为只有在进来的Director上通过连接追踪才能替换源地址为VIP,并把数据包转发给客户端。
如何解决呢?
(1)VS/FullNAT
淘宝实现FullNAT的并提供出来。
根据目前淘宝大侠们的提供的信息,使用LVS FullNAT要向特定版本内核打补丁,重新编译内核。编译其提供的ipvsadm和keepalived。
目前还没有完全调试完成。所以后续博文中将实现LVS的FULLNAT + Keepalived + nginx(WEB) 双主模型高可用实验。
(2)VS/DR
可以使用DR模型,客户端请求在前端被DNS调度到不同的keepalived的节点,这里是2个主节点,每一个主节点都把请求调度到上游服务器,上游服务器响应后,直接把响应的结果发个这个内网中某个路由器(包括网关),这个路由器能把数据发给下一跳路由器,就这样数据返回到了客户端。
DR模型实现起来也不用像NAT模型那样需要配置内网的VRRP地址且让数据从Director原路返回。
本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 nginx lvs 负载均衡 的文章

 

随机推荐