Keepalived服务器集群与负载均衡

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lmaosheng/article/details/88337616
[b]使用负载均衡技术主要的目的包括如下几点:[/b]

◆ 系统高可用性:

组成系统的某些设备或部件失效,并不会影响正常的服务。

◆ 系统可扩展性:

用户的增加,引起访问数乃至流量的增加,这种情形下,需要对系统进行扩容,以应对这种快速增长。对于提供高可用服务的互联网网站,其对可扩展的基本要求就是在保持系统服务不终止的情况下,透明的扩充容量,即用户不知道扩容的存在,或者说是扩容不对现有的服务产生任何负面作用。这些扩展主要包括:带宽扩展、服务器扩展、存储容量扩展、数据库扩展等,当然也包括主机增加内存等方面的扩展。

◆ 负载均衡能力:

一个应用或服务由数个物理服务器提供,并且每个物理服务器运行的应用或服务是相同的,我们可以让用户的访问通过某种控制策略,把负载分摊到不同的物理服务器,从而保持每个物理服务器有比较合理的负载。当整个系统的负载趋于饱和时,通过增加物理服务器和扩充物理带宽来解决这个麻烦。增加物理服务器以后,系统的负载情况将重新在所有集群的物理服务器之间按照指定的算法重新达到新的均衡。

一个完整的负载均衡项目,一般由虚拟服务器、故障隔离及失败切换3 个功能框架所组成。虚拟服务器是负载均衡体系的基本架构,它分两层结构:转发器(Director)和真实服务器。


[img]http://dl2.iteye.com/upload/attachment/0112/4594/b88c02dd-f12e-3ec9-af19-3fa0e5aeb727.png[/img]


为什么称虚拟服务器?因为从用户的角度看来,似乎只是一个服务器在提供服务。虚拟服务器最主要的功能是提供包转发和负载均衡,这个功能可以通过撰写ipvsadm 脚本具体实现。


故障隔离,指虚拟服务器中的某个真实服务器(或某几个真实服务器)失效或发生故障,系统自动把失效的服务器从转发队列中清理出去,从而保证用户访问的正确性;另一方面,当实效的服务器被修复以后,系统再自动地把它加入转发队列。


失败切换,这是针对负载均衡器Director 采取的措施,在有两个负载均衡器Director 的应用场景,当主负载均衡器(MASTER)失效或出现故障,备份负载均衡器(BACKUP)将自动接管主负载均衡器的工作;一旦主负载均衡器故障修复,两者将恢复到最初的角色。

要从技术上实现虚拟服务器、故障隔离及失败切换3 个功能,需要两个工具:ipvsadm 和keepalived。


Ipvs(IP Virtual Server)是整个负载均衡的基础,如果没有这个基础,故障隔离与失败切换就毫无意义了。在大部分linux 发行版中,ipvs 被默认安装。


Ipvs 具体实现是由ipvsadm 这个程序来完成,因此判断一个系统是否具备ipvs 功能,只需要察看ipvsadm 程序是否被安装。

检验ipvsadm 是否被正确安装
1、 执行ipvsadm


[img]http://dl2.iteye.com/upload/attachment/0112/4598/ea49a1da-640e-32f4-887c-2db2fe9b5c49.png[/img]


2、 检查当前加载的内核模块,看是否存在ip_vs 模块

# lsmod|grep ip_vs
ip_vs 77569 0

注1、只有执行ipvsadm 以后,才会在内核加载ip_vs 模块。
注2、不能以查进程的方式判断ipvs 是否运行。


[b]keepalived 体系结构[/b]

Keepalived 大致分两层结构:用户空间 user space 和内核空间 kernel space


[img]http://dl2.iteye.com/upload/attachment/0112/4600/7da0bdb0-8cdb-33b5-a61e-75ffab514c3f.png[/img]


在这个结构图里,处于下端的是内核空间,它包括ipvs 和NETLINK 两个部分。


用户空间功能说明:

1、 WatchDog 负责监控checkers 和VRRP 进程的状况。

2、 Checkers 负责真实服务器的健康检查healthchecking,是keepalived 最主要的功能。换句话说—可以没有VRRP Stack,但健康检查healthchecking 是一定要有的。

