码迷,mamicode.com
首页 > 系统相关 > 详细

lvs(linux virtual server)、keepalived

时间:2018-08-15 10:35:40      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:衡量   轮询   术语   rest   构建   server   .sh   解析   问题   

Linux Cluster:

httpd: ab, ?benchmark;

系统的扩展方式:
Scale up:向上扩展;
×××能更好的服务器替代现有的服务器;
Scale out:向外扩展;
提供更多的服务器来满足同一个需求;

集群:将多台主机组织起来满足某一特定需求;

集群类型:
1、LB:Load Balancing, 负载均衡集群;
负载均衡器,调度器;
上游服务器(upstream server),后端服务器,“真”服务器(real server);
SPOF:Single Point Of Failure

2、HA:High Avalilability, 高可用集群;
Active:活动服务器
Passive:备用服务器

Availability = 平均无故障时间/(平均无故障时间+平均修复时间)
增大分子
减小分母:降低平均修复时间;
冗余:

90%, 95%, 99%, 99.9%, 99.99%, 99.999%

3、HP:High Performance:高性能集群
www.top500.org

DS:Distributed System
hadoop:
mapreduce
hdfs

LB集群的实现:
硬件:
F5 BIG-IP
Citrix Netscaler
A10 A10
Array
Redware
软件:
lvs: Linux Virtual Server
haproxy
nginx
ats (apache traffic server)
perlbal

基于工作的协议层次划分:
传输层:
lvs, haproxy (mode tcp)
应用层:
haproxy (mode http), nginx, ats, perlbal

HA集群的实现:
keepalived:通过实现vrrp协议来实现地址漂移;
AIS:
heartbeat
cman+rgmanager (RHCS: redhat cluster suite)
corosync+pacemaker

系统构建:分层、分割
分布式:应用、数据、存储、计算

lvs:Linux Virtual Server

layer 4:四层交换,四层路由;
根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法);

lvs工作于director的netfilter表的INPUT链,其数据流向PREROUTING------>INPUT------->POSTROUTING

lvs集群的术语:
vs:Virtual Server
Director, Dispatcher, Balancer
rs:Real Server

CIP: Client IP
Director Virtual IP: VIP
Directory IP: DIP
Real Server IP: RIP

负载均衡集群中设计时的要点:
(1) session保持;
session 绑定(sticky) (source ip hash);
session 集群(cluster) (multicast/broadcast/unicast);
session 服务器 (server);
(2) 数据共享;
共享存储;
NAS:Network Attached Storage (文件级别);
SAN:Storage Area Network (块级别);
DS:Distributed Storage;
数据同步:
rsync
...

lvs的类型:
lvs-nat
lvs-dr (direct routing)
lvs-tun (ip tunneling)
lvs-fullnat (同时改变请求报文的源IP和目标IP)

注意:前三种为标准类型;fullnat为后来添加的类型,内核默认可能不支持;

lvs-nat:
多目标的DNAT:通过将请求报文的目标地址和目标端口修改为挑选出某RS的RIP和PORT来实现;

(1) RIP和DIP应该使用私网地址,RS的网关应该指向DIP;
(2) 请求和响应报文都要经由director转发;极高负载的场景中,Director可能会成为系统瓶颈;
(3) 支持端口映射;
(4) VS必须为Linux,RS可以是任意的OS;
(5) RS的RIP与Director的DIP必须在同一IP网络;

lvs-dr:direct routing
通过修改请求报文的MAC地址进行转发;IP首部不会发生变化(源IP为CIP,目标IP始终为VIP);

(1) 确保前端路由器将目标IP为VIP的请求报文一定会发送给Director;
解决方案:
1、静态绑定;
2、禁止RS响应VIP的ARP请求;
(a) arptables;
(b) 修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;
(2) RS的RIP可以使用私有地址,也可以使用公网地址;
(3) RS跟Director必须在同一物理网络中;
(4) 请求报文必须由Director调度,但响应报文必须不能经由Director;
(5) 不支持端口映射;
(6) 各RS可以使用大多数的OS;

