[未完待续] PostgreSQL 应用场景 与 TEST CASE(压测) 精华

4 minute read

背景

PostgreSQL 架构

进程模型和介绍

共享内存

物理文件

IO操作

异步IO

同步IO

表扫描

索引扫描

并行扫描

HA

网络、CPU、内存、磁盘 标准测试

iperf

pi

memtest+

fio的测试规格。

pgbench 压测工具的讲解

测试模型 - 长短连接

测试模型 - 连接数

测试模型 - 软硬解析

测试模型 - 随机数分布算法

测试模型 - 规格

小、中混合

## 规格搭配算法:

大规格:分配给单个实例 80% 的资源(根据主机出厂指标分配:CPU\IOPS\MEMORY)。

小规格:多个小规格填满 80% 的资源(根据主机出厂指标分配:CPU\IOPS\MEMORY)。 单个实例规格 ( 1核,1G,600 IOPS )

中、小规格混合:中规格,( 16核,128G,36000 IOPS ) ,小规格按实际剩余资源(以80%为水位)填补。

压测的数据量scale:

大规格(50亿数据量,pgbench -i -s 10000),中规格(10亿数据量,pgbench -i -s 2000),小规格(500万数据量,pgbench -i -s 50)。

压测连接数:

大规格(规格核数8),中规格(规格核数8),小规格(规格核数*8)。

需求:

提供脚本,数据库postgresql.auto.conf模板

应用场景1 -

业务背景

test case 1

1、测试背景

2、硬件需求特性

3、结构设计

4、索引

5、UDF

6、初始化数据(映射,规格:数据量)

7、测试脚本(映射,规格:参数范围)

8、测试参数(映射,规格:线程、连接数、长短连接、绑定变量与否)

9、pgbench 输出指标

10、稳定性基线(tps, 响应延迟, 方差。 (最大,最小,平均))

11、性能基线(tps, 响应延迟, 方差。 (最大,最小,平均))

test case 2

……………….

应用场景2 -

业务背景

test case 1

test case 2

其他场景

测试规格

2 C, 5000 IOPS, 16 G
4 C, 10000 IOPS, 32 G
8 C, 20000 IOPS, 64 G
16 C, 50000 IOPS, 128 G
32 C, 100000 IOPS, 256 G
64 C, 200000 IOPS, 480 G

每个规格,覆盖测试并发:

1, 1*Cores, 2*Cores, 3*Cores, 4*Cores, 8*Cores, 16*Cores 并发。

PostgreSQL数据库参数

# 规格相关(8C, 64G为例)
shared_buffers = 16GB                  # 1/4 主机内存 = 16G
work_mem = 64MB                        # 1/4 主机内存 / 256 = 16G/256 = 64MB (假设256个并发同时使用work_mem)                        
wal_buffers = 512MB                    # min( 2047MB, shared_buffers/32 ) = 512MB
maintenance_work_mem = 2GB             # min( 2G, (1/4 主机内存)/autovacuum_max_workers ) = min(2G, 16/5) = 2GB
max_wal_size = 32GB                    # shared_buffers*2 = 16*2 = 32GB
min_wal_size = 8GB                     # max_wal_size/4 = 32/4 = 8GB
effective_cache_size = 40GB            # 5/8 主机内存 = 40GB
max_parallel_workers_per_gather = 6    # 主机cores-2 = 8-2 = 6

# 优化器相关
# https://github.com/digoal/blog/blob/master/201311/20131126_03.md
seq_page_cost = 1.0
random_page_cost = 1.2
cpu_tuple_cost = 0.01
cpu_index_tuple_cost = 0.005
cpu_operator_cost = 0.0025
parallel_tuple_cost = 0.1
parallel_setup_cost = 1000.0
min_parallel_table_scan_size = 8MB
min_parallel_index_scan_size = 512kB

