一种也会遇到的情形就是服务进程没有进行子服务service的划分,每个service对外都有同等的逻辑地位,即所有的服务运行在一台server上。
在这种情形下,可采用客户端全亲和度的方式构建集群,简单讲即客户端拥有所有服务端的列表信息,每一个session的生命周期开始时可据本地运行的均匀随机算法或者是通过服务器提供的运行负载状态信息从后台服务器群中选择一台服务器作为运算服务器,而后整个session都会保持在这台服务器上,直到session结束。判定服务器发生宕机后,再重新选择一台服务器重新计算。客户端需要能够以一种合理的方式使得本地服务端的列表信息与后台服务器群的状态保持一致。
1). 服务器在启动时候会将自己的ip:port/url,写入到服务器中的server_list表中。会有一个服务器作为种子服务器,其ip:port/url在初始时会被所有的客户端知道。
2). 客户端启动,若是第一次启动,就向他知道的ip:port/url发送第一个请求,目的是获得server_list,获的这个服务列表后首先要持久性存储,然后client会运行一个均匀分布的随机数生成算法,如选择开源RNG项目所提供的几种算法,在服务器的数量范围内选择一个server作为该客户端本次session的服务器。
3). 以后每次客户端启动,要运行随机算法从serverlist中选择一个server,发送获得server_list,若有变动,更新本地列表。有一种情况,本次服务的机器在server_list端的状态时宕机,那么客户端要发送恢复其状态的请求。然后运行随机算法,选择服务器,发起请求。
4). 在服务请求的过程中,若某一次请求被确认不能正常提供服务,则标记该server与本地server_list中为failure。然后用随机算法在其他的服务器中选择一台能正常工作的服务器,并向这台接受其请求的服务器发送server宕机的信息,该服务器会更新,serverlist中服务器的状态。但是这个过程中初始服务器不会被置failure状态。
5). 增加一台服务器非常简单,移除一台服务器也非常的简单这两个过程都可以做到不用人工操作。
6). 若需要做的更精确,每个server需要定时更新自己server_list中的负载状态,这样,还可以附加获得已有多个心跳周期没有更新状态的server可以被判为宕机。
7). 在这种情况下,在Intranet或internet,若是需要浏览器都可以通过运行插件的方式支持这种变动,硬件负载均衡设备可以去掉了,大部分的负载均衡算法同时也可以省略。百千级数量的服务器会平顺运行,或者更多。
