k8s-deploy-geoserver-activemq

目前公司需要搭建geoserver集群集成jms和jdbcstore的插件,实现数据保存在数据库,同时通过jms来同步集群的缓存数据

部署activeMQ

基本信息

image-20211013110849180.png

####

包括注解包括你需要备注的信息
标签: 用于部署pod 服务,用于设置部署在指定标签节点 在高级设置里面可以设置
副本数即类似于克隆了多个镜像服务,他们的配置都是一样的
分层级类似于归类的作业,突出显示和归纳

配置容器

image.png

这部分主要是要注意要注意如果服务是需要暴露端口的必须要配置,否则服务启动会有问题,暴露的端口不是直接给外部访问,是节点的容器组IP的暴露出来的可以用于容器内部的通信
容器的镜像通常就是 dockerhub官方提供的,亦或者是内网的镜像仓库harbor部署的,
命令参数目前使用的少,看介绍可以替代dockerfile中 cmd部分执行的命令
环境变量即添加容器内部的环境变量,包括很多敏感的secret和key ,需要运行时使用便可以放在上面
资源请求/限制: 即对容器调用host的资源进行限制,不挤占其他服务的资源

挂载存储

image.png

这里主要是注意一点 挂载数据卷到容器中,倘若容器中的配置文件在挂载卷不存在,但是配置挂载会替换容器中的文件导致pod启动失败

还有配置路径也是需要注意
上面的路径的容器内的绝对路径
下面的子路径是相对路径但是相对的是 挂载的卷的的根节点 类似于 /var/lib/kubelet/pods/8c7ba28d-59bd-4ad3-a592-4212ad540939/volumes/kubernetes.io~glusterfs/pvc-02a2b3a6-bd84-4687-8c37-67eb0b4a1ed1
如果配置的是文件
那么下面挂载卷内的文件会替换上面容器绝对路径的文件

服务/应用路由

image.png

需要主要的要主要在服务定义 如果是暴露在集群内部那么选择clusterip只会容器上可以使用 通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。
如果选择nodePort那么则是需要在集群对外暴露端口通常都是五位数的端口,通过集群每个节点的端口监听和dns解析,
headless是没有任何配置 ** Service 并不会分配 Cluster IP,kube-proxy 不会处理它们, 而且平台也不会为它们进行负载均衡和路由。 DNS 如何实现自动配置,依赖于 Service 是否定义了选择算符**

services-userspace-overview.svg

tips

如果保存后pod启动有问题报
不挂载卷,可以直接启动,但是挂载就一直报
Back-off restarting failed container 这种一般都是容器启动的时有问题导致的运行失败,需要看日志,体现出来就是容器启动后没有一种运行的进程导致 被回收
image.png

优化目标

  • 使用jdbcstore插件后大比例不 不显示空白
  • 结果jdbcstore和jms插件的冲突
  • 高版本(19)geoserver集群的部署

使用jdbcstore插件后大比例不 不显示空白

现象

在使用jdbcstore插件来实现数据的数据库保存,但是在预览图层时会出现放大到一定程度层级后空白 的情况

解决方法

在查询源码后知道新版的geoserver优化的SQL查询逻辑调用了

老版的geoserver实际执行的SQL

1
2
3
4
5
-- 对比可以知道 在勾选Support on the fly geometry simplification 后 没有使用ST_Simplify 这个函数在
SELECT "fid",encode(ST_AsBinary(ST_Simplify(ST_Force2D("geom"), 3.8116173982620243, true)),'base64') as "geom" FROM "public"."qj_temp_gzw" WHERE "geom" && ST_GeomFromText('POLYGON ((38371404.953002505 3413497.2549508526, 38371404.953002505 3417181.212940211, 38374478.06952626 3417181.212940211, 38374478.06952626 3413497.2549508526, 38371404.953002505 3413497.2549508526))', 4526) 勾选