# 其他
listen_addresses = '0.0.0.0'
port = 1921
max_connections = 2000
superuser_reserved_connections = 3
unix_socket_directories = '.'
unix_socket_permissions = 0700
dynamic_shared_memory_type = posix
vacuum_cost_delay = 0
bgwriter_delay = 10ms
bgwriter_lru_maxpages = 500
bgwriter_lru_multiplier = 5.0
effective_io_concurrency = 0
max_worker_processes = 128
max_parallel_workers = 128
wal_level = replica
fsync = on
synchronous_commit = off
full_page_writes = on     # 支持原子写超过BLOCK_SIZE的块设备,在对齐后可以关闭。或者支持cow的文件系统可以关闭。
wal_writer_delay = 10ms
wal_writer_flush_after = 1MB
checkpoint_timeout = 35min
archive_mode = off
max_wal_senders = 10
max_replication_slots = 10
wal_receiver_status_interval = 1s
max_logical_replication_workers = 4
max_sync_workers_per_subscription = 2
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
log_min_duration_statement = 5s
log_checkpoints = on
log_connections = on
log_disconnections = on
log_error_verbosity = verbose
log_line_prefix = '%m [%p] '
log_lock_waits = on
log_statement = 'all'
log_timezone = 'PRC'
log_autovacuum_min_duration = 0 
autovacuum_max_workers = 5
autovacuum_naptime = 60s
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.1
autovacuum_freeze_max_age = 1000000000
autovacuum_multixact_freeze_max_age = 1200000000
autovacuum_vacuum_cost_delay = 0
statement_timeout = 0
vacuum_freeze_min_age = 50000000
vacuum_freeze_table_age = 800000000
vacuum_multixact_freeze_min_age = 50000000
vacuum_multixact_freeze_table_age = 800000000
datestyle = 'iso, ymd'
timezone = 'PRC'
lc_messages = 'en_US.UTF8'
lc_monetary = 'en_US.UTF8'
lc_numeric = 'en_US.UTF8'
lc_time = 'en_US.UTF8'
default_text_search_config = 'pg_catalog.simple'

场景

5、WITH查询 (OLTP)

7、CTE递归查询with recursive

8、树形类型ltree查询 (OLTP)

1、背景

层级结构的数据的存储与高效率检索

2、设计

3层,每一个节点的下一层100个元素,共100万记录。(通常一家公司100万人已经很多了。)

求任意一个节点的所有上层节点,所有下层节点。

3、准备测试表

create extension ltree;

create table t_ltree(
  id int primary key,
  path ltree
);

4、准备测试数据

insert into t_ltree(0, '0');

do language plpgsql $$
declare
begin
  for x in 1..3
  loop
    for y in 100^(i-1)+1..100^i
    loop
      -- 
    end loop;
  end loop;
end;
$$;

blob, clog, large obj 性能

ssl 性能

列存储

24、包含子查询 (OLTP)

25、包含嵌套查询 (OLTP)

26、包含聚合查询 (OLAP)

partial index.

sharding, 读写分离

28、包含? op ANY|ALL (ARRAY)关键字 (OLTP)

29、带多个判断条件的查询 (OLTP)

30、intersect 查询 (OLAP)

31、except 查询 (OLAP)

32、union all 查询 (OLAP)

32、union 查询 (OLAP)

47、JSONB 点查询 (OLTP)

48、JSONB 全文检索 (OLTP)

49、DB端业务逻辑应用 - 存储过程编程应用(plpgsql) (OLTP)

50、FDW 下推(select clause, where , sort , join , agg) (OLTP+OLAP)

51、阿里云 OSS外部表读写,支持压缩格式。 (OLAP)

54、hll 估值统计 (OLAP)

55、SQL流计算、实时聚合

56、图业务,图式搜索

57、导航业务,最短路径

PostgreSQL比Oracle或其他数据库有优势的场景

先罗列一下场景,后期补充实际的SQL。在PARSER到对应SQL时可以给出提示和转换SQL。

1、ltree树形类型,可以简化递归 SQL,或connect by表设计。

create extension ltree;


CREATE TABLE test (path ltree);
INSERT INTO test VALUES ('Top');
INSERT INTO test VALUES ('Top.Science');
INSERT INTO test VALUES ('Top.Science.Astronomy');
INSERT INTO test VALUES ('Top.Science.Astronomy.Astrophysics');
INSERT INTO test VALUES ('Top.Science.Astronomy.Cosmology');
INSERT INTO test VALUES ('Top.Hobbies');
INSERT INTO test VALUES ('Top.Hobbies.Amateurs_Astronomy');
INSERT INTO test VALUES ('Top.Collections');
INSERT INTO test VALUES ('Top.Collections.Pictures');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Stars');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Galaxies');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Astronauts');
CREATE INDEX path_gist_idx ON test USING GIST (path);
CREATE INDEX path_idx ON test USING BTREE (path);


                        Top
                     /   |  \
             Science Hobbies Collections
                 /       |              \
        Astronomy   Amateurs_Astronomy Pictures
           /  \                            |
