服务器轮循负载均衡问题

lk198186 2010-07-01 09:24:48
服务器失效备援和轮循如何设计,对于宕机的服务器,服务器恢复后,程序如何识别。

比如有3台服务器,a,b,c,当第一个请求到达a时,如果a没有出现问题则a进行处理,如果
a出现问题处理不了请求,则将请求发送到b服务器,依次类推,每当有一台服务器宕机之后,
就会将宕机的服务器记录,当3台全部宕机之后,就返回服务器错误。现在关键的问题在于,
服务器恢复之后需要将恢复的服务器从宕机服务器记录中除去,如何除去呢?是不是需要起
一个守护线程来监听服务器的状态,如果恢复则从宕机服务器记录中除去?

请高手们指点。
...全文
226 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
sl514 2010-07-02
  • 打赏
  • 举报
回复
抓异常。 判断当抓的异常时因为宕机造成的 就在catch模块里去连接另外一台机 以此类推。
lk198186 2010-07-02
  • 打赏
  • 举报
回复
如果服务器都挂了,你无限次监听直到有一个好了,还是只监听N次,然后隔一段时间在监听

服务器都挂了的话一致监听,也就是说监听程序一直都在运行,只是隔一段时间扫描一次服务器状态
dr_lou 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lk198186 的回复:]
引用 19 楼 dr_lou 的回复:

所以现在我是这样的想的,在客户端请求服务器之前起一个监听,在监听中监听服务器的状态,只返回给
客户端可用的服务器socket,这样的话就没必要设置临界状态了,当监听发现服务器全坏掉的时候,直接告之
客户端没有可用的服务器,这样就省掉了客户端连接不可用的服务器的连接时间。

你的监听是否也有监听次数,监听间隔的问题?


间隔时间肯定有的,……
[/Quote]

如果服务器都挂了,你无限次监听直到有一个好了,还是只监听N次,然后隔一段时间在监听
lk198186 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dr_lou 的回复:]

所以现在我是这样的想的,在客户端请求服务器之前起一个监听,在监听中监听服务器的状态,只返回给
客户端可用的服务器socket,这样的话就没必要设置临界状态了,当监听发现服务器全坏掉的时候,直接告之
客户端没有可用的服务器,这样就省掉了客户端连接不可用的服务器的连接时间。

你的监听是否也有监听次数,监听间隔的问题?
[/Quote]

间隔时间肯定有的,就是隔段时间就扫描次服务器的状态,监听次数是指什么?
dr_lou 2010-07-02
  • 打赏
  • 举报
回复
所以现在我是这样的想的,在客户端请求服务器之前起一个监听,在监听中监听服务器的状态,只返回给
客户端可用的服务器socket,这样的话就没必要设置临界状态了,当监听发现服务器全坏掉的时候,直接告之
客户端没有可用的服务器,这样就省掉了客户端连接不可用的服务器的连接时间。

你的监听是否也有监听次数,监听间隔的问题?
dr_lou 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dr_lou 的回复:]
int requestCount = 0;

while(requestCount < 5){
//尝试连接
if(成功){
reqeustCount = 0;
break;
} else {
requestCount++;
}
}
[/Quote]

上面的方法封装在一个public Connection getConn()的方法里

然后

while(true){
Connection = getConn();
if(conn != null){
break;
}
Thread.sleep(过n分钟再试试);
}
dr_lou 2010-07-02
  • 打赏
  • 举报
回复
int requestCount = 0;

while(requestCount < 5){
//尝试连接
if(成功){
reqeustCount = 0;
break;
} else {
requestCount++;
}
}
lk198186 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bao110908 的回复:]

引用 14 楼 lk198186 的回复:

你的次数是指客户端请求的次数还是服务器端轮循的次数


服务端全挂掉的话,那肯定是客户端轮询了。

不一定要死循环,客户端每隔几分钟重连几次,期间来的请求,如果连上了就调用,否则就返回失败状态。

我们有一个应用用的是接口方公司提供的 api jar 包,其是 Socket 长连接的。他们做得倒好,只要服务端一维护,客户端就在那死循……
[/Quote]

客户端怎么隔几分钟重连几次?如果服务器全坏掉的话,只要客户端一连接就是死循环,除非设置超时。

