ICEGrid 部署图

解释:

注册器是指运行注册器的主机,可以是主/从模式的容灾系统;

节点1,节点2是指服务器主机,注册器记录和管理多台节点;

每个节点上可以运行多个服务器软件Server<xx>

这样构成了整个ICEGrid。

 


1. IceGrid的优势:
a. Location Service
b. On-demand Server activation
按需启动,对于配置的节点(node)无需启动,在客户端向icegrid请求一个服务代理时,icegrid发现这个服务存在但没有被启动,会激活这个adapter所属的server或者让这个apapter向其注册。

c. Application distribution
IcePath2为你提供了各个分布服务器上的部署功能,能够帮你保持必要的程序和文件的同步。

d. Replication and load balance
IceGrid提供一种服务的多台服务器的服务组成一个逻辑上组,当客户端使用间接绑定的时候,可以获得他们任意一个的代理。Icegrid同时时监控着每一个服务器的系统负载,根据负载来给客户端分配代理。

e. Session & resource allocation
客户端可以建立一个session来独占某个对象或者代理甚至服务器。IceGrid会阻止其他的客户端使用这个分配的资源,知道客户端释放它。

f. 错误规避
当有多个节点时,ice在建立连接失败的情况下会多次尝试多个连接。

g. 动态查找
你可以在客户端通过查找的方式,查找多所有的代理端口信息,并由你决定使用那个代理。

h. 状态监测
IceGrid提供监控接口,你可以使用监控接口来整合你现有的监控系统。

i. 管理
iceGrid提供了命令行方式和图形化方式管理你的应用

j. 部署
你可以通过xml文件利用部署符来简单的部署你的系统。

2. IceGrid的应用程序结构。
IceGird的应用程序主要包括:registry(注册表服务器)和若干个节点。
registry里有一个数据库,他存储着对象和节点之间的关系信息。registry不需要对系统不会带来多要负担,所以可以将registry和node同时部署在一个服务器上。

IceGrid的复制能力(replication)给我们的系统结构带来了很大的灵活性,这种复制能力是依赖于适配器(adapter)的。每个请求时registry来决定那个adapter将被使用,服务器就是多个适配器组合而成,但是icegrid要求每个服务器的名字必须是唯一的。

3. IceGrid应用中需要解释的几个名词:
a. Replica Group
一组对象适配器的集合。一个服务可以建立任意多个Replica Group,每个Group需要单一的名字。
在均衡时,就是根据group组中的成员来选择哪个成员提供服务。

b. Node
节点,分布的一组服务。


4. Config文件说明
a. registry配置说明
i. IceGrid.Registry.Client.Endpoints=tcp -p 4061
registry的连接端口信息,必须配置端口号。节点就是通过Ice.Default.Locator来的定义来确定与 registry连接的接口信息。

ii. IceGrid.Registry.AdminPermissionVerifer
这个属性控制着icegrid的管理权

iii. IceGrid.Registry.Data
Registry数据库的文件目录

iv. IceGrid.Registry.DynamicRegistration
设置一个非零值,定义是否允许服务器注册他们的对象适配器。默认情况下IceGrid不允许在没有icegrid部署符部署的情况下server注册他的regsitry。

b. 客户端配置
你需要在客户端配置Ice.Default.Locator,定义的端口信息要和resigstry的 IceGird.Registry.Client.Endponits一致,让客户端知道registry的端口进行通信。在客户端也只需要知道这一个端 口,因为客户端每次会像registry询问代理的端口地址,registry返回给客户端代理的地址后,客户端直接与代理连接了,并且在没有销毁的情况 这个链接应该是个长连接。

c. 配置服务器端
服务端的配置这里省略了,因为后面的部署描述符里会配置服务端的信息,所有用部署描述符的方式不需要服务器端的配置文件。