lvs-tun:ip tunneling,ip隧道;
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原有的IP首部之外再次封装一个IP首部(源IP为DIP,目标IP为RIP);

(1) RIP,DIP,VIP全得是公网地址;
(2) RS的网关不能也不可能指向DIP;
(3) 请求报文经由Director调度,但响应报文将直接发给CIP;
(4) 不支持端口映射;
(5) RS的OS必须支持IP隧道功能;

lvs-fullnat:
通过同时修改请求报文的源IP地址(cip-->dip)和目标IP地址(vip --> rip)实现转发;

(1) VIP是公网地址;RIP和DIP是私网地址,且可以不在同一IP网络中,但需要通过路由互相通信;
(2) RS收到的请求报文的源IP为DIP,因此其响应报文将发送给DIP;
(3) 请求报文和响应报文都必须经由director;
(4) 支持端口映射;
(5) RS可使用任意OS;

lvs scheduler:调度算法
a、静态方法:仅根据算法本身进行调度;
RR:round robin, 轮调,轮询,轮叫;
WRR:weighted rr, 加权轮询;
SH:source ip hash, 源地址哈希;实现session保持的机制;将来自于同一个IP的请求始终调度至同一RS;
DH:desination ip hash, 目标地址哈希;提高缓存命中的机制(lvs不支持);将对同一个目标的请求始终发往同一个RS;

b、动态方法:根据算法及各RS的当前负载状态(Overhead)进行调度;
LC:least connection,最少连接;Overhead=Active256+Inactive
WLC: weighted LC,加权最少连接;Overhead=(Active
256+Inactive)/weight
SED:Shortest Expection Delay,最短期望延迟;Overhead=(Active+1)*256/weight
NQ: Nerver Queue,永不排队
LBLC:Locality-Based LC,即为动态的DH算法;正向代理情形下的cache server调度;
LBLCR:LBLC with Replication,带复制功能的LBLC;

lvs:
ipvsadm/ipvs
ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
ipvs:工作于内核上的netfilter INPUT钩子之上的程序代码;
其集群功能依赖于ipvsadm定义的集群服务器规则;
支持基于TCP,UDP,SCTP,AH,ESP,AH_ESP等协议的众多服务;

(1)一个ipvs主机可以同时定义多个cluster service;
(2)一个cluster service上至少应该有一个real server;
定义时,指明lvs-type,以及lvs scheduler;

管理集群服务:
ipvsadm ?-A|E ?-t|u|f ?service-address ?[-s scheduler]
ipvsadm ?-D ?-t|u|f service-address
-A:添加
-E:修改
-D:删除

service-address:
tcp:-t ?vip:port
udp:-u ?vip:port
fwm:-f ? ?MARK

-s scheduler:默认为wlc;