假如有a,b,c,d四台服务器,当这4台全坏掉的时候,某个请求到达a的时候,那么会出现
a->b->c->d->a这样的轮循请求,这不就是死循环吗?所以我起了一个监听服务器状态的线程,当服务器全
坏掉的时候就告诉客户端现在服务器全坏了不能处理请求,关键的是当其中某台服务器恢复的时候,比如d
服务器恢复了,需要改变这个临界状态,否则,假如当d刚好恢复的时候请求到达了a服务器,那么客户端仍旧
会被告之服务器全坏了,除非恰巧请求到达了d服务器。

所以现在我是这样的想的,在客户端请求服务器之前起一个监听,在监听中监听服务器的状态,只返回给
客户端可用的服务器socket,这样的话就没必要设置临界状态了,当监听发现服务器全坏掉的时候,直接告之
客户端没有可用的服务器,这样就省掉了客户端连接不可用的服务器的连接时间。
lk198186 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 sl514 的回复:]

抓异常。 判断当抓的异常时因为宕机造成的 就在catch模块里去连接另外一台机 以此类推。
[/Quote]

效率很低,假如10台服务器有9台都坏了,那请求发送到第一台服务器的时候会出现9次异常捕捉,
然后请求被转发9次,这样客户是受不了的,除非有服务器坏掉的话就从服务器列表删除,服务器
恢复的时候还需要起监听把服务器加回到服务器列表,个人认为还是监听的方式比较好,用监听来
探测服务器的状态,然后请求到来的时候连接的服务器能尽量保证是可连通的
dr_lou 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lk198186 的回复:]
如果服务器都挂了,你无限次监听直到有一个好了,还是只监听N次,然后隔一段时间在监听

服务器都挂了的话一致监听,也就是说监听程序一直都在运行,只是隔一段时间扫描一次服务器状态
[/Quote]

那OK 不需要监听次数了。
lk198186 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kurama_mail 的回复:]

一般来说都可以通过配置实现,你是不需要去自己写线程的。
如果是 apache + tomcat你可以百度到解决方案的。
[/Quote]
我也不想自己写,但是
现在的情况是,没有apache,tomcat容器中部署了一个webservice服务,而该服务通过socket与后台处理程序通信,该后台处理程序并不是web程序,是一个java应用,而该java应用需要做失效备援和负载均衡。

目前自己写好了,少量用户测试是可以的,但是大用户量的情况就不知道了,请高手来指点!
2010-07-01
  • 打赏
  • 举报
回复
关注 希望LZ得到答案后 贴上来分享。
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复
一般来说都可以通过配置实现,你是不需要去自己写线程的。
如果是 apache + tomcat你可以百度到解决方案的。
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lk198186 的回复:]

你的次数是指客户端请求的次数还是服务器端轮循的次数
[/Quote]

服务端全挂掉的话,那肯定是客户端轮询了。

不一定要死循环,客户端每隔几分钟重连几次,期间来的请求,如果连上了就调用,否则就返回失败状态。

我们有一个应用用的是接口方公司提供的 api jar 包,其是 Socket 长连接的。他们做得倒好,只要服务端一维护,客户端就在那死循环了,所有的请求线程全部阻塞,害得我们的应用老是因为线程池耗尽而拒绝服务。
lk198186 2010-07-01
  • 打赏
  • 举报
回复
你的次数是指客户端请求的次数还是服务器端轮循的次数
dr_lou 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dr_lou 的回复:]
引用 10 楼 lk198186 的回复:
连接次数?能具体点么?


客户端最多尝试n次连接,2次尝试间隔为m秒。
[/Quote]

我指的2次 是(1,2,3...n) m秒后 (1,2,3...n)
dr_lou 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lk198186 的回复:]
连接次数?能具体点么?
[/Quote]

客户端最多尝试n次连接,2次尝试间隔为m秒。
letian_w 2010-07-01
  • 打赏
  • 举报
回复
学习ing
lk198186 2010-07-01
  • 打赏
  • 举报
回复
连接次数?能具体点么?
dr_lou 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lk198186 的回复:]
引用 4 楼 bao110908 的回复:

客户端在候选服务器中随机取一个连接,如果连不上,就用下一个,无限轮询下去。


我现在就是用的这样的方法,但是如果所有的服务器都坏掉的话,用户的请求会一直循环下去,造成死循环,
如果设置临界状态的话,可以防止死循环,也就是说所有的服务器都坏掉之后,告诉用户服务器都坏了,但是如果下个请求到来的时候其中某台服务器恢复了的话,就必须更改临界状态,……
[/Quote]

设置尝试连接次数呢?
加载更多回复(5)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