12.6. 避免服务故障¶
GeoServer 是一个很棒的软件,核心开发人员每天都会遇到bug,增强现有功能,并提供新功能。 尽管如此,站点的配置也很谨慎,但是还会遇到GeoServer 传递地图的故障问题。 在最简单的情况下,它只会影响一些特定的请求;更常见的情况是,它会暂停一段时间, 有时需要重新启动它才能使它再次工作。
几乎所有的软件应用程序都会遇到这种情况,无论是专有的还是开源的,免费的还是非常昂贵的。 避免故障是你无法控制的,但是你应该学会如何避免服务中断。
您需要高可用性或容错配置。实际上,这是软件部署中一种非常常见的方法, 您将在这里学到的是任何类型的软件服务的最佳实践,而不仅仅是地图服务。
那么,如何获得容错配置呢?这都是关于冗余,如果你不能避免故障,你还可以消除一个单一的故障点。 在容错配置中,单点故障是硬件和软件的一部分,如果它失败了,就没有备用的伙伴来成功地完成它的工作。
基本思想很简单,但很有效。如果两个地理服务器并行工作,它们可能不会同时中断。 因此,当您(甚至更好地说,是一个自动化过程)恢复损坏的实例时, 另一个GeoServer 将继续处理用户的请求。从用户的角度来看,这是没有问题的; 他只能体验到响应时间的减慢。当然,这个模型不仅仅可以用GeoServer 的两个实例来实现; 您可能有很多实例。这种模式不仅会使你的系统更加可靠,而且会大大提高你的网站的性能。
当然,只有两个地理服务器是不够的。首先,它们的配置需要同步;此外, 还需要一种在实例之间共享请求的方法。实际上, 您需要一个负载平衡器来跨服务器池分发请求负载。

图 12.10 image279¶
上图显示了容错配置的所有组件。从右边开始,我们找到了两个用通常用于数据库的符号设计的存储库: 一个保存配置文件,另一个存储数据。如前几章所述,GeoServer 的配置包含在一个文件夹中。 这个文件夹包含在war中;所以当您在Tomcat上部署它时,它包含在geoserver文件夹中。 您可以将它放在外部文件系统上,以便所有实例都可以访问它。
请注意,为避免访问争用出现单点故障和损坏, 您不能简单地在服务器上复制配置文件夹并让所有GeoServer 指向该文件夹。 您需要将其复制到一个特殊的文件系统上,该文件系统应同时安装在多个服务器上。 这些文件系统称为“群集文件系统”。 当然,同样的问题也适用于不在
一个 RDBMS ,例如,shapefiles。有关详细信息,请查看 http://en.wikipedia.org/wiki/Clustered_file_system .
数据存储可以是RDBMS,例如 PostGIS 服务器,或者包含shapefile和地理参考图像的文件夹。
向左走,你会发现两个地理服务器。注意连接到数据和配置的线路。它们的样式不同, 只是为了使连接的项更清晰,但它们的功能是相同的。 每个GeoServer 需要访问相同的配置存储和数据存储,以公开完全相同的层。
在地图服务器的左边有几个web服务器。您了解到它们充当GeoServer 的代理, 在这里它们还可以平衡它们之间的负载。我们将在 操作时间–配置群集 现在您应该注意, 每个web服务器都连接到每个GeoServer 。这样,如果其中一个失败, 另一个将把请求转发到地图服务器。
在web服务器前面有一个 路由器 . 从逻辑角度来看,它是一个平衡器, 将所有web服务器与一个IP地址相关联。它可以是硬件或软件组件; 请参见 http://en.wikipedia.org/wiki/Load_ 平衡(计算)用于讨论和实现列表。
最终我们找到了用户。他们不知道体系结构的复杂性;他们只是有一个入口点让map服务转发请求。 集群配置负责处理请求,将它们发送到GeoServer 并返回响应。
有一个重要的事实要记住。WMS、WFS和WCS是无状态的。在客户端请求之间没有要维护的会话状态, 因此不需要在服务器之间同步会话数据。用户请求可以由server1填写,然后发送到server2。 请求的主体包含server2处理请求所需的所有信息。 这大大降低了复杂性,您可以通过实现负载平衡和冗余来对配置进行集群。
12.6.1. 操作时间–配置群集¶
在配置模式中,我们没有提到硬件。当然, 在单个物理服务器上部署所有组件时具有软件冗余不是一个好主意。 您可以将每个组件部署到单独的服务器上(在现代服务器场中,它们可能是虚拟的), 但基本思想是,您不应该在一台计算机上拥有组件的所有实例。
为了简单起见,为了节省您购买大量硬件的时间,我们将在以下部分使用一台Linux机器:
1.作为第一步,我们将从 GeoServer web存档中重新定位配置文件夹。停止Tomcat服务:
~$sudo service tomcat stop
2.现在将文件夹移动到外部位置:
~$ sudo mv /opt/apache-tomcat-7.0.27/webapps/geoserver/data /opt/geoserver_config
3.现在你必须编辑 web.xml 使GeoServer 知道新配置文件夹的文件:
~$ sudo vi /opt/apache-tomcat-7.0.27/webapps/geoserver/WEB-INF/ web.xml
4.找到以下注释代码片段:
<!--
<context-param>
<param-name>GEOSERVER_DATA_DIR</param-name>
<param-value>C:eclipseworkspacegeoserver_trunkcite\confCiteWFS PostGIS </param-value>
</context-param>
-->
5.删除第一行和最后一行以取消注释,并在 param-value 元素:
<context-param>
<param-name>GEOSERVER_DATA_DIR</param-name>
<param-value>/opt/geoserver_config</param-value>
</context-param>
6.保存文件,然后重新启动Tomcat服务:
~$sudo service tomcat
7.登录GeoServer 并检查配置是否正确读取。现在我们需要第二个Tomcat实例。 再次停止Tomcat服务,并将其复制到新位置:
~$ sudo cp -r /opt/apache-tomcat-7.0.27 /opt/new_apachetomcat-7.0.27
8.有了两个不同的服务器,您就可以让Tomcat的配置保持原样,并且它可以完美地工作。 但是,当您在同一台计算机上启动它们时,它们会尝试绑定到同一个TCP端口(例如,8080用于 HTTP 协议), 其中一个会失败。打开 server.xml 带有编辑器的新Tomcat文件:
~$ sudo vi /opt/new_apache-tomcat-7.0.27/conf/server.xml
9.找到以下代码这是第一行未注释的代码,然后修改 服务器端口 到 8105 :
<Server port="8105" shutdown="SHUTDOWN">
10.现在查找配置 HTTP 连接器的代码部分。改变 连接器端口 到 8180 :
<Connector port="8180" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
11.向下滚动,直到找到 AJP 连接器并将端口号修改为 8109 :
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
12.保存并关闭文件。在启动两个Tomcat服务器之前,我们需要为JVM添加两个参数, 否则集成的GWC将锁定 data 文件夹,只有一个地理服务器可以启动:
~$ sudo vi /etc/init.d/tomcat
13.就在线路设置之后 -server 参数,插入以下内容:
GWC="-DGWC_DISKQUOTA_DISABLED=true -DGWC_METASTORE_DISABLED=true"
14.添加 GWC 行设置中的变量 JAVA_OPTS :
export JAVA_OPTS="-Djava.awt.headless=true $HEAP $NEW $RMIGC $PGC $PERM $DEBUG $DUMP $SERVER $GWC"
15.保存文件,然后打开新Tomcat服务器的启动脚本:
$ sudo vi /opt/new_apache-tomcat-7.0.27/bin/catalina.sh
16.在初始注释之后插入新行,并设置相同的参数:
JAVA_OPTS="-DGWC_DISKQUOTA_DISABLED=true -DGWC_METASTORE_DISABLED=true"
17.保存文件。
18.现在我们可以启动两个Tomcat服务器了。您可以使用服务命令实用程序启动旧的。 要启动新创建的启动脚本,请使用默认启动脚本:
~$ sudo /opt/new_apache-tomcat-7.0.27/bin/startup.sh
19.现在打开浏览器,指向http:// localhost / geoserver, 并转到http:// localhost:8180 / geoserver。 转到“图层预览”页面; 现在,您将看到与预期相同的图层列表。
20.现在我们需要为两个Tomcat服务器设置一个代理并添加一个平衡器。 这是由 apache httpd mod_proxy_balancer . 使用以下脚本启用它:
~$ sudo a2enmod proxy_balancer
~$sudo service apache2 restart
21.为了更改代理配置,必须编辑 httpd.conf 文件:
~$ sudo vi /etc/apache2/httpd.conf
22.我们需要修改 ProxyPass 指令。注释上一行中插入的行 操作时间–配置代理 节, 通过插入 # 行开头的字符。然后插入以下代码:
ProxyPass /geoserver balancer://geoserver
<Proxy balancer://geoserver>
BalancerMember ajp://localhost:8009/geoserver
BalancerMember ajp://localhost:8109/geoserver
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
23.保存文件并重新启动Apache服务。现在打开浏览器并转到 http://localhost/geoserver . Apache将把您的请求转发到两个geoserver之一。
24.您可能想知道平衡器如何工作,如何平衡请求, 以及服务器故障时会发生什么。 Apache mod_proxy_balancer带有实用的界面来管理和监视平衡器。 您必须在httpd.conf文件中显式公开它:
~$ sudo vi /etc/apache2/httpd.conf
25.插入以下代码:
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
26.从浏览器中打开 http://localhost/balancer-manager :

