|
| 1 | +## 海量数据 "写入、共享、存储、计算" 最佳实践 |
| 2 | + |
| 3 | +### 作者 |
| 4 | +digoal |
| 5 | + |
| 6 | +### 日期 |
| 7 | +2017-05-09 |
| 8 | + |
| 9 | +### 标签 |
| 10 | +PostgreSQL , 冷热分离 , 数据共享 , 打破孤岛 , 无盘工作 , 存储计算分离 , 行为数据 , 轨迹数据 , 金融数据 , 监控数据 , 物联网 , GIS , 范围 , 数组 , 图片 |
| 11 | + |
| 12 | +---- |
| 13 | + |
| 14 | +## 背景 |
| 15 | +数据是为业务服务的,业务方为了更加透彻的掌握业务本身或者使用该业务的群体,往往会收集,或者让应用埋点,收集更多的日志。 |
| 16 | + |
| 17 | +随着用户量、用户活跃度的增长,时间的积累等,数据产生的速度越来越快,数据堆积的量越来越大,数据的维度越来越多,数据类型越来越多,数据孤岛也越来越多。 |
| 18 | + |
| 19 | +日积月累,给企业IT带来诸多负担,IT成本不断增加,收益确不见得有多高。 |
| 20 | + |
| 21 | + |
| 22 | + |
| 23 | +上图描绘了企业中可能存在的问题: |
| 24 | + |
| 25 | +1\. 数据孤岛问题严重(如果没有大数据平台时)。 |
| 26 | + |
| 27 | +2\. 对成本预估不足,计算能力扩容麻烦,又或者铺张浪费严重。 |
| 28 | + |
| 29 | +3\. 数据冗余问题突出。 |
| 30 | + |
| 31 | +4\. 存储成本昂贵。 |
| 32 | + |
| 33 | +5\. 业务萎缩后硬件成为固定资产,IT负担严重,几乎没有硬件伸缩能力。 |
| 34 | + |
| 35 | +6\. 数据量太大,几乎无法备份。 |
| 36 | + |
| 37 | +7\. 业务需求多,数据种类多,分析成本、开发成本高昂。 |
| 38 | + |
| 39 | +本文将针对这个场景,给出一个比较合理的方案,灵活使用,可以减轻企业IT成本,陪伴企业高速成长。 |
| 40 | + |
| 41 | +## 行业场景 |
| 42 | +1\. 物流 |
| 43 | + |
| 44 | +一个包裹,从揽件、发货、运输、中转、配送到签收整个流程中会产生非常多的跟踪数据,每到一个节点,都会扫描一次记录包裹的状态信息。 |
| 45 | + |
| 46 | +运输过程中,车辆与包裹关联,车辆本身采集的轨迹、油耗、车辆状态、司机状态等信息。 |
| 47 | + |
| 48 | +配送过程,快递员的位置信息、包裹的配送信息都会被跟踪,也会产生大量的记录。 |
| 49 | + |
| 50 | +一个包裹在后台可能会产生上百条跟踪记录。 |
| 51 | + |
| 52 | +运输的车辆,一天可能产生上万的轨迹记录。 |
| 53 | + |
| 54 | +配送小哥,一天也可能产生上万条轨迹记录。 |
| 55 | + |
| 56 | +我曾经分享过一个物流配送动态规划的话题。有兴趣的童鞋也可以参考 |
| 57 | + |
| 58 | +[《聊一聊双十一背后的技术 - 物流、动态路径规划》](../201611/20161114_01.md) |
| 59 | + |
| 60 | +物流行业产生的行为数据量已经达到了海量级别。 |
| 61 | + |
| 62 | +怎样才能有效的对这些数据进行处理呢? |
| 63 | + |
| 64 | +比如: |
| 65 | + |
| 66 | +实时按位置获取附近的快递员。 |
| 67 | + |
| 68 | +实时统计包裹的流量,快递员的调度,车辆的调度,仓库的选址等等一系列的需求。 |
| 69 | + |
| 70 | +2\. 金融 |
| 71 | + |
| 72 | +金融行业也是数据的生产大户,用户的交易,企业的交易,证券数据等等。 |
| 73 | + |
| 74 | +数据量大,要求实时计算,要求有比较丰富的统计学分析函数等。 |
| 75 | + |
| 76 | +我曾经分享过一个关于模拟证券交易的系统需求分析。有兴趣的童鞋也可以参考 |
| 77 | + |
| 78 | +[《PostgreSQL 证券行业数据库需求分析与应用》](../201704/20170417_01.md) |
| 79 | + |
| 80 | +3\. 物联网 |
| 81 | + |
| 82 | +物联网产生的数据有时序属性,有流计算需求(例如到达阈值触发),有事后分析需求。 |
| 83 | + |
| 84 | +数据量庞大,有数据压缩需求。 |
| 85 | + |
| 86 | +我刚好也写过一些物联网应用的数据库特性分析,这些特性可以帮助物联网实现数据的压缩、流计算等需求。 |
| 87 | + |
| 88 | +[《流计算风云再起 - PostgreSQL携PipelineDB力挺IoT》](../201612/20161220_01.md) |
| 89 | + |
| 90 | +[《旋转门数据压缩算法在PostgreSQL中的实现 - 流式压缩在物联网、监控、传感器等场景的应用》](../201608/20160813_01.md) |
| 91 | + |
| 92 | +[《PostgreSQL 物联网黑科技 - 瘦身几百倍的索引(BRIN index)》](../201604/20160414_01.md) |
| 93 | + |
| 94 | +[《一个简单算法可以帮助物联网,金融 用户 节约98%的数据存储成本》](../201604/20160404_01.md) |
| 95 | + |
| 96 | +[《"物联网"流式处理应用 - 用PostgreSQL实时处理(万亿每天)》](../201512/20151215_01.md) |
| 97 | + |
| 98 | +[《PostgreSQL 黑科技 range 类型及 gist index 助力物联网(IoT)》](../201205/20120517_01.md) |
| 99 | + |
| 100 | +物联网还有一个特性,传感器上报的数据往往包括数字范围(例如温度范围)、地理位置、图片等信息,如何高效的存储,查询这些类型的数据呢? |
| 101 | + |
| 102 | +4\. 监控 |
| 103 | + |
| 104 | +监控行业,例如对业务状态的监控,对服务器状态的监控,对网络、存储等硬件状态的监控等。 |
| 105 | + |
| 106 | +监控行业具有比较强的业务背景,不同的垂直行业,对监控的需求也不一样,处理的数据类型也不一样。 |
| 107 | + |
| 108 | +例如某些行业可能需要对位置进行监控,如公车的轨迹,出了位置电子围栏,发出告警。换了司机驾驶,发出警告。等等。 |
| 109 | + |
| 110 | + |
| 111 | + |
| 112 | +5\. 公安 |
| 113 | + |
| 114 | +公安的数据来自多个领域,例如 通讯记录、出行记录、消费记录、摄像头拍摄、社交、购物记录 等等。 |
| 115 | + |
| 116 | +公安的数据量更加庞大,一个比较典型的场景是风险控制、抓捕嫌犯。涉及基于地理位置、时间维度的人物关系分析(图式搜索)。 |
| 117 | + |
| 118 | +如何才能满足这样的需求呢? |
| 119 | + |
| 120 | +6\. 其他行业 |
| 121 | + |
| 122 | +其他不再列举。 |
| 123 | + |
| 124 | +## 行业痛点 |
| 125 | +如何解决数据孤岛,打通数据共享渠道? |
| 126 | + |
| 127 | +如何高效率的写入日志、行为轨迹、金融数据、轨迹数据等? |
| 128 | + |
| 129 | +如何高效的实时处理数据,根据阈值告警通知,实时分析等? |
| 130 | + |
| 131 | +如何解决大数据的容灾、备份问题? |
| 132 | + |
| 133 | +如何解决大数据的压缩和效率问题? |
| 134 | + |
| 135 | +如何解决数据多维度、类型多,计算复杂的问题? |
| 136 | + |
| 137 | +如何解决企业IT架构弹性伸缩的问题? |
| 138 | + |
| 139 | +总结起来几个关键字: |
| 140 | + |
| 141 | +写入、共享、存储、计算。 |
| 142 | + |
| 143 | +## 方案 |
| 144 | +用到三个组件: |
| 145 | + |
| 146 | + |
| 147 | + |
| 148 | +1\. RDS PostgreSQL |
| 149 | + |
| 150 | +支持时序数据、块级索引、倒排索引、多核并行、JSON、数组存储、OSS_FDW外部读写等特性。 |
| 151 | + |
| 152 | +解决OLTP,GIS应用、复杂查询、时空数据处理、多维分析、冷热数据分离的问题。 |
| 153 | + |
| 154 | +2\. HybridDB PostgreSQL |
| 155 | + |
| 156 | +支持列存储、水平扩展、块级压缩、丰富的数据类型、机器学习库、PLPYTHON、PLJAVA、PLR编程、OSS_FDW外部读写等特性。 |
| 157 | + |
| 158 | +解决海量数据的计算问题。 |
| 159 | + |
| 160 | +3\. OSS 对象存储 |
| 161 | + |
| 162 | +多个RDS实例之间,可以通过OSS_FDW共享数据。 |
| 163 | + |
| 164 | +OSS多副本、跨域复制。 |
| 165 | + |
| 166 | +解决数据孤岛、海量数据存储、跨机房容灾、海量数据备份等问题。 |
| 167 | + |
| 168 | +### 1 写入 |
| 169 | + |
| 170 | + |
| 171 | + |
| 172 | +数据写入分为3条路径: |
| 173 | + |
| 174 | +1\. 在线实时写入,可以走RDS SQL接口,单个实例能达到 百万行/s 以上的写入速度。 |
| 175 | + |
| 176 | +2\. 批量准实时写入,可以走HybridDB SQL接口,单个实例能达到 百万行/s 以上的写入速度。 |
| 177 | + |
| 178 | +3\. 批量准实时写入,比如写文件,可以走OSS写入接口,带宽弹性伸缩。 |
| 179 | + |
| 180 | +### 2 共享 |
| 181 | +多个RDS实例之间,可以通过OSS_FDW共享数据。 |
| 182 | + |
| 183 | +例如A业务和B业务,使用了两个RDS数据库实例,但是它们有部分需求需要共享数据,传统的方法需要用到ETL,而现在,使用OSS_FDW就可以实现多实例的数据共享,而且效率非常高。 |
| 184 | + |
| 185 | + |
| 186 | + |
| 187 | +通过RDS PostgreSQL OSS_FDW的并行读写功能(同一张表的文件,可以开多个worker process进程并行读写),共享数据的读写效率非常高。 |
| 188 | + |
| 189 | + |
| 190 | + |
| 191 | +并行体现三个方面:OSS读写并行、RDS PostgreSQL多核计算并行、RDS PG或HybridDB的多机并行。 |
| 192 | + |
| 193 | + |
| 194 | + |
| 195 | +### 3 存储 |
| 196 | + |
| 197 | +对于实时数据,使用RDS PostgreSQL, HybridDB的本地数据存储。对于需要分析、需要共享的数据,使用OSS进行存储。 |
| 198 | + |
| 199 | +OSS相比计算资源的存储更加的廉价,在确保灵活性的同时,降低了企业的IT成本。 |
| 200 | + |
| 201 | +通过OSS对象存储,解决了企业的数据冗余、成本高等问题,满足了数据的备份、容灾等需求。 |
| 202 | + |
| 203 | +### 4 计算 |
| 204 | + |
| 205 | + |
| 206 | + |
| 207 | +通过RDS PostgreSQL, HybridDB, OSS的三个基本组件,实现了计算资源、存储资源的分离。 |
| 208 | + |
| 209 | +因为计算节点的数据量少了(大部分数据都存在OSS了),计算节点的扩容、缩容、容灾、备份都更加方便。 |
| 210 | + |
| 211 | +#### 计算本身分为以下几种 |
| 212 | + |
| 213 | +1\. 流式计算 |
| 214 | + |
| 215 | +流式计算分为两种,一种是实时统计,另一种是设置阈值进行实时的告警。 |
| 216 | + |
| 217 | +通过pipelinedb(base on postgresql)可以实现这两类流计算。 |
| 218 | + |
| 219 | +好处: |
| 220 | + |
| 221 | +SQL标准接口,丰富的内置函数支持复杂的流计算需求,丰富的数据类型(包括GIS,JSON等)支持更多的流计算业务场景,异步消息通知机制支持第二类流计算需求。 |
| 222 | + |
| 223 | +pipelinedb正在进行插件化改造,以后可以作为PostgreSQL的插件使用。 |
| 224 | + |
| 225 | +https://github.com/pipelinedb/pipelinedb/issues?q=is%3Aissue+is%3Aopen+label%3A%22extension+refactor%22 |
| 226 | + |
| 227 | + |
| 228 | + |
| 229 | +例如在监控领域,使用流计算的异步消息机制,可以避免传统主动问询监控的无用功问题。 |
| 230 | + |
| 231 | + |
| 232 | + |
| 233 | +2\. 实时交互业务 |
| 234 | + |
| 235 | +传统的OLTP需求,使用RDS PostgreSQL可以满足。 |
| 236 | + |
| 237 | +PostgreSQL的特性包括:GIS、JSON、数组、冷热分离、水平分库、K-V类型、多核并行、块级索引、倒排索引等。 |
| 238 | + |
| 239 | +PostgreSQL支持的场景包括:流计算、图式搜索、时序数据、路径规划、模糊查询、全文检索、相似查询、秒杀、基因、金融、化学、GIS应用、复杂查询、BI、多维分析、时空数据搜索等。 |
| 240 | + |
| 241 | +覆盖银行、保险、证券、物联网、互联网、游戏、天文、出行、电商、传统企业等行业。 |
| 242 | + |
| 243 | +3\. 准实时分析 |
| 244 | + |
| 245 | +结合OSS对象存储,RDS PostgreSQL和HybridDB都可以实现准实时的分析。 |
| 246 | + |
| 247 | +同一份OSS的数据,也可以在多个实例之间进行共享,同时访问。 |
| 248 | + |
| 249 | +4\. 离线分析、挖掘 |
| 250 | + |
| 251 | +结合OSS对象存储,RDS PostgreSQL和HybridDB都可以实现对离线数据的分析和挖掘。 |
| 252 | + |
| 253 | +RDS PostgreSQL 支持单机多核并行,HybridDB for PostgreSQL支持多机并行。用户可以根据计算量进行选择。 |
| 254 | + |
| 255 | +#### 计算需要具备的能力 |
| 256 | +计算的灵魂是类型的支持、以及类型的处理。 |
| 257 | + |
| 258 | +1\. PostgreSQL内置了丰富的类型支持,包括(数字、字符串、时间、布尔、枚举、数组、范围、GIS、全文检索、bytea、大对象、几何、比特、XML、UUID、JSON、复合类型等),同时支持用户自定义的类型。可以支持几乎所有的业务场景 |
| 259 | + |
| 260 | +2\. 操作符,为了满足对数据的处理需求,PG对每一种支持的类型,都支持非常丰富的操作, |
| 261 | + |
| 262 | +3\. 内置函数,PG内置了丰富的统计学函数、三角函数、GIS处理函数,MADlib机器学习函数等。 |
| 263 | + |
| 264 | +4\. 自定义计算逻辑,用户可以通过C, python, java, R等语言,定义数据的处理函数。扩展PostgreSQL, HybridDB for PostgreSQL的数据处理能力。 |
| 265 | + |
| 266 | +5\. 聚合函数,内置了丰富的聚合函数,支持数据的统计。 |
| 267 | + |
| 268 | +6\. 窗口查询功能的支持。 |
| 269 | + |
| 270 | +7\. 递归查询的支持。 |
| 271 | + |
| 272 | +8\. 多维分析语法的支持。 |
| 273 | + |
| 274 | +## 方案小结 |
| 275 | +### RDS PostgreSQL 优势 |
| 276 | +主要体现在这几个方面 |
| 277 | + |
| 278 | +1\. 性能 |
| 279 | + |
| 280 | +RDS PostgreSQL主要处理在线事务以及少量的准实时分析。 |
| 281 | + |
| 282 | +PG OLTP的性能可以参考这篇文档,性能区间属于商业数据库水准。 |
| 283 | + |
| 284 | +[《数据库界的华山论剑 tpc.org》](../201701/20170125_01.md) |
| 285 | + |
| 286 | +PG 的OLAP分析能力,可以参考这篇文档,其多核并行,JIT,算子复用等特性,使得PG的OLAP能力相比其他RDBMS数据库有质的提升。 |
| 287 | + |
| 288 | +[《分析加速引擎黑科技 - LLVM、列存、多核并行、算子复用 大联姻 - 一起来开启PostgreSQL的百宝箱》](../201612/20161216_01.md) |
| 289 | + |
| 290 | +PostgreSQL 10 在HTAP方面还有更多的增强。 |
| 291 | + |
| 292 | +2\. 功能 |
| 293 | + |
| 294 | +功能也是PostgreSQL的强项,在上一章《计算需要具备的能力》有详细介绍。 |
| 295 | + |
| 296 | +3\. 扩展能力 |
| 297 | + |
| 298 | +计算能力扩展,通过增加CPU,可以扩展复杂计算的性能。 |
| 299 | + |
| 300 | +存储能力扩展,通过OSS存储以及oss_fdw插件,可以扩展RDS PG的存储能力,打破存储极限。 |
| 301 | + |
| 302 | +4\. 成本 |
| 303 | + |
| 304 | +存储成本:由于大部分需要分离的数据都存储到OSS了,用户不再需要考虑这部分的容灾、备份问题。相比存储在数据库中,存储成本大幅降低。 |
| 305 | + |
| 306 | +开发成本:RDS PG, HybridDB PG都支持丰富的SQL标准接口,访问OSS中的数据(通过TABLE接口),使用的也是SQL标准接口。节省了大量的开发成本, |
| 307 | + |
| 308 | +维护成本:使用云服务,运维成本几乎为0。 |
| 309 | + |
| 310 | +5\. 覆盖行业 |
| 311 | + |
| 312 | +覆盖了银行、保险、证券、物联网、互联网、游戏、天文、出行、电商、传统企业等行业。 |
| 313 | + |
| 314 | +### HybridDB PostgreSQL 优势 |
| 315 | +1\. 性能 |
| 316 | + |
| 317 | +HybridDB PostgreSQL为MPP架构,计算能力出众。 |
| 318 | + |
| 319 | +2\. 功能 |
| 320 | + |
| 321 | +在上一章《计算需要具备的能力》有详细介绍。 |
| 322 | + |
| 323 | +3\. 扩展能力 |
| 324 | + |
| 325 | +计算能力扩展,通过增加计算节点数,可以扩展复杂计算的性能。 |
| 326 | + |
| 327 | +存储能力扩展,通过OSS存储以及oss_fdw插件,可以扩展RDS PG的存储能力,打破存储极限。 |
| 328 | + |
| 329 | +4\. 成本 |
| 330 | + |
| 331 | +存储成本:由于大部分需要分离的数据都存储到OSS了,用户不再需要考虑这部分的容灾、备份问题。相比存储在数据库中,存储成本大幅降低。 |
| 332 | + |
| 333 | +开发成本:RDS PG, HybridDB PG都支持丰富的SQL标准接口,访问OSS中的数据(通过TABLE接口),使用的也是SQL标准接口。节省了大量的开发成本, |
| 334 | + |
| 335 | +维护成本:使用云服务,运维成本几乎为0。 |
| 336 | + |
| 337 | +5\. 覆盖行业 |
| 338 | + |
| 339 | +覆盖了银行、保险、证券、物联网、互联网、游戏、天文、出行、电商、传统企业等行业。 |
| 340 | + |
| 341 | +### 典型用法 |
| 342 | + |
| 343 | + |
| 344 | + |
| 345 | + |
| 346 | +## 参考 |
| 347 | +[《RDS PostgreSQL : 使用 oss_fdw 读写OSS对象存储》](https://help.aliyun.com/document_detail/44461.html) |
| 348 | + |
| 349 | +[《HybridDB PostgreSQL : 使用 oss_fdw 读写OSS对象存储》](https://help.aliyun.com/document_detail/35457.html) |
| 350 | + |
| 351 | + |
0 commit comments