管理集群服务上的RS:
ipvsadm -a|e ?-t|u|f service-address -r server-address [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
-a:添加一个RS
-e:修改一个RS
-d:删除一个RS

server-address:
rip[:port]

-g:lvs-dr模型(默认)
-i:lvs-tun模型
-m:lvs-nat模型

查看:
ipvsadm -L|l [options]
-n:numeric,数字格式显示地址和端口;
-c:connection,显示ipvs连接;
--stats:统计数据;
--rate:速率
--exact:精确值

清空规则:
ipvsadm ?-C

保存和重载:
保存:
ipvsadm -S ?> /PATH/TO/SOME_RULE_FILE
ipvsadm-save ?> /PATH/TO/SOME_RULE_FILE

重载:
ipvsadm ?-R < /PATH/FROM/SOME_RULE_FILE
ipvsadm-restore < /PATH/FROM/SOME_RULE_FILE

计数器清零:
ipvsadm ?-Z ?[-t|u|f service-address]

fwm:firewall mark

ipvsadm -A|E -t|u|f service-address [-s scheduler]
-t, -u: service-address
ip:port
-f: service-address
firewall mark

iptables的功能:
filter, nat, mangle, raw

mangle:
target: MARK
--set-mark value[/mask]

基于fwm定义集群服务的步骤:
(1) 打标

iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $serviceport -j MARK --set-mark

#:整数
(2) 定义集群服务

ipvsadm -A -f # [-s scheduler]

lvs persistence:持久连接;在定义集群服务时附加上 ?-p ?#
功能:无论ipvs使用何种scheduler,其都能够实现在指定时间范围内始终将来自同一个ip地址的请求发往同一个RS;此功能是通过lvs持久连接模板实现,其与调度方法无关;

ipvs持久连接的模式:默认时间为5分钟
每端口持久(PPC):单服务持久调度
每FWM持久(PFWMC):单防火墙标记(FWM)持久调度
每客户端持久(PCC):定义tcp或udp协议的0号端口为集群服务端口;director将用户的任何请求都识别为集群服务,并向RS进行调度
示例:

ipvsadm -A -t 172.20.120.71:0 -s rr -p

ipvsadm -a -t 172.20.120.71:0 -r 172.20.120.41 -g

ipvsadm -a -t 172.20.120.71:0 -r 172.20.120.42 -g

示例lvs-nat模型:拓扑图如下所示;要点:1、请求和响应报文都经由director;2、各RS网关必须指向dip;
?
director:

ipvsadm -A -t 172.20.120.40:80 -s rr

ipvsadm -a -t 172.20.120.40:80 -r 192.168.20.11 -m

ipvsadm -a -t 172.20.120.40:80 -r 192.168.20.12 -m

示例lvs-dr模型:拓扑图如下;要点:1、请求报文经由director,响应报文直接由各rs响应;2、各rs由于都有vip,因此需要解决arp广播跟arp回应的问题;3、请求报文到达director,通过修改mac地址到达挑选后的realserver;4、director跟各rs在同一物理网络中;

director:

ifconfig eno16777736:0 172.20.120.71/32 up

route add -host 172.20.120.71 dev eno16777736:0

ipvsadm -A -t 172.20.120.71:80 -r ss

ipvsadm -a -t 172.20.120.71:80 -r 172.20.120.41 -g

ipvsadm -a -t 172.20.120.71:80 -r 172.20.120.42 -g

各rs:脚本如下lvs-dr.sh
#!/bin/bash
vip=172.20.120.71
interface=lo

case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $interface:0 $vip/32 up
route add -host $vip dev $interface:0
;;
stop)
route del -host $vip dev $interface:0
ifconfig $interface:0 dow

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
esac

另外一种情况:vip跟rip不在同一网段

lvs HA功能:
director:在节点级别进行冗余;HA集群解决方案:keepalived;
real server:让director对其做健康状态检测,并且根据检测的结果自动完成添加或移除等管理功能;
健康时:online
非健康时:offline

1、如何对real server做健康状态检测:
(1) 网络层:探测主机的存活状态;icmp ping
(2) 传输层:探测端口的可用性;tcp ping
(3) 应用层:请求关键的某资源;curl

2、检查频率:

3、状态判断:
下线:ok --> failure --> failure --> failure ? ? ? ? ? ? ? ? ? ? ? rs: down
上线:failure --> ok --> ok ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rs: up

4、backup_server(sorry_server):即所有realserver都下线的情况,临时提供的web页面;

HA:提供冗余主机来提升系统可用性;
Availability=(MTBF)平均无故障时间/(平均无故障时间+平均修复时间(MTTR))
衡量值:95%,99%,99.9%,99.99%,99.999%

HA Cluster的实现方案:
1、vrrp协议的实现;keepalived
2、ais:完备的HA集群;heartbeat、corosync

keepalived是vrrp的实现,原生设计目的为ipvs服务提供高可用;
vrrp协议在Linux主机上以守护进程方式的实现; 能够根据配置文件生成ipvs规则,并对各RS的健康做检测;vrrp_script, vrrp_track;
?vrrp的术语:virtual redundant routing protocol 虚拟冗余路由协议
虚拟路由器、VRID(虚拟路由器的标识0-255)、Master、Backup、VIP、VMAC(00-00-5e-00-01-VRID)、优先级、抢占式、非抢占式;keepalived使用gratuitous arp(免费arp);
工作方式:抢占式、非抢占式
工作模式:主备、主/主(配置多个虚拟路由器)
认证方式:无认证、简单字符串认证(预共享密钥)、MD5认证

