meface/docs/article/gis/geoserver/jms.md

266 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: GeoServer集群JMS
date: 2023-03-28
author: ac
tags:
- GeoServer
categories:
- GIS
---
> JMS集群部署方案来源于社区
### 1.地理服务器的限制
集群部署需要考虑的几个问题:
1. 数据目录,`GeoServer` 实例的内部配置默认持久化的XML文件都在数据目录中如果每个实例都有自己的数据目录该如何保持一致
> 以某种方式共享相同的数据目录,如通过修改`web.xml`文件,配置相同的`GEOSERVER_DATA_DIR`变量。或通过消息组件同步更改。
>
> 在集群环境中,数据存储在数据目录之外的共享位置或使用其他方式同步
2. 日志记录,默认情况下,`GeoServer` 的日志位置是相对于数据目录的,但是当多个 `GeoServer` 共享同一数据目录时,无论其位置如何,指示它们记录到不同位置至关重要。
> 这可以通过 `GEOSERVER_LOG_LOCATION `配置调整来实现,
3. Java2D 光栅器瓶颈,常见的 Java 安装带有两种不同的光栅化器(将矢量转换为光栅图像的组件)
Oracle JDK 有一个快速的光栅化器,但是在启用抗锯齿的情况下,在整个过程中一次只能光栅化一个形状。在并发环境中在服务器端生成图像时,工作线程大部分时间都被阻塞,因此应用程序根本无法扩展。一旦多个客户端请求生成图像,响应时间就会增加。
> 安装JAI扩展
### 2.配置方案
#### 2.1 `JMS`消息模型
> 基于`JMS`Java Message Service的`GeoServer`集群部署是社区提供的一个方法该方法利用了消息中间件MOM实现了一种强大的主/从master/slave模式让集群中的所有节点在其配置方面保持同步。
`JMS`是Java平台上有关面向消息中间件的技术规范它便于消息系统中的Java应用程序今夕消息交换并且通过提供标准的生产、发送、接受消息的接口简化企业应用的开发。
`JMS`本身值定义了一系列的接口规范是一种厂商无关的API用来访问消息收发系统。
消息中间件一般有两种传递模式:
1发布-订阅模式Pub/Sub发布/订阅模型Topic主题模型
2P2P点对点模式点对点模型Queue队列模型
**点对点模型**
> 点对点模型Pointer-to-Pointer即生产者和消费者之间的消息往来。
![image-20230918103339198](./images/image-20230918103339198.png)
每个消息都被发送到特定的消息队列,接受者从队列中获取消息。队列保留消息,直到他们被消费或超时。
点对点的特点:
1. 每个消息只有一个消费者(一对一),消息一旦被消费,消息就不再在消息队列中;
2. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列;
3. 接收者在成功接收消息之后需向队列答应成功。
**发布/订阅模型**
包含三个角色主题Topic、发布者Publisher、订阅者Subscriber多个发布者将消息发送到Topic系统将这些消息投递到订阅此topic的订阅者。
![image-20230918103249665](./images/image-20230918103249665.png)
发送者发送到topic的消息只有订阅了topic的订阅者才会收到消息。topic实现类发布和订阅当你发布一个消息所有订阅这个的topic的服务都能得到这个消息所以从1到N个订阅者都能得到这个消息的拷贝。
特点:
1. 每个消息可以有多个消费者;
2. 发布者和订阅者之间有时间上的依赖(先订阅主题,再来发送消息);
3. 订阅者必须保持运行的状态,才能接受发布者发布的消息。
示例:
![image-20230918101726475](./images/image-20230918101726475.png)
#### 2.2 单主多从方案
![Geoserver的图形化集群解决方案](./images/Schema.png)
<center>图1单主 - 具有私有数据目录和外部 MOM 的多从集群</center>
它由3个不同的参与者组成
- `GeoServer Masters`主服务器接受对内部配置的更改通过用户界面或Rest接口将其保存在自己的数据目录中但也通过MOM将它们转发给副本
- `GeoServer Slaves`复制副本不应用于从REST或用户界面更改其配置因为它们被配置为注入主服务器通过MOM分发的配置更改。每个副本都有自己的数据目录它负责保持与主副本的数据目录保持一致。如果一个副本再次启动时出现故障他可能会收到一堆JMS消息以使其配置与主副本的配置一致。
- 消息中间件MOM这里使用`ActiveMQ`MOM用于使主服务器Masters和副本Slaves 以持久的方式交换消息,有时我们会使用术语**Broker**作为*MOM 的同义词*。
#### 2.3 P2P和共享数据目录方案
> **一个节点可以同时是主节点和从节点,从而允许对等设置。**
一般来说所有节点都可以同时是Master和Slave但是如上所述最好将负载均衡器配置为使用故障转移进行配置更改GUI或REST以防频繁更改配置预计。在下图中描述了具有 P2P 布局和共享数据目录的设置。
![Illustration: P2P and shared data directory](./images/P2p.png)
<center>图2P2P 和共享数据目录</center>
### 3. 安装集群扩展
#### 3.1 软件准备
本次采用`war`包的形式,使用`Tomcat`进行部署环境是windows先练练手
> 插件下载:[Index of geoserver](https://build.geoserver.org/geoserver/)
![image-20230428113230036](./images/image-20230428113230036.png)
下载两个包:
- `geoserver-2.22-SNAPSHOT-activeMQ-broker-plugin.zip`
- `geoserver-2.22-SNAPSHOT-jms-cluster-plugin.zip`
其中`activeMQ-broker-plugin` 是一个实际上独立的最小 `ActiveMQ MOM` web 应用程序,打包为 WAR 文件,准备好放入 web 容器例如Tomcat中。
集群**插件**将所有功能添加到 `GeoServer` 以作为主服务器或从服务器工作。
另外准备好版本一致的`GeoServer`以及一个Tomcat
- `geoserver-2.22.2-war.zip`
- `apache-tomcat-9.0.68`
![image-20230517161100848](./images/image-20230517161100848.png)
将Tomcat复制4份一份用来单独部署`ActiveMQ`后3份用来部署`geoserver`,将`jms`插件的jar包解压到`jms-cluster-plugin`,创建共享目录`cluster_data_dir`;
#### 3.2 修改端口
修改tomcat的端口号
> 注意要也修改shutdown服务的端口不然会端口冲突8006-80968007-80978008-8098
```xml
<Server port="8006" shutdown="SHUTDOWN">
...
<Connector port="8096" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
...
</Server>
```
#### 3.3 部署MQ
基于`JMS`的`GeoServer`集群部署首先需要运行一个`ActiveMQ`实例可以单独部署在一个Tomcat中。
将`activemqBroker-2.22-SNAPSHOT.war`放到Tomcat的`webapp`目录下并启动,修改解压后的`webapps\activemqBroker-2.22-SNAPSHOT\WEB-INF\classes\applicationContext.xml`文件将uri地址改为本机的IP
```yaml
activemq.transportConnectors.server.uri=tcp://127.0.0.1:61666?maximumConnections=1000&wireFormat.maxFrameSize=104857600&jms.useAsyncSend=true&transport.daemon=true
```
然后重新启动:
```shell
PListStoreImpl - PListStore:[D:\tools\geoserver_cluster\apache-tomcat-9.0.68\bin\.\tmp] started
PListStoreImpl - PListStore:[D:\tools\geoserver_cluster\apache-tomcat-9.0.68\bin\.\tmp] started
BrokerService - Apache ActiveMQ 5.15.11 (broker-1, ID:LAPTOP-POKOTMS2-51732-1684309292191-0:1) is starting
BrokerService - Apache ActiveMQ 5.15.11 (broker-1, ID:LAPTOP-POKOTMS2-51732-1684309292191-0:1) is starting
TransportServerThreadSupport - Listening for connections at: tcp://127.0.0.1:61666?maximumConnections=1000&wireFormat.maxFrameSize=104857600&jms.useAsyncSend=true&transport.daemon=true
TransportServerThreadSupport - Listening for connections at: tcp://127.0.0.1:61666?maximumConnections=1000&wireFormat.maxFrameSize=104857600&jms.useAsyncSend=true&transport.daemon=true
TransportConnector - Connector openwire started
TransportConnector - Connector openwire started
NetworkConnector - Network Connector DiscoveryNetworkConnector:NC:BrokerService[broker-1] started
NetworkConnector - Network Connector DiscoveryNetworkConnector:NC:BrokerService[broker-1] started
BrokerService - Apache ActiveMQ 5.15.11 (broker-1, ID:LAPTOP-POKOTMS2-51732-1684309292191-0:1) started
BrokerService - Apache ActiveMQ 5.15.11 (broker-1, ID:LAPTOP-POKOTMS2-51732-1684309292191-0:1) started
BrokerService - For help or more information please see: http://activemq.apache.org
BrokerService - For help or more information please see: http://activemq.apache.org
ContextLoader - Root WebApplicationContext: initialization completed in 1371 ms
```
#### 3.4 部署jms插件
跟安装其它 `GeoServer` 扩展一样,您可以通过以下方式安装 Active Clustering Extension
1. 将`geoserver.war`放到Geo8096、Geo8097、Geo8098的webapp中启动
2.`jms-cluster-plugin` JAR 放到Geoserver的WEB-INF\lib 目录中,如:\apache-tomcat-9.0.68-Geo8096\webapps\geoserver\WEB-INF\lib
3. 修改Tomcat的catalina.bat添加环境变量设置:
- `GEOSERVER_DATA_DIR`:共享目录地址
- `CLUSTER_CONFIG_DIR`:集群配置目录
- `GEOSERVER_LOG_LOCATION`:日志记录文件
```shell
rem set TITLE=Tomcat.Cluster#1.Server#1 [%DATE% %TIME%]
rem ---------------------------------------------------------------------------
setlocal
set "CLUSTER_CONFIG_DIR=D:\tools\geoserver_cluster\cluster_data_dir\cluster\8096"
set "GEOSERVER_DATA_DIR=D:\tools\geoserver_cluster\cluster_data_dir"
set "GEOSERVER_LOG_LOCATION=D:\tools\geoserver_cluster\cluster_data_dir\logs\8096.log"
rem Suppress Terminate batch job on CTRL+C
if not ""%1"" == ""run"" goto mainEntry
...
```
4. 重新启动 `GeoServer`
> **必须为组成集群的每个地理服务器实例**执行这些步骤,而不管实例将扮演的角色(主或从)。每个实例的集群配置目录和日志文件不要一样。
#### 3.5 配置集群
登陆`GeoServer`,在首页找到`Cluster Setings`,修改配置如下:
![image-20230517165039934](./images/image-20230517165039934.png)
将每个`GeoServer`都设置为既是主节点也是从节点,`Replica connection`一定要启动,用于同步配置。
### 4. 集群验证
在8096上发布shp文件可以预览wms服务在预览的地址栏上直接修改端口为8097也可以访问到服务说明节点之间的服务有同步。
### 5.负载均衡
使用nginx进行配置以支持负载均衡
- 对upstream进行配置实现负载均衡
```shell
upstream local_tomcat {
ip_hash; //支持session使其能够访问同一个地址
server 127.0.0.1:8096 max_fails=1 fail_timeout=1000; //geoserver地址
server 127.0.0.1:8097 max_fails=1 fail_timeout=1000; //geoserver地址
server 127.0.0.1:8098 max_fails=1 fail_timeout=1000; //geoserver地址
}
```
- 对location进行配置跳转到正确的网址
```shell
server {
listen 8090;
location /geoserver/ {
proxy_pass http://local_tomcat/geoserver/
}
}
```
### 参考文章
[1] geoserver集群-jms https://zhuanlan.zhihu.com/p/103706150
[2] 基于JMS的集群https://www.osgeo.cn/geoserver-user-manual/community/jms-cluster/index.html