3、 VRRP Stack 负责负载均衡器之间的失败切换FailOver.如果只用一个负载均衡器,则VRRP 不是必须的。

4、 IPVS wrapper 用来发送设定的规则到内核ipvs 代码。

5、 Netlink Reflector 用来设定 vrrp 的vip 地址等。


Keepalived 各种功能的实现是通过设置其配置文件 keepalived.conf 来完成的。


[b]配置文件keepalived.conf[/b]

一个功能比较完整的keepalived 的配置文件,其配置文件keepalived.conf 可以包含三个文本块:全局定义块、VRRP 实例定义块及虚拟服务器定义块。

全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块。


[b]#全局定义块[/b]
global_defs {
notification_email {
email
email
}
notification_email_from email
smtp_server host
smtp_connect_timeout num
router_id string
}

[b]#VRRP 实例定义块[/b]
vrrp_sync_group string {
group {
string
string
}
}
vrrp_instance string {
state MASTER|BACKUP
interface string
mcast_src_ip @IP
lvs_sync_daemon_interface string
virtual_router_id num
priority num
advert_int num
smtp_alert
authentication {
auth_type PASS|AH
auth_pass string
}
virtual_ipaddress { # Block limited to 20 IP addresses
@IP
@IP
@IP
}
virtual_ipaddress_excluded { # Unlimited IP addresses number
@IP
@IP
@IP
}
}

