大家好,又见面了,我是你们的朋友全栈君。
集群是一种并行或分布式系统,该系统包括一个互联的整体计算机集合作为一种单一 统一的计算资源使用。通过集群技术。我们可以在付出较低成本的情况下获得在性能可靠性灵活性更高的收益。 计算机集群简称集群。是一组计算机系统。通过松散集成的计算软件和硬件连接起来。高度紧密的协作完成计算相关工作。 集群 是指一组互相独立的计算机,利用高速通信网络组成的一个计算机系统。每个集群节点(每个计算机)都是运行其自己进程的一个独立服务器,这些进程之间可以彼此痛惜in。对网络客户机来说就像是形成了一个单一的系统,协同起来向用户提供应用程序、系统资源和数据,并以单一系统的模式加以管理。一个客户机与集群相互作用时,集群像是一个独立的服务器,而实际上是一组服务器。
lvs集群
为什么要使用集群 集群高性能。低成本。可扩展性。高可靠性。 性能 性价比 可伸缩性 透明性
集群的分类 负载均衡集群 压力平摊处理。每个节点承受的访问请求做到负载均衡。可以同时具有高可用和负载均衡集群,将前端负载均衡器分发到后端服务器上。 高可用集群 一个节点失效,会转移到其他节点上。不会影响整个集群的运行
常用的集群软硬件 软件:lvs keepalived haproxy nginx apache heartbeat 硬件:F5 Netcaler Radware 如何选择呢? 大企业:就用上述的硬件负载均衡器,或者硬件加软件。 中小企业:使用开源免费的解决方案。
lvs 负载均衡器集群介绍
搭建负载均衡器的需求 负载均衡集群提供了一种廉价有效透明的方法。开扩展网络设备和服务器的带宽,吞吐量增强网络数据处理能力、提高网络的灵活性和可用性。
搭建负载均衡服务的需求:
(1) 把单台计算机上无法承受的大规模的并发访问或者数据流量分担到多台设备上处理。减少用户等待响应的时间,提示用户体验。 (2) 单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后。将结构汇总,返回给用户。系统处理能力得到大幅度提高 (3) 7*24的服务保证。任意一个或多个节点宕机,不会影响业务 负载均衡集群中,所有计算机节点都会提供相同的服务。尽可能平均在所有集群节点上。
LVS 是linux virtual server 简写。linux虚拟服务器。是一个虚拟的服务器集群系统。可以实现linux上负载均衡集群功能。
ipvsadm ipvs
lvs负载均衡调度技术是在linux内核中实现的。因此并称之为linux虚拟服务器。
工作原理: lvs集群负载平衡器接受服务的所有入站客户端计算机请求。并根据调度算法决定哪个集群节点应该处理回复请求。LB lVS Director 一组服务器通过告诉局域网或者广域网连接。通过负载调度器。 实现无缝调度到真实服务器上。
VIP 虚拟ip地址 Director用于向客户端计算机提供服务的ip地址 RIP 真实ip地址 在集群下面节点上使用的ip地址 DIP Director的ip地址 用于连接内外网络的ip地址 CIP 客户端主机ip地址 客户端用户计算机请求集群服务器的ip地址。该地址用作发送给集群的请求的源ip地址。
lvs集群内部的节点称为真实服务器real server 。也叫做集群节点。请求集群服务的计算机成为客户端计算机,与计算机通常在网上交互数据包的方式相同。客户端计算机directory和真实服务器使用ip地址彼此进行通信。
lvs负载均衡集群的3中工作模式介绍。
ip虚拟服务器软件ipvs 在调度器的实现技术中。ip负载均衡技术是效率最高的。在已有的ip负载均衡技术中有通过网络地址转换 将一组服务器构成一个高性能的高可用的虚拟服务器。我们称之为VS/NAT技术。大多数商品化的ip负载均衡调度器产品都是使用此方法。 在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们通过ip隧道实现虚拟服务器的方法VS/TUN和通过直接路由器实现虚拟器的方法VS/DR。它们可以极大提高系统的伸缩性,所以ipvs实现了这三种ip负载均衡技术。大致原理如下。
NAT模式-网络地址转换 通过网络地址转化。调度器重写请求报文的目标地址。根据预设的调度算法。讲请求分派给后端的真实服务器。服务器的相应报文通过调度器时。报文的源地址被重写。并返回给客户。 来去都要经过负载均衡器。处理服务器台数 10 -20 。 修改目的地址端口或源地址源端口。
TUN模式 隧道模式 调度器把请求报文通过ip隧道ipip ipsec转发至真实服务器。而真实服务器将内容返回给客户。这样调度器只处理请求报文。采用TUN技术,可以提高系统的最大吞吐量10倍
DR 直接路由 改写请求报文的mac地址。讲请求发送到真实服务器。而真实服务器将响应直接发回给客户。 要求调度器与真实服务器都有一块网卡在同一物理网段上。 通过数据链路层。arp协议实现的。 是用的最多的一种模式。
三种的比较。 NAT TUN DR
lvs的调度算法。 决定了如何在这些汲取un节点之间工作符合。
代码语言:javascript复制rr
轮询调度。它讲请求依次分配不同的RS,也就是在RS中平均请求, 这种算法简单,只适合处理性能差不多的情况
wrr
加权轮询调度,它将依据不同的RS权值分配任务,权值较高的RS优先获得任务。分配大的连接数比较多。相同权值的rs得到相同数目的连接数。
dh
目的地址哈希调度以目的地址为关键字查找一个静态的hash表来获得需要的RS
sh
动态
wlc 加权最小连接数调度。
常用的 rr wlc wrr
ARP 地址解析协议。 根据ip地址查询目标设备的mac地址。
ARP代理ARP Proxy
不再同一个局域网中。知道mac地址。也不能直接通信。必须经过路由器或arp中继等技术转发才可以。此时发送主机too你给过arp协议获得的将不是目的主机的真实mac地址。而是一台可以通往局域网外的路由器的某个端口的max地址。于是此后发送主机发送目的主机的所有帧,都将发往该路由器,通过路由器或arp中继向外发送。这种情况称之为arp代理。
arp协议要求通信主机双方必须在同一个物理网段。局域网环境。
directory route 直接路由 cip发到vip, directoyr使用相同的vip目的ip地址。将请求发送到集群节点或者真实服务器。 然后,节点回复该数据包。并将该数据包直接发送给客户端计算机。 并且以此回复数据包使用的目的vip地址作为源ip地址。实际上是客户计算机被欺骗了。实际上它发送请求给了一台计算机LB 并从另一台计算机RS接受回复的数据包。
代码语言:javascript复制在RS上要配置一个vip的loopback device 。这一RS服务器的ip层收到数据包报文并验证目的ip地址为RS本地IP后,才不会往上层传输,是因为loopback device是服务器本地使用的网络接口,对外是不可见的。不会更vip冲突。
特点:必须工作在统一网段。
客户端入站请求由director首先接受,并转发给集群节点rs。
集群节点rs,通常说最好带外部ip,而不是使用director及某固定机器作为默认网络。以便将数据包直接回复给客户端计算机。而不会产生回包的瓶颈。
所有集群节点RS上必须在lo网卡上绑定vip地址。带来的arp问题
,即集群节点rs默认会响应发往directory vip的数据包。因此要对所有集群节点做arp抑制处理。把响应vip请求交给lvs directory 抑制RS ARP响应。
安装及手工配置LVS DR集群。 需要三台服务器 适合于数据库及memcache等的负载均衡 192.168.1.180 lvs调度器 对外第同的vip为192.168.1.181 192.168.1.178 RS1 192.168.1.179 RS2
代码语言:javascript复制web 或webcache 负载均衡环境
外部ip 内部ip 角色 备注
192.168.1.180 10.0.0.180 lvs vip 192.168.1.181
192.168.1.178 10.0.0.178 RS1
192.168.1.179 10.0.0.179 RS2
生成环境中可以把外部地址换位公网ip。内部地址可保持不变。
代码语言:javascript复制配置简单的http服务。
178 和179上 分别写个简单网页。用于区别。
modprobe ip_vs 手动添加lvs转发。 设置在dns中。把域名指向虚拟ip
代码语言:javascript复制配置lvs虚拟ip
代码语言:javascript复制ifconfig eth0:0 192.168.1.181 netmask 255.255.255.0 up
ifconfig eth0:0
代码语言:javascript复制手工执行配置添加lvs服务并增加两台RS
ipvsadm -C
ipvsadm --set 30 5 60
ipvsadm -A -t 192.168.1.181:80 -s wrr -p 20
ipvsadm -a -t 192.168.1.181:80 -r 192.168.1.178 -g-w 1
ipvsadm -a -t 192.168.1.181:80 -r 192.168.1.179 -g-w 1
删除方法
ipvsadm -D -t 192.168.1.181:80 -s wrr
ipvsadm -d -t 192.168.1.181:80 -r 192.168.1.178:80
手工在RS端绑定VIP 在客户端RS上执行 ifconfig lo:181 192.168.1.181 netmask 255.255.255.0 route add -host 192.168.1.181 dev lo
手工在RS端抑制ARP 抑制ARP响应的方法
echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore 0默认值。回应任何网络接口上对任何本地ip地址的arp查询亲昵供求 1只回答目标ip地址是来访网络接口本地地址的arp请求
echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce 对网络接口上,本地ip地址发出的。ARP回应,作出相应级别的限制。 确定不同程度的限制,宣布对来自本地源ip地址发出ARP请求的接口 0默认。在任意网络接口上的任何本地地址 2 对查询目标使用适当的本地地址,在次模式下将忽略这个ip 数据包的源地址并尝试选择与能与该地址通信的本地地址,首要是选择 所有的网络接口的子网中外出访问子网中包含该目标ip地址的本地地址 如果没有合适的地址发现,将选择当前的发送网络接口或其他的 有可能接受到该ARP会应的网络接口来进行发送,限制了使用本地vip地址 作为优先网络接口。
echo “1”/proc/sys/net/ipv4/conf/all/arp_ignore echo “2”/proc/sys/net/ipv4/conf/all/arp_announce
可以写以写一个脚本:
代码语言:javascript复制#!/bin/bash
# this script is created by oldboy.
# e_mail:31333741@qq.com
# qqinfo:31333741
# function:
# version:1.1
. /etc/init.d/functions
VIP=192.168.1.181
SUBNET=eth0:`echo $VIP|cut -d. -f4`
PORT=80
GW=192.168.1.1
#w=3
RIP1=(
192.168.1.178
)
#w=1
RIP2=(
192.168.1.179
)
IFCONFIG=/sbin/ifconfig
ROUTE=/sbin/route
IPVSADM=/sbin/ipvsadm
ARPING=/sbin/arping
#functions
function usage (){
local script_name
script_name=$1
echo "Usgae : $script_name [ start | stop | restart ]"
echo ""
return 1
}
function checkCmd (){
if [ ! -f $1 ]; then
echo "Can't find "$1
return 1
fi
}
function checkSubnet (){
$IFCONFIG |grep "$1"|wc -l
}
function ipvsStart (){
#judge if $SUBNET is exist.
if [ $(checkSubnet $SUBNET) -ne 0 ]; then
$IFCONFIG $SUBNET down
fi
local rs
#$IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.255 up
$IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up
#$ROUTE add -host $VIP dev $SUBNET
$IPVSADM -C
$IPVSADM -A -t $VIP:$PORT -s wrr -p 60
for ((i=0; i<`echo ${#RIP1[*]}`; i ))
do
$IPVSADM -a -t $VIP:$PORT -r ${RIP1[$i]}:$PORT -g -w 1
done
for ((i=0; i<`echo ${#RIP2[*]}`; i ))
do
$IPVSADM -a -t $VIP:$PORT -r ${RIP2[$i]}:$PORT -g -w 1
done
rs=$?
$IPVSADM >/tmp/oldboy.log
# update MAC
NetIf=$(echo ${SUBNET}|awk -F ":" '{print $1}')
$ARPING -c 1 -I ${NetIf} -s $VIP $GW >>/tmp/oldboy.log
[ $rs -eq 0 ] && action "Ipvsadm start." /bin/true
return $rs
}
function ipvsStop (){
local rs
rs=1
#clean ipvs
$IFCONFIG $SUBNET down
$IPVSADM -C
$IPVSADM -Z
rs=$?
#$ROUTE del $VIP
$ARPING -c 1 -I ${NetIf} -s $VIP $GW >/dev/null 2>&1
[ $rs -eq 0 ] && action "Ipvsadm stoped." /bin/true
return $rs
}
main ()
{
#judge argv num by oldboy
if [ $# -ne 1 ]; then
usage $0
fi
case "$1" in
start)
ipvsStart
;;
stop)
ipvsStop
;;
restart)
ipvsStop
ipvsStart
;;
*)
usage $0
;;
esac
}
#start operating
main $*
keepalived
master 三个网卡 接口 ip 用途 eth0 200.166.188.107 用于wan数据转发
eth1 192.168.1.107 用于lan数据转发
eth2 192.168.2.107 用于LB间心跳连接,用网线直接连接。 vip 200.166.188.112 解析到www.han.com
backup eth0 200.166.188.106
eth1 192.168.1.106
eth2 192.168.1.106
vip
内外网部署的时候,最后能做到后八位一样。方便管理。
提供外围服务就把vip绑定在外网卡 提供对内的服务的时候。比如数据库等,就把服务绑定在内网卡上 。
安装ipvsadm keepalived rhel6.4直接可以yum安装。
可以打开转发,兼容haproxy等。
keepalived负载均衡问题排错思路参考 iptables问题 linux内核转发问题 RS端是否抑制ARP生效,是否绑定了VIP 确保RS可访问。三角形理论 haproxy 用户 webserver squid代理 用户 webserver 在lvs上wegt RS的内容。 ipvsadm -L -n 检查LVS真实服务器情况及VIP配置。 检查keepalived配置的不同 就三点不同。
代码语言:javascript复制部署的时候可能出现问题。
keepalived——vrrp
有可能是同样的实例id导致的。
自动化部署lvs负载均衡 。。。。。。。。。。。。。。
rs 把ipvs_client放到rc.local之后。但是重启网卡之后又会失效。
简单优化。以及生产环境的维护
lvs keepalived 部署问题排错思路 iptables防火墙问题
linux负载均衡器转发问题 DR模型可以不打开
RS端ARP抑制问题 ipvs_client
RS端lo上绑定业务VIP。多业务VIP,每个RS都要绑定REAL SERVER 可以用ipvs_client 支持多个VIP 端VIP RS端绑定
可以把lo网卡的写成一个网卡配置文件。那么在网络重启的时候lo也是存在的。
代码语言:javascript复制运维人员不要随便重启网卡。。。
确保CLIENT DIRECTOR RS三者之间任意两者的业务服务可以访问。 检查时可以用wget或者telent等命令。
负载均衡维护思路 业务高峰期间尽量不朽该负载均衡配置。
代码语言:javascript复制修改配置文件是要备份。
两个服务器上的要对比diff一下
先stop。将业务切到备份负载均衡器上。
然后在启动。如果发现不对。立即stop
lvs负载均衡器下的多台RS代码上线方案思路 一些集群节点php java 程序如何上下线
代码语言:javascript复制通过ipvsadm 命令机器下线
ipvsadm -d -t 192.168.1.181:80 -r 192.168.1.179:80
181是vip
通过url健康检查。然后,移走健康检查文件。这一directory会把rs下线。
lvs其他 lvs调度的最小单位是连接 当apache的keepalive被设置成off时,连接才能被均衡的调度 在不知定-p参数时,lvs才真正以连接为单位按权值调度流量。
代码语言:javascript复制在指定了-p参数时,则一个client在一定时间内。将会被调度到同一台RS
ipvsadm --set tcp tcpfin udp 来调整tcp和udp超时。让连接淘汰的快一点。
在nat模式下。rs的port参数才有意义。dr模式负载均衡无法做到端口的转换
在使用脚本部署lvs时。需要执行/sbin/arping -f -q -c 5 -w 5 -I eth0 -s vip -U gw ,在发生failover切换的时候通知服务器清空arp缓存。
keepalived方案切换的时候会内置自动发送send_arp命令。
lvs性能调优 关闭iptables 换硬件防火墙 针对大流量时。是性能瓶颈。
代码语言:javascript复制调整连接超时时间,就能承受更多的负载
内核优化
如果开启的话 ,iptables要进行相对应的优化。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163771.html原文链接:https://javaforall.cn