阿里云 PostgreSQL_案例介绍3 | 学习笔记

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 简介:快速学习阿里云 PostgreSQL_案例介绍3

开发者学堂课程【 PostgreSQL 云上开发实践:阿里云PostgreSQL_案例介绍3】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/528/detail/7102

 


阿里云 PostgreSQL_案例介绍3


内容介绍:

一、Case9(订阅、单元化、容灾、多写)

二、Case10(跨域、跨库、sharding)

三、Case11(流式处理-阅后即焚)

四、Case12(秒杀)

五、Case13共享xxx(多表 JOIN 实时分析)


一、Case9(订阅、单元化、容灾、多写)

· 线上 RDS PG

· 逻辑订阅、或物理订阅 到用户端 PG

image.png

案例-架构设计、代码、实操手册:

· 订阅功能(单元化)

https://github.com/digoal/blog/blob/master/201707/20170711_01.md


二、Case10(跨域、跨库、sharding)

· 传统企业数据库上云,突破单库容量限制

——多库组集群、相互可访问、可写、可同步。

——功能点: FDW (外部表、远程表)、DBLINK 、匿名、逻辑订阅。

案例-架构设计、代码、实操手册:

· FDW

-总览:https://wiki.postgresql.org/wiki/Fdw

-文件

fdw:https://www.postgresql.org/docs/10/static/file-fdw.html

-PGfdw:https://www.postgresql.org/docs/10/static/postgres-fdw.html -MySQLfdw:https://github.com/EnterpriseDB/mysgl_fdw

-OracleFDW:https://pgxn.org/dist/oracle_fdw/

-SQL Server FDW:https://pgxn.org/dist/tds_fdw/

·  DBLINK

https://www.postgresql.org/docs/10/static/dblink.html

· 订阅功能(单元化)

https://github.com/digoal/blog/blob/master/201702/20170227_01.md https://github.com/digoal/blog/blob/master/201707/20170711_01.md


三、Case11(流式处理-阅后即焚)

流式处理-阅后即焚-消费

10亿,消费395.2万行/s

56

3952

14毫秒

物联网-阅后即焚-读写并测

写入:193万行/s,消费:418万行/s

56

 

 

物理网-阅后即焚-JSON+函数流计算-读写并测

写入:180万行/s,消费:145.8万行/s

56

 

 

· 流式处理,高并发写入,快速消费处理。

· 处理后的数据被删除。

· 要求:

——数据快速写入 式、事务

——数据写入后必须持久化

——快速消费被写入的记录(例如订阅,或者用于业务上的流式计算,计算结果保留)

——消费和计算必须在一个事务完成

流计算和数据库有关系吗?——有

为什么需要流计算?

· 实时分析需求

-大查询的时效性

· 过滤有效数据

-实时数据清洗

· 预警需求

-实时数据预警,电子围栏、物联网异常指标、监控系统

PostgreSQL 流计算原理:

方法1、pipelineDB (批处理,低延迟,大吞吐,100+万行/s)

方法2、rule、trigger (实时处理,实时,小吞吐,单步写30+万行/s,批量写100+万行/s)

方法3、insert on conflict (实时处理,实时,小吞吐,单步写30+万行/s,批量写100+万行/s)

方法4、阅后即焚(批处理,低延迟,大吞吐,100+万行/s)

案例1-流式预警:

· 根据规则发现数据异常,并通知应用程序

· 传统手段

- 异步查询、实效性较差、重复劳动较多

· 流计算手段

- 实时或异步、异步消息通道

image.png

select xxx from xxx

where 指标字段>=阈值

and xxxx

order by xxx;

问题:

1. 索引巨大、

2. 存在大量无用功查询。

create index idx on table(字段)where 阈值>xxx;

只有异常数据才建索引。Partial index

image.png

Syntax:

NOTIFY channel [ , payload ]

Syntax:

LISTEN channel

· create table tbl(sid int,content jsonb);

