作者
digoal
日期
2017-10-11
标签
PostgreSQL , 应用场景 , test case , pgbench
背景
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_buffers2 = 162 = 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、支持多种索引接口
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》
https://www.postgresql.org/docs/10/static/pgbench.html
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.