k8s-deploy-geoserver-activemq

文章目录
  1. 1. 部署activeMQ
    1. 1.0.1. 基本信息
  2. 1.1. 配置容器
  3. 1.2. 挂载存储
  • 2.
  • 3.
    1. 3.1. 服务/应用路由
  • 4.
  • 5. tips
  • 6. 优化目标
  • 7. 使用jdbcstore插件后大比例不 不显示空白
    1. 7.0.1. 现象
    2. 7.0.2. 解决方法
  • 8. 解决jdbcstore和jms插件的冲突
    1. 8.0.1. 现象
    2. 8.0.2. 解决方法
  • 9. 高版本(19)geoserver集群的部署
    1. 9.0.1. 现象
    2. 9.0.2. 解决方法
  • 目前公司需要搭建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