5. 使用部署描述符部署
部署描述符,描述了我们整个应用上的节点信息。
<icegrid>
<application name="simple">
<node name="Node1">
<server id="HelloServer" exe="java" activation="on-demand">
<option>-jar</option>
<option>test.jar</option>
<adapter name="Hello" register-process="true">
<object identity="hello" type="::test:Hello" property="Identity"/>
</adapter>
</server>
</node>
</application>
</icegird>

a. Application
应用标签,name属性定义它的名字
b. Node
节点标签,他应该代表了一个物理上的节点,节点必须有唯一的名字。
c. Server
一个服务器(逻辑上的),更确切的说应该能够通过exe命令的启动的一个服务程序。exe就是启动这个服务的命令,这个命令不能是exe或者.sh执行文 件(这点我搞了1天才明白,把我害苦了)。activation属性,是设置服务的启动方式,on-demand是按需启动,这样你只需只需要通过icegridnode 加载了node的配置文件,然后通过icegridadmin 加载registry配置文件,并通过iceadmin管理工具部署了部署描述符,你的客户端就可以访问你设计的复杂的分布式应用,所有的服务会在需要时 被启动。option标签是exe执行命令命令行的参数。这样的配置就相当与你使用java -jar test.jar启动。

d. Adapter
适配器的定义,这个name非常重要,你需要在整个应用中取唯一的名字(好象是),在客户端的时候就是通过StringToProxy("Hello") 这个名字来通过registry查找这个适配器,并返回给你这个适配器的端口信息,你的 prxoyHelper.checkCast(Ice.ObjectPrx)的时候,就直接和返回的端口信息的adapter建立了连接。 Register-process属性定义了是否这个节点是否可以被icegrid关闭。


6. 启动你的icegrid应用
先加载节点信息:
icegridnode --Ice.Config=/opt/demo/config.properties
然后加载registry信息
Icegridadmin --Ice.Config=/opt/demo/config.properties
到了icegriadmin的命令行下添加你的部署描述符文件
Application add "/opt/demo/appliation.xml"

由于目前ICE的连接较多,靠人工增加server的方式已经变得很难维护,所以这段时间用IceGrid实现了可扩展的ICE应用,通过IceGrid来实现客户端的定位服务,并可实现复制、负载平衡等功能。

通过手册上的deployment,templates,replication,load balancing等功能的一步步实现,完成了下面的ICE部署。

registry ┬─→ node1 ┬─→ server1_1
│                                    ├─→ server1_2
│                                    └─→ ……

├─→ node2 ┬─→ server2_1
│                     └─→ server2_2

└─→ ……

这样的结构下,以后扩展ICE就方便多了,只需要增加相应的node,而不再需要修改客户端的代码。

转载地址:http://www.cnblogs.com/gym_sky/archive/2011/01/17/1922405.html

1

【IceGrid负载均衡部署步骤】
1、环境
主机1:IP=192.168.0.239,上面部署注册表服务器registry和节点node1,registry和node1运行在同一进程中;
主机2:IP=192.168.0.25,上面部署节点node2;
其中每个节点中包含一个服务程序,服务程序均在节点启动时启动。

2、主机1配置
(1)服务程序部署XML:app_rep.xml,内容如下
<icegrid>
<application name="Simple"> #分布式系统名称

<server-template id="SimpleServer"> #服务器模板
<parameter name="index"/> #自定义参数index
<server id="SimpleServer-${index}" exe="./server" activation="always"> #服务器id,程序路径,启动方式
<adapter name="Hello" endpoints="tcp" replica-group="ReplicatedHelloAdapter"/> #对象适配器配置
<property name="Identity" value="hello"/> #服务器中自定义属性Identity
</server>
</server-template>

<replica-group id="ReplicatedHelloAdapter">
<load-balancing type="round-robin"/> #负载均衡配置,使用轮询调度方式(最近最少使用算法)
<object identity="hello" type="::Demo::Hello"/> #该replica-group中的对象,客户端根据该对象标识或类型定位请求
</replica-group>

