ICE的负载均衡以及如何容错
在同一个主机主机上,ICE服务支持多端口的监听。
服务端注册: tcp -h host -p port1:tcp -h host -p port2形式,
例如:
IP:172.17.12.101,需要在10001和10000同时监听。
就可以写成:
tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.101 -p 10001
是不是很简单,运行之后,服务就监听于10000和10001端口,请注意:避免其他应用相冲突。
客户端连接可以采用如下3种形式:
1. tcp -h 172.17.12.101 -p 10000
2. tcp -h 172.17.12.101 -p 10001
3. tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.101 -p 100001
是不是很爽。
无论Server监听在多个端口,还是只有唯一的一个Server在工作,
对于Client较多的应用或负载要求很高的情况下,我们可以把Server程序运行于多台主机之上。通过集群方式合理有效的化解来自Client的压力。
例如:
ServerA 172.17.12.101 tcp -h 172.17.12.101 -p 10000
ServerB 172.17.12.102 tcp -h 172.17.12.102 -p 10000
ServerC 172.17.12.103 tcp -h 172.17.12.103 -p 10000
Client可以如下的连接方式:
tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.102 -p 10000:tcp -h 172.17.12.103 -p 10000
或是
tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.102 -p 10000
等多种情况,可以根据应用的具体要求合理有效的构造所需连接主机的字符串。
这种连接方式是不是很cool。
其实这种连接方式可以有效地利用ICE提供的load balancing功能,把Client的每个请求合理的分配到每个Server。从而有效地避免了Client大量请求对同一台Server的巨大压力。
ICE的load balancing主要采用round-robin算法,round-robin是一种非常有效的负载均衡算法.
如果某个Server如果宕机,那么这个Client还能正常工作么?
具体体现在如果当某个Server(假设是ServerA)宕机之后,来自Client的请求分配到ServerA服务器上,Client会自动记录 ServerA失效状态,会把请求再分配给可正常工作的Server(ServerB,ServerC),对于用户的每次请求都能分配到正常的服务主机上 (除非A,B,C都同时宕机).当ServerA回复正常之后,Client会自动感知ServerA工作状态.Client的请求又可以有效地分配到上述A,B,C主机上.这一切对于开发者都是透明的.
ICE所提供的集群功能和容错功能是极其强大的.
Client状态感知的变化和更新完全不需要Client重新启动。
服务端注册: tcp -h host -p port1:tcp -h host -p port2形式,
例如:
IP:172.17.12.101,需要在10001和10000同时监听。
就可以写成:
tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.101 -p 10001
是不是很简单,运行之后,服务就监听于10000和10001端口,请注意:避免其他应用相冲突。
客户端连接可以采用如下3种形式:
1. tcp -h 172.17.12.101 -p 10000
2. tcp -h 172.17.12.101 -p 10001
3. tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.101 -p 100001
是不是很爽。
无论Server监听在多个端口,还是只有唯一的一个Server在工作,
对于Client较多的应用或负载要求很高的情况下,我们可以把Server程序运行于多台主机之上。通过集群方式合理有效的化解来自Client的压力。
例如:
ServerA 172.17.12.101 tcp -h 172.17.12.101 -p 10000
ServerB 172.17.12.102 tcp -h 172.17.12.102 -p 10000
ServerC 172.17.12.103 tcp -h 172.17.12.103 -p 10000
Client可以如下的连接方式:
tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.102 -p 10000:tcp -h 172.17.12.103 -p 10000
或是
tcp -h 172.17.12.101 -p 10000:tcp -h 172.17.12.102 -p 10000
等多种情况,可以根据应用的具体要求合理有效的构造所需连接主机的字符串。
这种连接方式是不是很cool。
其实这种连接方式可以有效地利用ICE提供的load balancing功能,把Client的每个请求合理的分配到每个Server。从而有效地避免了Client大量请求对同一台Server的巨大压力。
ICE的load balancing主要采用round-robin算法,round-robin是一种非常有效的负载均衡算法.
如果某个Server如果宕机,那么这个Client还能正常工作么?
ICE所提供的集群功能和容错功能是极其强大的.
Client状态感知的变化和更新完全不需要Client重新启动。
一会儿有空要自己实验下!!
介绍下Round-Robin Scheduling:
Round Robin
轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。 在系统实现时,我们引入了一个额外条件,当服务器的权值为零时,表示该服务器不可用而不被调度。这样做的目的是将服务器切出服务(如屏蔽服务器故障和系统维护),同时与其他加权算法保持一致。所以,算法要作相应的改动,它的算法流程如下: 轮叫调度算法流程 假设有一组服务器S
= {S0, S1, …, Sn-1},一个指示变量i表示上一次选择的 服务器,W(Si)表示服务器Si的权值。变量i被初始化为n-1,其中n > 0。 j = i; do { j = (j + 1) mod n; if (W(Sj) > 0) { i = j; return Si; } } while (j != i); return NULL; 轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器间的负载不平衡。 虽然Round-Robin
DNS方法也是以轮叫调度的方式将一个域名解析到多个IP地址,但轮叫DNS方法的调度粒度是基于每个域名服务器的,域名服务器对域名解析的缓存会妨碍轮叫解析域名生效,这会导致服务器间负载的严重不平衡。这里,IPVS轮叫调度算法的粒度是基于每个连接的,同一用户的不同连接都会被调度到不同的服务器上,所以这种细粒度的轮叫调度要比DNS的轮叫调度优越很多。