SELECT "fid",encode(ST_AsBinary(ST_Force2D("geom")),'base64') as "geom" FROM "public"."qj_temp_gzw" WHERE "geom" && ST_GeomFromText('POLYGON ((38371404.953002505 3413497.2549508526, 38371404.953002505 3417181.212940211, 38374478.06952626 3417181.212940211, 38374478.06952626 3413497.2549508526, 38371404.953002505 3413497.2549508526))', 4526) 不勾选

新版的geoserver实际执行的SQL

1
2
3
4
5
-- 对比可以确定 新版本勾选 Support on the fly geometry simplification后 区别在于选用ST_AsTWKB作为简化内容导致的数据缺失
SELECT "fid",encode(ST_AsTWKB(ST_Simplify(ST_Force2D("geom"), 3.8116173923015597, true),0), 'base64') as "geom" FROM "public"."qj_temp_gzw" WHERE "geom" && ST_GeomFromText('POLYGON ((38371404.953002505 3413497.2549508526, 38371404.953002505 3417181.212940211, 38374478.06952626 3417181.212940211, 38374478.06952626 3413497.2549508526, 38371404.953002505 3413497.2549508526))', 4526)


SELECT "fid",encode(ST_AsBinary(ST_Force2D("geom")), 'base64') as "geom" FROM "public"."qj_temp_gzw" WHERE "geom" && ST_GeomFromText('POLYGON ((38371404.953002505 3413497.2549508526, 38371404.953002505 3417181.212940211, 38374478.06952626 3417181.212940211, 38374478.06952626 3413497.2549508526, 38371404.953002505 3413497.2549508526))', 4526)

debug方法调用

org.geoserver.wms.GetMap#executeInternal

org.geotools.renderer.lite.StreamingRenderer#drawPlain

org.geotools.data.store.ContentFeatureSource#getReader(org.geotools.data.Query)

org.geoserver.wms.GetMapOutputFormat#produceMap

org.geoserver.wms.map.RenderedImageMapOutputFormat#produceMap(org.geoserver.wms.WMSMapContent, boolean)

renderer.paint(

org.geotools.data.postgis.PostGISDialect#encodeGeometryColumnSimplified

最后修改gt-jdbc-postgis jar下面的 org.geotools.data.postgis.PostGISDialect#isAggregatedSortSupported 然后重新打包替换

1
2
3
4
5
6
7
8
9
10
11
static final Version V_1_5_0 = new Version("1.5.0");

static final Version V_2_0_0 = new Version("2.0.0");

static final Version V_2_1_0 = new Version("2.1.0");

static final Version V_2_2_0 = new Version("2.30.0"); //修改这个字段

static final Version PGSQL_V_9_0 = new Version("9.0");

static final Version PGSQL_V_9_1 = new Version("9.1");

保证无论碰到什么版本的geoserver使用老的方法

解决jdbcstore和jms插件的冲突

现象

启动失败会报MultipleBeansException  org.geoserver.config.GeoServerLoader

解决方法

查询知道在 jms-cluster 下面有个 org.geoserver.config.ReadOnlyGeoServerLoader 继承了org.geoserver.config.DefaultGeoServerLoader

同时gs-jdbcconfig 下面 org.geoserver.jdbcconfig.JDBCGeoServerLoader也继承DefaultGeoServerLoader

导致冲突在org.geoserver.config.GeoServerLoaderProxy#lookupGeoServerLoader 会判断GeoServerLoader的类,如果是两个就报错

目前是默认使用JDBCGeoServerLoader 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected GeoServerLoader lookupGeoServerLoader(ApplicationContext appContext) {
GeoServerLoader loader = null;
try {
loader =
(GeoServerLoader)
GeoServerExtensions.bean(
Class.forName("org.geoserver.jdbcconfig.JDBCGeoServerLoader"),
appContext);
} catch (ClassNotFoundException e) {

}
if (loader == null) {
loader = new DefaultGeoServerLoader(resourceLoader);
}
return loader;
}

高版本(19)geoserver集群的部署

现象

集群挂载在同一个盘上面,修改一个jmx的配置,其他节点也跟着修改

解决方法

针对不同节点创建各自的配置文件,在挂载的时候配置映射文件

image-20211012144321551.png