<node name="node1"> #节点1,对应于服务程序实例SimpleServer-1
<server-instance template="SimpleServer" index="1"/>
</node>

<node name="node2"> #节点2,对应于服务程序实例SimpleServer-2
<server-instance template="SimpleServer" index="2"/>
</node>

</application>

</icegrid>

--------------------------------------------------------
(2)registry和node1的配置文件config.grid,内容如下
#
# The IceGrid instance name.
#
IceGrid.InstanceName=DemoIceGrid

#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -p 12345 #注册表服务器的端点信息

#
# IceGrid registry configuration.
#
IceGrid.Registry.Client.Endpoints=default -p 12345
IceGrid.Registry.Server.Endpoints=default
IceGrid.Registry.Internal.Endpoints=default
IceGrid.Registry.Data=db/registry #注册表服务器使用到的目录
IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier

#
# IceGrid SQL configuration if using SQL database.
#
#Ice.Plugin.DB=IceGridSqlDB:createSqlDB
#IceGrid.SQL.DatabaseType=QSQLITE

#
# IceGrid node configuration.
#
IceGrid.Node.Name=node1 #节点1,对应于app_rep.xml中node1
IceGrid.Node.Endpoints=default
IceGrid.Node.Data=db/node #节点1用到的目录
IceGrid.Node.CollocateRegistry=1
#IceGrid.Node.Output=db #将节点上的服务程序的标准输出重定向到目录db下,会自动生成输出文件
#IceGrid.Node.RedirectErrToOut=1 #将节点上的服务程序的标准错误重定向到标准输出

#
# Trace properties.
#
IceGrid.Node.Trace.Activator=1
#IceGrid.Node.Trace.Adapter=2
#IceGrid.Node.Trace.Server=3

#
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar
----------------------------------------------------------------
3、主机2配置
主机2上只需要配置node2的配置文件config.node即可,内容如下
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h 192.168.0.239 -p 12345 #注册表服务器的端点信息

#
# IceGrid node configuration.
#
IceGrid.Node.Name=node2 #节点2,对应于app_rep.xml中node2
IceGrid.Node.Endpoints=default
IceGrid.Node.Data=db/node2
IceGrid.Node.Output=db/node2 #将节点上的服务程序的标准输出重定向到db/node2目录下,会自动生成输出文件
IceGrid.Node.RedirectErrToOut=1

#
# Trace properties.
#
IceGrid.Node.Trace.Activator=1
---------------------------------------------------------------
4、客户端配置
配置文件:config.client,内容如下:
#
# The IceGrid locator proxy.
#
Ice.Default.Locator=DemoIceGrid/Locator:default -h 192.168.0.239 -p 12345 #只需有注册表服务器的端点信息即可

5、启动服务程序
(1)主机1上先启动注册表和节点1,执行:icegridnode --Ice.Config=config.grid
(2)主机1上部署服务(只需部署一次,除非修改过app_rep.xml),执行:
icegridadmin --Ice.Config=config.grid -e "application add app_rep.xml"
若要重新部署,执行:icegridadmin --Ice.Config=config.grid -e "application update app_rep.xml"
(3)主机2上启动节点2,执行:icegridnode --Ice.Config=config.node,此时因为服务配置为随节点启动,所以服务自动激活;

6、打开客户端
执行./client,客户端自动连接注册表服务器,接下来便可向服务器发起访问请求。

7、关于程序编码调整
IceGrid的使用会导致客户端、服务器的配置文件发生变动,而代码也只需做极少的改动。主要是客户端可能会由直接代理换成间接代理。
使用了IceGrid定位服务功能后,客户端无需知道服务器上对象适配器端点,只需要对象标识或对象适配器标识或replica-group标识
便可以访问到服务器上的对象。
服务器端可以在xml中配置对象标识,客户端可以从配置文件中读取相应对象标识,这样对象标识就不需要硬编码在程序中了。

posted @ 2011-11-21 10:32  tangr206  阅读(2531)  评论(1编辑  收藏  举报