· create or replace function monitor(jisonb)returns boolean as $$

· declare

· begin

——if xxx then return true; --条件1

——else if xxx then return true; --件2,

——else if .....; --条件N

——else return false;

——end if;

· end;

· $$ language plpgsql strict;

· create or replace rule r1 as on insert to tbl do {also | instead} select pg_notify(‘channel_name',(NEW.content)::text) where monitor(NEW.content);

——可落明细、可不落明细、可按需落明细,实时压缩(例如5分钟落一个明细点,其他只落告警点)。

· client:

——listen 'channel_name';

image.png

案例2-流式统计(avg,count,min,max,sum)

https://github.com/digoal/blog/blob/master/201711/20171123_02.md

image.png

分区+批量写入336万行/s:

insert into tbl(sid,v1,crttime)values(:sid,:v1,now())

on conflict (sid) do update set

v1=excluded.v1,

crt_time=excluded.crt_time,

cnt=tbl.cnt+1,

sum_v=case tb1.cnt when 1 then tbl.v1+excluded.v1 else tb1.sum_v+excluded.v1end  ,

min_v=least(tbl.min_v,excluded.v1), max_v=greatest(tbl.max_v,excluded.v1);

多维流式计算

1、定义明细表

create table tb1(c1 int not null, c2 int not null,c3 int not null,c4 int not null,c5 int not null);

2、定义每个维度的目标统计表

Create table cv1_tb1(c1 int primary key,cnt int8 default 1);

Create table cv2_tb1(c2 int,c3 int,c5 int,sum_v float8 default 0,cnt int8 default 1, primary key (c2,c3));

其他维度

3、定义维度表的 insert on conflict SQL

· insert into cv1 tb1(c1) values(NEW.c1)on conflict(c1) do update set cnt=cv1 tb1.cnt+1;

· insert into cv2tb1(c2c3c5)values(NEW.c2,NEW.c3,NEW.c5)on conflict(c2,c3) do update set cnt=cv2_tb1.cnt+1

sum_v=case cv2 tb1.cnt when 1 then cv2_ tb1.c5+excluded.c5 else cv2_tb1.sum_v+excluded.c5 end;

4、定义明细表 trigger 或 rule,顺序调用 insertonconflict 写入多个维度表

· create rule r1 as on insert to tb1 do {instead | also} insert into cv1_tb1(c1) values(NEW.c1) on conflict(c1) do update set cnt=cv1_tb1.cnt+1;

· create rule r2 as on insert to tb1 do {instead | also} insert into cv2_tb1(c2,c3,c5) values(NEW.c2,NEW.c3,NEW.c5) on conflict(c2,c3)do update set cnt=cv2_tb1.cnt+1,sum_v=case cv2_tb1.cnt when 1 then cv2_tb1.c5+excluded.c5 else cv2_tb1.sum_v+excluded.c5 end;

案例3-流式概率计算

http://docs.pipelinedb.com/probabilistic.html

- bloom filter: distinct概率判定,select distinct (...) 快速判断

- count-min sketch: per element's freq 概率 select

col,count(*) group by col 快速统计+判定

- filtered-space saving top-k: element's bucket & freq 概率 - HLL: COUNT(DISTINCT ...)

- T-Digest:Rank base statistic.percentile_cont 水位值.

案例3-流式实时估算

https://github.com/digoal/blog/blob/master/201711/20171123_02.md

· HLL插件

· create extension hll;

· create table tbl(

- grpid int, userid int,dt date,

- cnt int8 default 1,

- hll_userid hll default hll_empty(),--估算字段

- primary key(grpid,dt)

- );

·insert into tbl (grpid,userid,dt) values()on conflict (grpid,dt)

· do update set

· cnt=tblcnt+1

hll_userid=case tbl.cnt when 1 then hll add(hll_add(tbl.hll_userid,hll_hash_integer tb1.userid))hll_hash_integer(excluded.userid)else

hll_add(tb1.hll _userid, hll_hash_integer (excluded.userid)) end;

滑窗分析- RDS PG与HDB PG都适用

image.png

· 估值滑窗(最近7天UV)

-SELECT date,#hll_union_agg(users)OVER seven_days

FROM daily_uniques WINDOW seven_days AS(ORDER BY date ASC ROWS 6 PRECEDING);

·统计滑窗(最近7天精确UV,SUM,AVG。。。)

-SELECT date,count(distinct users)OVER seven_days,

sum(x)OVER seven_days,avg(x)OVER seven_days FROM daily_uniques WINDOW seven_days AS(ORDER BY date ASC ROWS 6 PRECEDING);

案例4-流式阅后即焚:

· 流式处理,高并发写入,快速消费处理。

· 处理后的数据被删除。

· 要求:  

——数据快速写入  

——数据写入后必须持久化

——快速消费被写入的记录(例如订阅,或者用于业务上的流式计算,计算结果保留)

——消费和计算必须在一个事务完成

https://github.com/digoal/blog/blob/master/201711/20171107_32.md

· 流式处理应用

· create table tbl1(id int, info jsonb);

· insert into tbl ....   

· 异步处理

· UDF 写法,UDF 内实现阅后即焚

· CTE 写法,单个 SQL 实现阅后即焚

—with t1 as (delete from tb1 where ctid = any (array(select ctid from tb1 limit10)) returning*)

—select pg_notify('channel_name', values) from t1;

—-- deal with t1's values;

案例5-实时经营分析1

经营分析系统、决策系统

https://github.com/digoal/blog/blob/master/201711/20171126_01.md

案例-架构设计、代码、实操手册

https://github.com/digoal/blog/blob/master/201711/20171111_01.md https://github.com/digoal/blog/blob/master/201711/20171107_28.md https://github.com/digoal/blog/blob/master/201711/20171107_32.md https://github.com/digoal/blog/blob/master/201711/20171107_33.md https://github.com/digoal/blog/blob/master/201608/20160827_01.md https://github.com/digoal/blog/blob/master/201711/20171123_02.md https://github.com/digoal/ blog/blob/master/201711 20171126_01.md


四、Case12(秒杀)

· 超轻锁( advisoryLOCK )解决高并发锁竞争问题

- 手段:在 CPU 运算发现行锁之前就知道是不是有冲突,大大缩短 CPU 计算资源,等待资源

image.png

ADLock 代替行锁-秒杀

· 高并发扣减库存

· 高并发争抢锁

—update tb1 set x=x where id=? and pg_try_advisory_xact _lock(id)returning*;

image.png

1.连接 redis 判断是否还有库存

2.有,去 PG 扣减( ADLock )。没有则直接返回。

3.扣减成功,去 redis 更新库存

案例-架构设计、代码、实操手册

https://github.com/digoal/blog/blob/master/201711/20171107_31.md

https://github.com/digoal/blog/blob/master/201611/20161117_01.md

https://github.com/digoal/blog/blob/master/201509/20150914_01.md


五、Case13共享xxx(多表JOIN实时分析)

· Itress 树类型、消除 JOIN

——(空间换世界、物化视图)

image.png

Itree 树类型+R-T索引

· Itree

-https://www.postgresgl.org/docs/10/static/ltree.html

-SELECT path FROM test WHERE path~’*.Astronomy.*1’;

-SELECT path FROM test WHERE path~’*.!pictures@.*.Astronomy.*’;

-SELECT path FROM test WHERE path @'Astro*%&!pictures@';

-SELECT path FROM test WHERE path @'Astro*&!pictures@';

案例-架构设计、代码、实操手册

https://github.com/digoal/blog/blob/master/201709/20170923_01.md

场景映射与特性匹配

· 非结构化数据类型选择 -json,hstore,xml 类型

· 全文检索需求 -采用 tsvector 类型

· 模糊查询

-含前缀时,使用 b-tree 索引

-含后缀时,使用 reverse(col)b-tree 表达式索引

· 前后模糊  -采用 pg_trgm 插件,gin 索引。

· 相似搜索  -采用 pg_trgm 插件,gin 索引。

· 短文特征向量,海明相似  -采用 mlar 插件,gin 索引。

· 多字段任意搜索

-采用 gin 复合索引。

-采用多个单列索引。

· 多值类型搜索

- 采用数组类型。

-采用 gin 索引。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
339 0
|
2月前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
7月前
|
Cloud Native 关系型数据库 OLAP
云原生数据仓库产品使用合集之阿里云云原生数据仓库AnalyticDB PostgreSQL版的重分布时间主要取决的是什么
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
6月前
|
SQL 关系型数据库 PostgreSQL
【sql】PostgreSQL物化视图表使用案例
【sql】PostgreSQL物化视图表使用案例
70 0
|
存储 人工智能 关系型数据库
5倍性能提升,阿里云AnalyticDB PostgreSQL版新一代实时智能引擎重磅发布
2023 云栖大会上,AnalyticDB for PostgreSQL新一代实时智能引擎重磅发布,全自研计算和行列混存引擎较比开源Greenplum有5倍以上性能提升。AnalyticDB for PostgreSQL与通义大模型家族深度集成,推出一站式AIGC解决方案。阿里云新发布的行业模型及“百炼”平台,采用AnalyticDB for PostgreSQL作为内置向量检索引擎,性能较开源增强了2~5倍。大会上来自厦门国际银行、三七互娱等知名企业代表和瑶池数据库团队产品及技术资深专家们结合真实场景实践,深入分享了最新的技术进展和解析。
5倍性能提升,阿里云AnalyticDB PostgreSQL版新一代实时智能引擎重磅发布
|
7月前
|
安全 关系型数据库 数据库
上新|阿里云RDS PostgreSQL支持PG 16版本,AliPG提供丰富自研能力
AliPG在社区版16.0的基础上,在安全、成本、可运维性等多个方面做了提升,丰富的内核/插件特性支持,满足业务场景的需求
|
SQL 关系型数据库 分布式数据库
阿里云PolarDB是一款兼容MySQL、PostgreSQL和SQL Server等多种数据库协议的产品
阿里云PolarDB是一款兼容MySQL、PostgreSQL和SQL Server等多种数据库协议的产品
835 6
|
SQL 存储 自然语言处理
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
在当今社交媒体的时代,人们通过各种平台分享自己的生活、观点和情感。然而,对于平台管理员和品牌经营者来说,了解用户的情感和意见变得至关重要。为了帮助他们更好地了解用户的情感倾向,我们可以使用PostgreSQL中的pg_jieba插件对这些发帖进行分词和情感分析,来构建一个社交媒体情感分析系统,系统将根据用户的发帖内容,自动判断其情感倾向是积极、消极还是中性,并将结果存储在数据库中。
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
|
SQL 存储 自然语言处理
玩转阿里云PostgreSQL,通过pg_jieba对豆瓣影评进行热评分析
在当今社交媒体的时代,人们通过各种平台分享自己的生活、观点和情感。然而,对于平台管理员和品牌经营者来说,了解用户的情感和意见变得至关重要。为了帮助他们更好地了解用户的情感倾向,我们可以使用PostgreSQL中的pg_jieba插件对这些发帖进行分词和情感分析,来构建一个社交媒体情感分析系统,系统将根据用户的发帖内容,自动判断其情感倾向是积极、消极还是中性,并将结果存储在数据库中。 本文通过针对kaggle数据集中的豆瓣影评的中文评论数据,通过阿里云的PostgreSQL中的pg_jieba插件进行分词(可自定义多个词典,并且切换自定义词典进行分词),基于分词的结果进行统计分析。
|
NoSQL 关系型数据库 MySQL
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等,阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
212 0