Astrophysics  Cosmology                Astronomy
                                        /  |    \
                                 Galaxies Stars Astronauts


ltreetest=> SELECT path FROM test WHERE path <@ 'Top.Science';
                path
------------------------------------
 Top.Science
 Top.Science.Astronomy
 Top.Science.Astronomy.Astrophysics
 Top.Science.Astronomy.Cosmology
(4 rows)

ltreetest=> SELECT path FROM test WHERE path ~ '*.Astronomy.*';
                     path
-----------------------------------------------
 Top.Science.Astronomy
 Top.Science.Astronomy.Astrophysics
 Top.Science.Astronomy.Cosmology
 Top.Collections.Pictures.Astronomy
 Top.Collections.Pictures.Astronomy.Stars
 Top.Collections.Pictures.Astronomy.Galaxies
 Top.Collections.Pictures.Astronomy.Astronauts
(7 rows)

ltreetest=> SELECT path FROM test WHERE path ~ '*.!pictures@.*.Astronomy.*';
                path
------------------------------------
 Top.Science.Astronomy
 Top.Science.Astronomy.Astrophysics
 Top.Science.Astronomy.Cosmology
(3 rows)

ltreetest=> SELECT path FROM test WHERE path @ 'Astro*% & !pictures@';
                path
------------------------------------
 Top.Science.Astronomy
 Top.Science.Astronomy.Astrophysics
 Top.Science.Astronomy.Cosmology
 Top.Hobbies.Amateurs_Astronomy
(4 rows)

ltreetest=> SELECT path FROM test WHERE path @ 'Astro* & !pictures@';
                path
------------------------------------
 Top.Science.Astronomy
 Top.Science.Astronomy.Astrophysics
 Top.Science.Astronomy.Cosmology
(3 rows)

2、文本搜索(支持全文检索、模糊查询、正则查询、相似查询)

支持全文索引,模糊查询索引、正则查询索引、相似查询索引。

亿级文本,毫秒级响应。

3、空间数据处理(点、线、面、3D、4D对象;地理信息库支持平面坐标操作、球坐标操作)

支持空间索引,空间对象计算。

4、多值类型(jsonb, array, tsvector, hstore)

支持多值列倒排索引。

5、多字段任意组合条件过滤查询

三种内置技术,解决任意组合条件过滤查询效率问题:

bloom索引,gin多列索引,单列多索引bitmap scan。

5、地理数据支持路径规划

支持多种图式搜索算法

6、秒杀

支持advisory lock。36万TPS 秒杀更新同一记录。

7、物联网,区间搜索(BRIN)

支持BRIN索引,BITMAP扫描。效率高,索引小(几百KB支持几百GB的表)。

8、FDW下推能力

下推(select clause, where , sort , join , agg)

9、机器学习(MADLib)

支持机器学习SQL库MADlib,支持plr, plpython。

阿里云HybridDB for PostgreSQL支持import python library。

10、支持多种索引接口

《PostgreSQL 9种索引的原理和应用场景》

11、插件丰富,垂直领域扎根业务能力强

12、扩展能力强(类型、操作符、索引、UDF、采样接口、自定义外部数据访问接口、存储过程语言接口、扫描接口)

13、支持阿里云OSS对象存储外部表

14、支持存储过程

15、支持NOSQL特性

16、支持多核 并行计算

17、支持sharding(基于FDW)

18、支持异构数据访问(通过外部表读写Oracle, mysql, hadoop, 等。)

https://wiki.postgresql.org/wiki/Fdw

参考

《PostgreSQL、Greenplum 应用案例宝典《如来神掌》 - 目录》

《数据库选型之 - 大象十八摸 - 致 架构师、开发者》

《PostgreSQL 使用 pgbench 测试 sysbench 相关case》

《数据库界的华山论剑 tpc.org》

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

Flag Counter

digoal’s 大量PostgreSQL文章入口