iPortal 高可用配置 |
一般情况下,为保证 iPortal 的高可用性,一个服务器上只部署一个 iPortal 服务,故在服务器上部署 iPortal 时,请确保 iPortal 所用到的任何端口均不能与该服务器上其他应用所占用的端口相冲突。本示例所部署的2个 iPortal 的具体配置均需按照以下要求进行相同配置,实际应用中也应保持各个 iPoral 的配置、数据一致性。推荐的做法是,在将 iPortal 投入生产之前,先配置好一个 iPortal,之后将该配置好的 iPortal 的产品包直接复制到其他用于运行 iPortal 的服务器中。
iPortal 服务代理的权限信息默认保存在本地,为保证 iPortal 的高可用,需进行服务代理的权限信息共享配置,从而使得两个或多个 iPortal 之间可以进行服务代理权限信息共享,那么用户登录一个 iPortal 并注册的服务,切换至另一个 iPortal 时,其服务代理地址仍可以访问。
您需要修改配置文件 iportal-ehcache.xml(位于【SuperMap iPortal 安装目录】\webapps\iportal\WEB-INF)目录下),将默认保存在本地的代码注释掉或删掉,代码如下:
<cache name="iportalProxyCache" maxElementsInMemory="10"
overflowToDisk="true" eternal="true"
timeToLiveSeconds="0" timeToIdleSeconds="0"
maxEntriesLocalDisk="0" diskSpoolBufferSizeMB="20"
transactionalMode="off">
</cache>
将 iPortal 代理服务的权限信息缓存共享配置的代码注释打开,并修改 <cacheManagerPeerProviderFactory> 和 <cacheManagerPeerListenerFactory> 节点下的内容,代码如下:
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,rmiUrls=//192.168.1.2:4001/iportalProxyCache" />
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=192.168.1.1, port=4001,socketTimeoutMillis=2000" />
<defaultCache maxEntriesLocalHeap="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30"
maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap" />
</defaultCache>
<cache name="iportalProxyCache" maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="0" eternal="false" diskSpoolBufferSizeMB="20"
timeToIdleSeconds="3600" timeToLiveSeconds="0"
memoryStoreEvictionPolicy="LFU" transactionalMode="off">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronous=false,replicatePuts=true,
replicateUpdates=true,replicateUpdatesViaCopy=true,
replicateRemovals=false" />
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
<persistence strategy="localTempSwap" />
</cache>
要实现注册服务代理后的服务地址也被反向代理,同时隐藏代理服务端口,还需对 iportal.xml 文件进行配置,位于【SuperMap iPortal 安装目录】\webapps\iportal\WEB-INF)文件夹下。在 iportal.xml 配置文件中的<serviceProxy>节点下增加<proxyServerRootUrl>节点,设置反向代理服务的根地址。由于代理服务地址中 Host 主机有两种显示方式:域名或 IP,因此,<proxyServerRootUrl>节点有两种配置方式:
方式一:域名形式
<serviceProxy>
<enable>true</enable>
<port>8095</port>
<proxyServerRootUrl>http://www.myiportal.com[:port]</proxyServerRootUrl>
<httpConnPoolInfo>
<maxTotal>20</maxTotal>
<defaultMaxPerRoute>2</defaultMaxPerRoute>
</httpConnPoolInfo>
</serviceProxy>
方式二:IP 形式,此配置会使代理服务地址根据用户当前的网络环境,动态显示 ip 地址。
<serviceProxy>
<enable>true</enable>
<port>8095</port>
<proxyServerRootUrl>http://{ProxyHost}[:port]</proxyServerRootUrl>
<httpConnPoolInfo>
<maxTotal>20</maxTotal>
<defaultMaxPerRoute>2</defaultMaxPerRoute>
</httpConnPoolInfo>
</serviceProxy>
配置完成后,重启 iPortal 服务。
注意:以上两种配置方式中,[:port]变量表示端口,填写代理后的服务监听端口即可,可以为空,为空默认为80端口。
如果您没有配置 Memcached,即不希望多个 iPortal 服务的 session 共享并保持一致,则不需要进行 iPortal 的 session 共享配置。
iPortal 的 session 共享配置,本示例中两个 iPortal 节点通过共享存储在缓存 Memcached 中 session 来实现 session 的共享,如果有一台服务器上的 iPortal 服务停掉了,另一台服务器上的 session 数据仍然可以从 Memcached 缓存中读取,从而不会发生 session 丢失的问题。
为满足 iPortal 的 session 共享配置,需下载如下依赖文件,并将下载获得的所有依赖文件放入 iPoral 产品包的 %SuperMap iPortal_HOME%/lib 目录下。
iPortal 因版本的升级,其所使用的 Web 容器—Tomcat 也会适时升级,具体表现为:SuperMap iPortal 7C 至 SuperMap iPortal 8C SP1 版本使用的是 Tomcat 7系列版本,从 SuperMap iPortal 8C SP2 版本开始,使用的是 Tomcat 8 系列版本。故 Memcached 会因为 iPortal 使用的 Tomcat 的版本不同,下载并添加不同的依赖 jar文件。
在 %SuperMap iPortal_HOME%/conf/context.xml 文件中的 <Context> 节点下增加 <Manager> 子节点,节点内容如下:
<Context>
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.120.145:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
.....
</Context>
其中,memcachedNodes 用于配置 Memcached 所在服务器 IP 地址和 Memcached 服务端口(默认端口为:11211),多个 Memcached 服务需使用逗号(,)分开。
为保证 iPortal 的高可用性,门户数据存储不可使用内置的 SQLite 数据库,两个 iPortal 服务需共用一个支持远程连接的 MySQL 数据库,此时需要修改 %SuperMap iPortal_HOME%/webapps/iportal/WEB-INF/iportal.xml 配置文件,您只需将 SQLite 数据库连接池配置信息注释掉或删除掉,将 MySQL 数据库连接池配置信息的注释符号去掉即可。 具体配置如下:
<dbType>MYSQL</dbType>
<driverClass>org.mariadb.jdbc.Driver</driverClass>
<jdbcUrl>jdbc:mysql://192.168.120.40:3306/iportal323?useUnicode=true&characterEncoding=UTF-8</jdbcUrl>
<maxPoolSize>30</maxPoolSize>
<initialPoolSize>5</initialPoolSize>
<minPoolSize>5</minPoolSize>
<maxIdleTime>3000</maxIdleTime>
<maxWait>300000</maxWait>
<username>root</username>
<password>123</password>
其中,<jdbcUrl> 节点中默认的“localhost”需改为 MySQL 所在机器的 IP 地址,然后本机登入 MySQL,更改 “mysql” 数据库里的 “user” 表里的第一条记录的 “host” 项,从 “localhost” 改成‘%’,重启 MySQL。更多关于数据库的配置请参阅:数据库配置。
为保证 iPortal 的高可用性,用户账户信息存储不可使用内置的 SQLite 数据库,两个 iPortal 服务需共用一个支持远程连接的 MySQL 数据库。SuperMap iPortal 8C SP2 及更新的版本,支持将用户账户信息存储在 MySQL 数据库中,并提供了可视化的配置页面。启动 iPortal 服务,以管理员身份登录 iPortal 门户,依次选择“管理->安全->安全配置->安全信息存储”,将存储用户信息的数据库类型由 SQLite 切换至 MySQL,iPortal 会自动将初始化管理员信息(第一次启动 iPortal 时创建的管理员账户)同步到该 MySQL 数据库中。需要输入的 MySQL “服务地址”中用到的数据库必须是一个新创建的没有任何表的空数据库且不能与门户数据存储的 MySQL 数据库一致。更多关于用户账户信息存储配置请参阅:安全信息存储。
针对 SuperMap iPortal 8C SP2 之前的版本,因为用户账户信息是存储在%SuperMap iPortal_HOME%/webapps/iportal/WEB-INF/iserver-security.db 中,在多个 iPortal 之间不能实时同步更新,所以建议您在 iPortal 服务正式上线之前就将所有的用户账户信息都设置好,然后将存有账户信息的 iserver-security.db 覆盖其它 iPortal 的 iserver-security.db文件。
如果您需要启用 iPortal 的服务器监控功能,为保证高可用性,监控数据存储不可使用内置的 SQLite 数据库,两个 iPortal 服务需共用一个支持远程连接的 MySQL 数据库。数据库的配置信息在安装目录(%SuperMap iPortal_HOME%\webapps\iportal\WEB-INF)下的 iportal-monitor.xml 配置文件中,具体配置请参见:数据库配置。
其中, 被监控的 SuperMap iServer 节点的基本信息是存储在 iportal-monitor.xml 配置文件中,配置的 RabbitMQ 信息是存储在%SuperMap iPortal_HOME%\webapps\iportal\WEB-INF\config 目录下的 rabbitmq.properties 文件中,建议您在 iPortal 服务正式上线之前就添加好被监控的 iServer 节点,配置好 RabbitMQ 信息 ,然后将 iportal-monitor.xml 和 rabbitmq.properties 文件覆盖其它 iPortal 的 这两个文件。
为保证 iPoral 的高可用性,2个 iPortal 的以下文件需要适时进行手工同步:
由于部署方案的不同,访问 iPortal 服务的方式也不同:
情况一:基于 Nginx 实现 iPortal 高可用方案
此时客户机可以通过访问反向代理后的服务地址,例如:http://192.168.120.40,其中,默认的80端口可以隐藏,即可获得与访问原服务器相同的内容。注册服务代理后的服务根地址也将变成:http://192.168.120.40,从而也隐藏了服务代理端口“8095”。
在实际的业务应用中,通常使用的是内外网访问 iPortal 门户和地图服务,此种情况建议您将 Nginx 反向代理服务器的 ip 映射为域名,然后通过该域名访问 iPortal 服务,即 http://www.iportal.com,同时,注册服务代理后的服务根地址也将变成:http://www.iportal.com。
情况二:基于 Keepalived 实现 Nginx 高可用方案
此时客户机可以通过访问 Keepalived 虚拟 IP 地址,例如:http://192.168.120.136,其中,默认的80端口可以隐藏,即可获得与访问原服务器相同的内容。注册服务代理后的服务根地址也将变成:http://192.168.120.136,从而也隐藏了服务代理端口“8095”。
在实际的业务应用中,通常使用的是内外网访问 iPortal 门户和地图服务,此种情况建议您将 Keepalived 虚拟 IP 映射为域名,然后通过该域名访问 iPortal 服务,即 http://www.iportal.com,同时,注册服务代理后的服务根地址也将变成:http://www.iportal.com。