组件:
1、控制组件:配置文件分析器
2、内存管理
3、IO复用
4、核心组件:vrrp stack、checker、ipvs wrapper、watch dog

HA Cluster的配置前提(?keepalived):
1、各节点时间要同步;
ntp协议、chrony;
2、确保iptables及selinux不会成为障碍;
3、(keepalived可选)各节点之间可通过主机名互相通信;即名称解析服务的解析结果必须与“uname -n”命令的结果一致;
4、(keepalived可选)各节点之间的root用户可以基于密钥认证的ssh通信;

组播地址:224-239

安装keepalived:centos6.4+,程序包已在base源提供

yum install keepalived -y

主配置文件:/etc/keepalived/keepalived.conf
unit file:/usr/lib/systemd/systemd/keepalived.service,其配置文件/etc/sysconfig/keepalived
配置文件内容块分为三段:
1、全局配置段:global_defs { ?... ?}
2、VRRP配置段:
a、vrrp_sync_group ?GROUP_NAME ? ?{ ?... }
b、vrrp_instance ?INSTANCE_NAME ? ?{ ?... ?}
3、LVS配置段:virtual_server_group ?VSG_NAME ? ?{ ? ?... ? ?}
virtual_server ? IP ?PORT ?| ?fwmark ?int ? {
protocol ? TCP
...
real_server ?<IPADDR> ? <PORT> ? {
...
}
real_server ?<IPADDR> ? <PORT> ? {
...
}
}