[b]#虚拟服务器定义块[/b]
virtual_server (@IP PORT)|(fwmark num) {
delay_loop num
lb_algo rr|wrr|lc|wlc|sh|dh|lblc
lb_kind NAT|DR|TUN
nat_mask @IP
persistence_timeout num
persistence_granularity @IP
virtualhost string
protocol TCP|UDP
sorry_server @IP PORT
real_server @IP PORT {
weight num
TCP_CHECK { #TCP服务的健康检查方式
connect_port num #健康检查的服务端口
connect_timeout num #连接超时时间
}
}
real_server @IP PORT {
weight num
MISC_CHECK {
misc_path /path_to_script/script.sh
(or misc_path “/path_to_script/script.sh <arg_list>”)
}
}
real_server @IP PORT {
weight num
HTTP_GET|SSL_GET { #这里定义是http和https的检查方式
url { # You can add multiple url block
path alphanum #http服务检查的默认路径
digest alphanum #https检查后的摘要信息
status_code num #http检查的返回状态码
}
connect_port num #健康检查的服务端口
connect_timeout num #连接超时时间
nb_get_retry num #设置重连次数
delay_before_retry num #重连间隔时间
}
}
real_server @IP PORT {
weight num
SMTP_CHECK { #SMTP服务的健康检查方式
host {
connect_ip <IP ADDRESS> #健康检查的服务端口
connect_port <PORT> #健康检查的服务端口
bindto <IP ADDRESS> #以此地址发送请求对服务器端进行健康检查
}
connect_timeout <INTEGER> #连接超时时间
retry <INTEGER> #设置重连次数
delay_before_retry <INTEGER> #重连间隔时间
helo_name <STRING>|<QUOTED-STRING # smtp helo请求命令的参数
}
}


● 全局定义块

1、 email 通知。
作用:有故障,发邮件报警。这是可选项目,建议不用,用nagios 全面监控代替之。

2、 notification_email_from email:
作用:指定邮件的发送人

3、 smtp_server host
作用:这里是指定邮件服务器地址

4、 smtp_connect_timeout num
作用:设置与邮件服务器连接的超时时长

5、 router_id my_hostname
作用:设置vrrp路由器的id,用来标识路由器本身

6、 花括号“{}”。
用来分隔定义块,因此必须成对出现。如果写漏了,keepalived 运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,
这点要特别注意。

● VRRP实例 定义块

1、 同步vrrp 组vrrp_sync_group。
作用:确定失败切换(FailOver)包含的路由实例个数。即在有2 个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些?

2、 实例组group.至少包含一个vrrp 实例。

3、 Vrrp 实例vrrp_instance.实例名出自实例组group 所包含的那些名字。

(1) 实例状态state
只有MASTER 和BACKUP 两种状态,并且需要大写这些单词。其中MASTER 为工作状态,BACKUP 为备用状态。当MASTER 所在的服务器失效时,BACKUP 所在的系统会自动把它的状态有BACKUP 变换成MASTER;当失效的MASTER 所在的系统恢复时,BACKUP 从MASTER 恢复到BACKUP 状态。

(2) 通信接口interface
对外提供服务的网络接口,如eth0,eth1.当前主流的服务器都有2 个或2 个以上的接口,在选择服务接口时,一定要核实清楚。

(3) lvs_sync_daemon_inteface
负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。但它的机制优于Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在DR 模式中,lvs_sync_daemon_inteface 与服务接口interface 使用同一个网络接口。

(4) 虚拟路由标识virtual_router_id
这个标识是一个数字,范围为 0-255,并且同一个vrrp 实例使用唯一的标识。即同一个vrrp_stance,MASTER 和BACKUP 的virtual_router_id 是一致的,同时在整个vrrp 内是唯一的。

(5) 优先级priority
这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER 的优先级高于BACKUP。若MASTER 的priority 值为150,那么BACKUP的priority 只能是140 或更小的数值。

(6) 同步通知间隔 advert_int
MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒,默认为 1 秒。

(7) 验证authentication
包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS,据说AH 使用时有问题。验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。

4、 虚拟ip 地址virtual_ipaddress

可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个ip 必须与我们在lvs 客户端设定的vip 相一致!

● 虚拟服务器virtual_server 定义块

虚拟服务器定义是keepalived 框架最重要的项目了,是keepalived.conf 必不可少的部分。

1、 虚拟服务器virtual_server

这个ip 来自于vrrp 定义块的第“4”步,后面一个空格,然后加上端口号。定义一个vip,可以实现多个tcp 端口的负载均衡功能。

(1) delay_loop
健康检查时间间隔,单位是秒。

(2) lb_algo
负载均衡调度算法,互联网应用常使用wlc 或rr。

(3) lb_kind
负载均衡转发规则。一般包括DR,NAT,TUN3 种,在我的方案中,都使用DR 的方式。

(4) persistence_timeout
会话保持时间,单位是秒。这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个lvs 环境,使用DR 转发模式,真实服务器有3 个,负载均衡器不启用会话保持功能。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会把第2 次的请求转发到其他的服务器。

(5) 转发协议protocol
一般有tcp 和udp 两种。实话说,我还没尝试过udp 协议类的转发。

2、 真实服务器real_server

也即服务器池。Real_server 的值包括ip 地址和端口号。多个连续的真实ip,转发的端口相同,是不是可以以范围表示?需要进一步实验。如写成real_server 61.135.20.1-10 80 .
(1) 权重weight
权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。

(2) Tcp 检查 tcp_check.

[b]样例:[/b]

1.MASTER 的配置文件/etc/keepalived/keepalived.conf.

#global define
global_defs {
router_id LVS_CNC_1
}
vrrp_sync_group VGM {
group {
VI_CACHE
}
}
################################################################
# vvrp_instance define #
################################################################
vrrp_instance VI_CACHE {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 180
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
125.38.38.64
}
}
##############################################################
# virtual machine setting #
##############################################################
# setting port 80 forward
virtual_server 125.38.38.64 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
# persistence_timeout 20
protocol TCP
real_server 125.38.38.101 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.102 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.104 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.99 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

2、 BACKUP 配置文件/etc/keepalived/keepalived.conf

#global define
global_defs {
router_id LVS_CNC_2
}
vrrp_sync_group VGM {
group {
VI_CACHE
}
}
################################################################
# vrrp_instance setting #
################################################################
vrrp_instance VI_CACHE {
state BACKUP
interface eth1
lvs_sync_daemon_inteface eth1
virtual_router_id 51
priority 150
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
125.38.38.64
}
}
##############################################################
# virtual server setting #
##############################################################
# setting port 80 forward
virtual_server 125.38.28.64 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 125.38.38.101 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.102 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.104 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.99 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}