图 12.11 image280¶
27.从web界面,您可以监视配置的每个节点的主要参数。状态将告诉您节点是否正在工作或是否已关闭。 在它旁边,您可以找到自服务启动以来每个节点处理的请求数。这个 方法 字段显示如何分发请求。 执行加权请求计数的默认模式是 请求 . 您也可以将其修改为 交通事故 ,以执行加权流量字节计数平衡。 默认情况下,为每个节点分配了相等的负载,但可以使用 负载系数 参数。 让我们更改配置,将75%的请求拆分到一个节点,其余25%的请求拆分到另一个节点:
<Proxy balancer://geoserver>
BalancerMember ajp://localhost:8009/geoserver loadfactor=1
BalancerMember ajp://localhost:8109/geoserver loadfactor=3
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
28.重新启动Apache服务,然后打开 GeoServer web界面,并导航它以发送一些请求。 如果现在再次打开balancer manager界面,则页面应如下所示:

图 12.12 image281.jpg¶
29.也可以将节点设置为主机备用。如果节点失败,平衡器将获取对它的请求。 要设置备份,必须插入 status=+H 参数:
<Proxy balancer://geoserver>
BalancerMember ajp://localhost:8009/geoserver status=+H
BalancerMember ajp://localhost:8109/geoserver
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
刚刚发生了什么?¶
您学习了如何配置简单而有效的高可用性配置。在本节中,我们没有介绍任何路由器; 此任务通常由网络工程师执行,您可以放心地知道它必须完成。
小测验-生产环境¶
问题1。如何为JVM优化环境?
1.您应该使用64位的JVM版本;它的性能比32位的要好得多。
2.必须在服务器上启动控制台窗口并设置全局环境变量。
3.必须在用于启动GeoServer 的脚本中为JVM启动参数设置自定义值。
问题2。如何减少地图服务的停机时间?
1.使用改进的硬件。
2.优化数据。
3.为配置的每个组件设置冗余项。