全局配置:
global_defs {
notification_email {
...
}:收件人邮箱地址
notification_email_from:发件人邮箱地址
smtp_server:邮件发送服务器IP;
smtp_connect_timeout:邮件服务器建立连接的超时时长;
router_id LVS_DEVEL:物理节点的标识符;建立使用主机名;
vrrp_mcast_group4:IPV4多播地址,默认224.0.0.18;

VRRP实例配置:
vrrp_instance NAME {
...
}
常用配置:
state MASTER|BACKUP:在当前VRRP实例中此节点的初始状态;
interface ? IFACE_NAME:vrrp用于绑定vip的接口;
virtual_router_id ?#:当前VRRP实例的VRID,可用范围为0-255,默认为51;
priority #:当前节点的优先级,可用范围0-255;
advert_int 1:通告时间间隔;
authentication { ? ? # Authentication block 认证机制

PASS||AH

PASS - Simple Passwd (suggested)

AH - IPSEC (not recommended))

auth_type PASS

Password for accessing vrrpd.

should be the same for all machines.

Only the first eight (8) characters are used.

auth_pass 1234
}
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
}
track_interface{#定义要监控的接口
eth0
eth1

nopreempt:工作于非抢占模式(默认为抢占模式)

定义通知脚本:
vrrp_instance ?<String> ? {
...
notify_master ?<STRING>|<QUOTED-STRING>
notify_backup ?<STRING>|<QUOTED-STRING>
notify_fault ?<STRING>|<QUOTED-STRING>
notify ?<STRING>|<QUOTED-STRING>
}

示例脚本:
#!/bin/bash

Author: MageEdu

Description: An example of notify script

#
contact=‘root@localhost‘

notify() {
mailsubject="$(hostname) to be $1: vip floating"
mailbody="$(date +‘%F %H:%M:%S‘): vrrp transition, $(hostname) changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}

case $1 in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac

调用方法:
vrrp_instance <String> {
...
notify_master ?"/etc/keepalived/notify.sh master"
notify_backup ?"/etc/keepalived/notify.sh backup"
notify_fault ?"/etc/keepalived/notify.sh fault"
}
注意:要使用双引号;

ipvs服务定义方法:
虚拟服务器:
virutal_server ?vip ?port |
virtual_server fwmark int ?{
...
}

常用的参数:
delay_loop ?<INT> ? ?定义服务轮询时间间隔;
lb_algo ? rr|wrr|lc|wlc|lblc|sh|dh ? ?定义负载均衡调度方法;
lb_kind ?NAT|DR|TUN ? 定义集群的类型
persistence_timeout ?<INT> ? 持久连接时长;
protocol TCP ?服务协议;
sorry_server ?<IPADDR> ?<PORT> ?所有RS均故障时,提供say sorry的服务器;

定义RS的方法:
real_server <IPADDR> <PORT> ?{
...
}
常用的参数:
weight <INT> ?权重;
notify_up ?<STRING>|<QUOTED-STRING> 节点上线时调用的通知脚本;
notify_down ?<STRING>|<QUOTED-STRING> ?节点离线时调用的通知脚本;

HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
支持的所有健康状态检测方式;

健康状态检测机制
1、web应用层检测
HTTP_GET|SSL_GET
{
...
}
检测参数:
url ?{
path ?<STRING> 健康状态检测时请求的资源的URL;
status_code <INT> ? 基于页面的状态码进行健康状态判定;
digest <STRING>基于获取内容的摘要码进行健康状态判定;借助keepalived提供/usr/bin/genhash生成摘要码
nb_get_retry <INT>:get请求的重试次数;
delay_before_retry <INT>:两次重试之间的时间间隔;
connect_timeout <INTEGER>:连接超时时长,默认为5s;
connect_ip <IP ADDRESS>:向此处指定的地址发测试请求;
connect_port <PORT>:向此处指定的端口发测试请求;
bindto <IP ADDRESS>:指定测试请求报文的源IP;
bindport <PORT>:指定测试请求报文的源端口;
warmup <INT>:健康状态检测延迟;
}

2、传输层健康状态检测(tcp协议层)
TCP_CHECK
{
...
}
检测参数:
connect_timeout ?<INTEGER>

其它:
connect_ip <IP ADDRESS>
connect_port <PORT>
bindto <IP ADDRESS>
bind_port <PORT>

定义外部脚本来检测高可用功能依赖到的资源的监控
vrrp_script ?NAME ?{
script
interval
weight
}

在实例追踪定义脚本,用于作为实例的当前节点的监控机制
track_script {
NAME
}

监控关注的网络接口
track_interface {
IFACE_NAME
}

使用非抢占模式
nopreempt

使用延迟抢占模式
preempt_delay ?TIME

vrrp_script:自定义一个资源监控脚本;vrrp实例能根据脚本状态返回值来
公共定义,可被多个实例调用,因此定义在vrrp实例之外;

track_script:调用vrrp_script定义的脚本去监控资源;
定义在实例之内,调用事先定义好的vrrp_script;

脚本实例:通过检测httpd服务是否正常的返回值来减少weight,达到ip漂移。
vrrp_script chk_httpd {
? ? ? ?script "killall -0 httpd"
? ? ? ?interval 2
? ? ? ?weight -5
}
track_script {
? ? ? ? chk_httpd
? ? }

? ? 然后可以借助通知脚本进一步扩展功能;
? ? 调用方法:
vrrp_instance <String> {
...
notify_master ?"/etc/keepalived/notify.sh master"
notify_backup ?"/etc/keepalived/notify.sh backup"
notify_fault ?"/etc/keepalived/notify.sh fault"
}
注意:要使用双引号;

? ? 示例脚本:
#!/bin/bash

Author: MageEdu

Description: An example of notify script

#
contact=‘root@localhost‘

notify() {
mailsubject="$(hostname) to be $1: vip floating"
mailbody="$(date +‘%F %H:%M:%S‘): vrrp transition, $(hostname) changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}

case $1 in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac

lvs(linux virtual server)、keepalived

标签:衡量   轮询   术语   rest   构建   server   .sh   解析   问题   

原文地址:http://blog.51cto.com/11476314/2159896

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!