[b]验证:[/b]

# tail -f /var/log/messages

# ip addr

# ipvsadm -L -n

如果想知道当前测试机(159.226.240.63)的访问请求被转发到那个服务器去了,可以在ipvsadm 命令后带一个选项,其完整形式为:ipvsadm –lcn | grep 159.226.240.63

# ipvsadm -lcn | grep 159.226.240.63
TCP 14:56 ESTABLISHED 159.226.240.63:39783 125.38.38.64:80 125.38.38.99:80
展开阅读全文
博主设置当前文章不允许评论。

webshpere 服务器集群 负载均衡 配置问题

01-11

各位大哥,请知道rn我在二台机器上装了Application Server Network Deployment v6rn1台为 192.168.0.118rn1台为 192.168.0.60rnIbm http server6.0 装在 118 上rn192.168.0.118 上 装了 dmgr01 ,创建节点 appserv01rn192.168.0.60 上装了 appserv01rnrn创建了集群,testinforn把118和60 节点 加入到群中rnrn然后在 dmgr01部署了web应用程序rn然后启动集群,二台机器都启动了rn然后输入:http://192.168.0.118/MyServerlet/Testqjrn访问正常rn当我把118停止,然后在访问 http://192.168.0.118/MyServerlet/Testqjrn报rn[Fri Jan 11 14:35:12 2008] 00000750 00000964 - ERROR: ws_common: websphereGetStream: Failed to connect to app server on host '6e66ec1b9050413.test.com.cn', OS err=10061rn[Fri Jan 11 14:35:12 2008] 00000750 00000964 - ERROR: ws_common: websphereExecute: Failed to create the streamrn[Fri Jan 11 14:35:12 2008] 00000750 00000964 - ERROR: ws_common: websphereHandleRequest: Failed to execute the transaction to 'xlptest001_118'on host '6e66ec1b9050413.test.com.cn'; will try another onern[Fri Jan 11 14:35:12 2008] 00000750 00000964 - ERROR: ws_common: websphereWriteRequestReadResponse: Failed to find an app server to handle this requestrn[Fri Jan 11 14:35:12 2008] 00000750 00000964 - ERROR: ESI: getResponse: failed to get response: rc = 2rn[Fri Jan 11 14:35:12 2008] 00000750 00000964 - ERROR: ws_common: websphereHandleRequest: Failed to handle requestrn提示是找不到192.168.0.118rn就是说负载均衡失败,没有访问192.168.0.60rn请问大哥大姐,怎么配置啊rnrn 论坛

请教关于socket服务器集群负载均衡......

10-03

小弟有个c# 的sockets项目,sockets服务端提供给客户端实时的数据,类似游戏中的实时数据。rn但是,现在估计到如果人数很多,担心服务器扛不住【要求服务器的响应时间是100毫秒内】。rn目前是一个服务端,整个系统工作原理是这样:rn客户端订阅某个货品的即时数据,服务器保存了所有客户端的socket,根据客户端的订阅,实时的向客户端发送数据,直到客户端取消订阅。rn想请教2个问题:rn1,如果几百个客户端都订阅用一个货品,现在服务端是for循环一个一个send过去(使用beginSend...)。不知道这样会不会延迟?除了增大带宽想不到别的好办法。rn2,考虑到货品本身的信息也很多,所以想增加几台服务器。当A服务器压力大的时候,就让B服务器一起提供服务。rn但应该怎样协调这些服务器呢?rn目前考虑是:rn1)增加一台中转服务器,当接收到客户端请求时候,中转服务器向一台压力不大的服务器请求数据,得到数据后转发给客户端。rn但是这样的话,岂不是所有数据都要这个中转服务器来发送,这样中转服务器是否压力大?rn是否有办法,当中转服务器选择了一个服务器后,让这个服务器直接向那个客户端发送数据而不必中转?或者当某个服务器压力大的时候,自动转移一部分客户端的socket交给别的服务器去承担?rnrn小弟对做这个负载的问题没有经验,情各位高手不吝指点!rn谢谢!! 论坛

没有更多推荐了,返回首页