LVS

keepalived配置文件参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[getui@bjmjq-service-10-9 ~]$ cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
router_id bjmjqWeb
}

vrrp_instance VI_1 {
state BACKUP #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface bond0 #指定HA监测网络的接口
virtual_router_id 119 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 90 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass mimazaizhe #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
10.16.10.248
10.16.10.249
10.16.10.247
10.16.10.246
10.16.10.244
}
}

virtual_server 10.16.10.248 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
delay_loop 6 #设置运行情况检查时间,单位是秒
lb_algo wlc #设置负载调度算法,这里设置为rr,即轮询算法
lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
nat_mask 255.255.255.0
persistence_timeout 0 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
#有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
#需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作
#那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制
protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server 10.16.10.2 80 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
#分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源
TCP_CHECK { #realserver的状态检测设置部分,单位是秒
connect_timeout 3 #表示3秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 80
}
}

选举策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、keepalived集群中MASTER和BACKUP角色选举策略:
在keepalived集群中,其实并没有严格意义上的主备节点,虽然可以在配置文件中设置MASTER状态,但是这并不意味着此节点一直就是MASTER状态。控制节点角色的是配置文件中的priority值,但它并不控制所有节点的角色,另一个能改变角色的是在vrrp_script模块中设置的weight值,这两个选项的值嗾使整数值(weight可以为负整数),一个节点在集群中的角色就是通过这两个值的大小决定的;在vrrp_script模块中,如果不设置weight的值,那么集群优先级的选择将由配置文件中的priority值决定;

2、使用vrrp_script模块时集群角色的选举算法

(1)weight值为正数时
在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值将是weight值与priority值之和;如果检测失败,那么MASTER节点的权值保持为priority值,因此,切换策略为:

MASTER节点vrrp_script脚本检测失败时,如果MASTER节点priority值小于BACKUP节点weight值与priority值之和,将发生主备切换;
MASTER节点vrrp_script脚本检测成功时,如果MASTER节点weight值与priority之和大于BACKUP节点weight值与priority值之和,主节点依然为主节点,不发生切换;

(2)weight值为负数时
在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值仍是priority值;如果检测失败,那么MASTER节点的权值将是priority值与weight值之差,因此,切换策略为:

MASTER节点vrrp_script脚本检测失败时,如果MASTER节点priority值与weight值之差小于BACKUP节点的priority值,将发生主备切换;
MASTER节点vrrp_script脚本检测成功时,如果MASTER节点priority值大于BACKUP节点priority值时,主节点依然为主节点,不发生切换;

LVS+nginx+keepalived搭建详情

ipvsadm命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# ipvsadm -Ln --rate  显示状态以及每个后端服务器的连接速率
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 10.10.14.248:5266 4 2182 0 4925261 0
-> 10.10.14.8:5266 0 102 0 171532 0
-> 10.10.14.9:5266 0 529 0 1183525 0
-> 10.10.14.12:5266 0 1034 0 2654307 0
每个后端服务器的连接速率:
Prot:协议类型(这里是 TCP)。
LocalAddress:Port:本地监听地址和端口。
CPS:每秒连接数(Connections Per Second)
InPPS:每秒接收数据包数(Incoming Packets Per Second)
OutPPS:每秒发送数据包数(Outgoing Packets Per Second)
InBPS:每秒接收字节数(Incoming Bytes Per Second)
OutBPS:每秒发送字节数(Outgoing Bytes Per Second)
# ipvsadm -Ln --stats 统计信息
IP Virtual Server version 1.2.1 (size=1048576)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.10.14.248:5266 110476 24749746 0 42308M 0
-> 10.10.14.8:5266 0 2179689 0 3403M 0
-> 10.10.14.9:5266 11 6132329 0 10738M 0
-> 10.10.14.12:5266 0 8691689 0 17337M 0
-> 10.10.14.25:5266 11 4839854 0 7719M 0
-> 10.10.14.27:5266 37694 934186 0 999095K 0
-> 10.10.14.28:5266 50412 1414498 0 1552M 0
-> 10.10.14.29:5266 22370 558285 0 557957K 0
#统计信息 (--stats):
Conns:连接数,表示当前连接到该服务的连接数总和。
InPkts:接收的数据包数量总和。
OutPkts:发送的数据包数量总和。
InBytes:接收的字节数总和。
OutBytes:发送的字节数总和。

#ipvsadm -Ln 当前情况

lvs中ipvsadm的ActiveConn和InActConn的深入理解

1
2
ActiveConn是活动连接数,也就是tcp连接状态的ESTABLISHED;InActConn是指除了ESTABLISHED以外的,所有的其它状态的tcp连接.那既然这样,为什么从lvs里看的ActiveConn会比在真实机上通过netstats看到的ESTABLISHED高很多呢?问得好!这也是笔者一直迷惑而渐渐清晰的一个问题.原来lvs自身也有一个默认超时时间.可以用ipvsadm -L --timeout查看,默认是900 120 300,分别是TCP TCPFIN UDP的时间.也就是说一条tcp的连接经过lvs后,lvs会把这台记录保存15分钟,而不管这条连接是不是已经失效!所以如果你的服务器在15分钟以内有大量的并发请求连进来的时候,你就会看到这个数值直线上升.
其实很多时候,我们看lvs的这个连接数是想知道现在的每台机器的真实连接数吧?怎么样做到这一点呢?其实知道现在的ActiveConn是怎样产生的,做到这一点就简单了.举个例子:比如你的lvs是用来负载网站,用的模式是dr,后台的web server用的nginx.这时候一条请求过来,在程序没有问题的情况下,一条连接最多也就五秒就断开了.这时候你可以这样设置:ipvsadm --set 5 10 300.设置tcp连接只保持5秒中.如果现在ActiveConn很高你会发现这个数值会很快降下来,直到降到和你用nginx的status看当前连接数的时候差不多.你可以继续增加或者减小5这个数值,直到真实机的status连接数和lvs里的ActiveConn一致.