# 矢量、栅格大数据HA解决方案
# 目标
- 海量矢量数据存储
- 海量矢量数据分析(分析需要保证实时性)
- 海量矢量数据可视化
- 保证三高(高可用、高性能、高可拓)
# 解决方案
# 海量数据查询可视化
# 系统技术流程

# 方案一
- PostgreSQL+PostGIS (矢量数据存储+空间分析)
- GeoServer (栅格数据存储,特定样式矢量图层)
- Redis (缓存)
- SpringBoot (后台服务)
- OpenLayers(前端可视化)
# 条件查询
查询的过程中根据相关层级进行对应的数据抽稀操作

- 前端视图范围切片,将可视范围分成不同区域进行请求处理

- 前端视图切片内选取geoHash块,根据视图内geoHash值进行空间检索。

- 根据geoHash检索后添加属性条件,得到最终检索内容。

# 范围查询
查询的过程中根据相关层级进行对应的数据抽稀操作

# 方案二
- PostgreSQL+ GeoTools(基于GeoHash索引)
- 由后台进行空间分析
- GeoServer (栅格数据存储,特定样式矢量图层)
- Redis (缓存)
- SpringBoot (后台服务)
- OpenLayers(前端可视化)

- 前端视图范围切片,将可视范围分成不同区域进行请求处理

- 在与多边形相交视图内选择与多边形相交和包含的geoHash块

- 取包含geoHash块内点,对相交geoHash块内的点进行判断,当点在多边形和视图范围内时选择该点。

# PostgreSQL集群
在每个协调节点和数据节点上安装PostGIS,以提供空间分析能力
集群的底层使用的是PostgreSQL的流复制功能,延迟很低,主要受网络影响
Postgres-XL 是一个完全满足ACID的、开源的、可方便进行水平扩展的、多租户安全的、基于PostgreSQL的数据库解决方案。
Postgres-XL 可非常灵活的应付各种负载,比如:
- OLAP(通过MPP并行化)
- OLTP
- OLAP & OLTP
- 操作数据存储
- Key-value存储,包括JSON格式

# GeoServer集群
GeoServer实施行业标准的OGC协议,例如Web功能服务(WFS),Web地图服务(WMS)和Web Coverage服务(WCS)。其他格式和发布选项可作为扩展使用,包括Web处理服务(WPS)和Web地图图块服(WMTS)。

# Redis集群
介绍
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
解决问题
存储热点数据,切片查询进行缓存
redis是内存数据库,单机故障容易造成数据丢失的情况
解决单机故障:
- 根据实际情况配置对应的持久化策略
- 使用哨兵模式的集群,在主节点宕机时重新选举出新的Master

# SpringBoot微服务
可基于微服务架构,对高负载功能进行拆分并动态扩容
微服务是一种用于构建应用的架构方案。微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。
# 系统架构

# 测试比对
集群环境:
Postgres-XL
1主2从 (服务器配置 1核2G +2个 1核4G)
抽样的精度(千分之一) 10万条
-- 精度4 5秒以上 精度2 2分钟
select st_asgeojson(geom) as geojson, st_astext(geom) as mkt
from "distributed_random_points"
where geohash like 'ww4y%'
ORDER BY random()
LIMIT 100;
-- 抽样百分之一 2秒左右
select st_asgeojson(geom) as geojson, st_astext(geom) as mkt
from "distributed_random_points" TABLESAMPLE system(1)
where geohash like 'wt%'
ORDER BY random()
LIMIT 100;
-- 抽样千分之一 200~300ms左右
select st_asgeojson(geom) as geojson, st_astext(geom) as mkt
from "distributed_random_points" TABLESAMPLE system(0.1)
where geohash like 'wt%'
ORDER BY random()
LIMIT 100;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20