Chinaunix

标题: keepalived+appserver双主机方案测试(已解决) [打印本页]

作者: 夏织风    时间: 2017-08-18 09:54
标题: keepalived+appserver双主机方案测试(已解决)
本帖最后由 夏织风 于 2017-08-21 16:04 编辑

之前在网上看到一篇文章,讲述了双机部署keepalived+appserver会造成死锁的原因。
部分摘录如下:
当客户端发送数据包给 VIP .比如我们的 Director1 (Master 主)这个接口正在工作,这时 LVS 能接收到这个包,然后根据 keepalived 的配置进行 load balance .这时 Director1 会使用 LVS-DR 的功能给包路由给自己或者 Director2 (Backup).
这时有个问题.在这个例子中因为我们使用了 keepalived .这时 Director2 这台是一台 VIP 的备份服务器.这时 keepalived 默认会立即启动使用 ipvsadm 的规则来配置这台服务器怎么样做备份的处理.来使得更快的故障转移.所以这时这些规则这台备份的 Director2 主机都会存在.
这就有问题了.当从 Director1 (Master 主),比如使用 rr .会转发大约 50% 的包从 Director1 到  Director2 (Backup)的 3306 的端口.这时因为 Director2 因为这些 LVS-DR 的配置规则会接着给这些包,在做一次 load balance .又发回去给 Director1.这时会产生一个死的循环.
随着时间的推移,不但不能正常的处理连接,您的服务器也会崩溃,在他们中间或后端不断的反复连接
-----------------------------------------分割线---------------------------------------------------------
针对这个问题,我采用了与文章不同的解决方案,因为文章中给防火墙添加规则屏蔽双方的mac地址实际上是人为关闭lvs的功能。
我想即保留HA又使用lvs功能,所以我采用了这个方法:
创建子网卡并使让子网卡和主网卡在同一网段:ifconfig eth0:0 ip地址 netmask 掩码位 up
在keepalived.conf文件中的配置信息中:
采用的是rr轮询方式
VRRPD配置中的interface使用的是主网卡eth0(注,不能使用子网卡,会报错)
LVS˜配置中的realserver的ip是子网卡的ip地址
-------------------------------------------分割线--------------------------------------------------------
我绑定了8080端口,然后测试了一下,没有产生死锁。

我这个方案是基于一个假设:我猜想keepalived是通过VRRPD配置中的interface,来获取本机的ip地址,我只要不向这个地址发送请求,应该可以避免死锁的产生。

不过,由于我现有的环境没有loadrunner或者其他的压力测试服务器,不知道在压力测试情况下,会不会保证稳定。
希望各位大神和同行,如果有兴趣的话,可以测试一下我的方案,把问题和结果告诉我一下,欢迎讨论。

---------------------------------------------分割线-------------------------------------------------------
我用loadrunner测试了一下,会有死锁产生,看来keepalived应该是监听eth端口的包,我打算测试双网卡的情况,看看会不会避免死锁


作者: q1208c    时间: 2017-08-26 11:52
回复 1# 夏织风

keepalived 不是 配置 HA 的?
怎么还配置成了RR ?

还有这种操作?

作者: 夏织风    时间: 2017-08-28 18:01
回复 2# q1208c

确实两台机器无法构建HA+RR模式,除非RR是由应用层程序进行分发。

作者: q1208c    时间: 2017-08-28 20:31
回复 3# 夏织风

keepalived 的 VIP 同是一时刻只在一台机器上, 怎么做到RR呢?

作者: 夏织风    时间: 2017-08-28 20:45
回复 4# q1208c

不使用IPVS,通过应用程序使用自定义的规则进行转发。

作者: q1208c    时间: 2017-08-28 21:05
回复 5# 夏织风

那你的客户端要怎么知道访问哪一台呢?
两台一起连?然后自己处理RR?

作者: 夏织风    时间: 2017-08-29 10:26
回复 6# q1208c

客户端连接只需知道VIP就可以,具体业务由上层进行转发,不通过二层进行转发,这样的效率肯定是比较慢,但是不会冲突

作者: 夏织风    时间: 2017-08-29 10:28
回复 6# q1208c

HA+RR不是全部由keepalived完成,keepalived只负责HA,自己开发的软件在上层负责RR。

作者: q1208c    时间: 2017-08-29 21:09
回复 7# 夏织风

通用一点的做法是使用三层的代理结构。

lvs -> haproxy -> application

lvs 完成 ha
haproxy 完成 rr


作者: 夏织风    时间: 2017-08-29 23:01
回复 9# q1208c

ok!我测试一下。

作者: 夏织风    时间: 2017-08-29 23:02
回复 9# q1208c

补充一下,应该是keepalived->haproxy/nginx->application吧

作者: q1208c    时间: 2017-08-30 22:22
回复 11# 夏织风

application 可以是 nginx, tomcat, apache, jetty, etc.

作者: 夏织风    时间: 2017-08-31 15:33
回复 12# q1208c

我觉得haproxy和nginx的功能是一样的

作者: q1208c    时间: 2017-09-01 01:50
回复 13# 夏织风

不一样。

haproxy 只支持转发,本身不能提供服务。
nginx 本身可以提供http服务,也能转发。

作者: 夏织风    时间: 2017-09-04 08:57
回复 14# q1208c

谢谢大神,我研究一下这两个软件





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2