GaussDB(DWS)支持在SQL语句执行出错时的自动重试功能(下文简称CN Retry)。
对于来自gsql客户端、JDBC、ODBC驱动的SQL语句,在SQL语句执行失败时,CN端 能够自动识别语句执行过程中的报错,并重新下发任务进行自动重试。
该功能的限制和约束如下:
● 功能范围限制:
– 仅能提高故障发生时SQL语句执行成功率,不能保证100%的执行成功。
– CN Retry默认开启,开启后temp表会记录日志,关闭CN Retry后,temp表 即不会记录日志,因此不能在使用temp表时反复打开/关闭CN Retry开关,
否则主备切换后再CN Retry会造成数据不一致。
– CN Retry默认开启,开启后新创建的unlogged表会忽视unlogged关键字,建 成普通表。关闭CN Retry后,unlogged表不会记录日志,因此不能在使用 unlogged表时反复打开/关闭CN Retry开关,否则主备切换后再CN Retry会 造成数据不一致。
– 在使用gds进行数据导出时,支持CN Retry。现有机制导出时会对重复文件进 行检测并删除相同的文件,因此建议不要对相同的外表重复导出数据,除非 确定数据目录中相同文件名的文件需要删除。
● 错误类型约束:
SQL语句出错时能够被识别和重试的错误,仅限在错误类型列表(请参考表5-1)
中定义的错误。
● 语句类型约束:
支持单语句CN Retry、存储过程、函数、匿名块。不支持事务块中的语句。
● 存储过程语句约束:
– 包含EXCEPTION的存储过程,如果在执行过程中(包含语句块执行和 EXCEPTION中的语句执行)错误被抛出,可以retry,且系统内部错误发生 时,retry会先于exception被执行,而如果报错被EXCEPTION捕获则不能 retry。
– 不支持使用全局变量的package。
– 不支持DBMS_JOB。
– 不支持UTL_FILE。
– 如果存储过程中有输出打印信息(如dbms_output.put_line或raise info等), 在发生retry时会重复输出已打印的消息,并会在重复消息前输出“Notice:
Retry triggered, some message may be duplicated.”加以提示。
● 集群状态约束:
– 仅支持DN、GTM实例故障。
– CN Retry有次数限制,如果在CN Retry达到最大尝试次数(最大次数由 max_query_retry_times控制)之前,集群状态无法从故障状态恢复到正常状 态,CN Retry不能保证执行成功。
– 扩容时不支持CN Retry。
● 数据导入约束:
– 不支持COPY FROM STDIN语句。
– 不支持gsql \copy from元命令。
– 不支持JDBC CopyManager copyIn导入数据。
CN Retry支持的错误类型列表和对应的错误码信息见表5-1, 可以通过GUC参数 retry_ecode_list设置CN Retry支持的错误类型列表,但不建议用户直接修改该参数,
如有修改需求请联系技术工程师协助处理。
表5-1 CN Retry 支持的错误类型列表
01 TCP通信错误:Connection reset by peer(CN和DN间通信)
对端流重置
(STREAM_CONNECTION_RESET_B Y_PEER)
YY002 TCP通信错误:Stream connection reset by peer(DN和DN间通信)
锁等待超时
(LOCK_WAIT_TIMEOUT) YY0
03 锁超时,Lock wait timeout 连接超时(CONNECTION_TIMED_OUT) YY0
04 TCP通信错误,Connection timed out
查询设置错误
(SET_QUERY_ERROR) YY0
05 SET命令发送失败,Set query 超出逻辑内存
(OUT_OF_LOGICAL_MEMORY) YY0
06 内存申请失败,Out of logical memory
通信库内存分配
(SCTP_MEMORY_ALLOC) YY0
07 SCTP通信错误,Memory allocate error
无通信库缓存数据
(SCTP_NO_DATA_IN_BUFFER) YY0
08 SCTP通信错误,SCTP no data in buffer
通信库释放内存关闭
(SCTP_RELEASE_MEMORY_CLOSE
)
YY009 SCTP通信错误,Release memory close
SCTP、TCP断开
(SCTP_TCP_DISCONNECT) YY0
10 SCTP通信错误,TCP disconnect 通信库断开(SCTP_DISCONNECT) YY0
11 SCTP通信错误,SCTP disconnect 通信库远程关闭
(SCTP_REMOTE_CLOSE) YY0
12 SCTP通信错误,Stream closed by remote
等待未知通信库通信
(SCTP_WAIT_POLL_UNKNOW) YY0
13 等待未知通信库通信,SCTP wait poll unknow
无效快照(SNAPSHOT_INVALID) YY0
14 快照非法,Snapshot invalid 通讯接收信息错误
(ERRCODE_CONNECTION_RECEIV E_WRONG)
YY015 连接获取错误,Connection receive wrong
内存耗尽(OUT_OF_MEMORY) 532
00 内存耗尽,Out of memory 连接失败(CONNECTION_FAILURE) 080
06 GTM出错,Connection failure
错误类型 错误 码
备注
连接异常(CONNECTION_EXCEPTION) 080
00 连接出现错误,和DN的通讯失败,
Connection exception 管理员关闭系统
(ADMIN_SHUTDOWN) 57P
01 管理员关闭系统,Admin shutdown 关闭远程流接口
(STREAM_REMOTE_CLOSE_SOCKE T)
XX003 关闭远程套接字,Stream remote close socket
重复查询编号
(ERRCODE_STREAM_DUPLICATE_
QUERY_ID)
XX009 重复查询,Duplicate query id
stream查询并发更新同一行
(ERRCODE_STREAM_CONCURREN T_UPDATE)
YY016 stream查询并发更新同一行,
Stream concurrent update
LLVM内存分配错误
(ERRCODE_LLVM_BAD_ALLOC_ER ROR )
CG003 内存分配错误, Allocate error
LLVM致命错误
(ERRCODE_LLVM_FATAL_ERROR) CG0
04 致命错误,Fatal error
开启CN Retry功能需要设置如下GUC参数:
● 必选的GUC参数(CN和DN都需设置)
max_query_retry_times
注意
CN Retry功能开启时会为临时表数据记录日志,为保证数据一致性,在使用临时 表时不能切换CN Retry开关状态,保持使用临时表的会话中CN Retry开关始终处 于打开状态或者关闭状态。
6 常见性能参数调优设计
在使用数据库的时候,为了提高集群的性能,有多种方式去调优,从硬件配置到软件 驱动升级,再到数据库的内部参数调整。本章节旨在介绍一些常用参数以及推荐配 置。
1. query_dop :用户自定义的查询并行度
SMP架构是一种利用富余资源来换取时间的方案,计划并行之后必定会引起资源 消耗的增加,包括CPU、内存、I/O和网络带宽等资源的消耗都会出现明显的增 长,而且随着并行度的增大,资源消耗也随之增大。
– 当资源成为瓶颈的情况下,SMP无法提升性能,反而可能导致性能的劣化。
在出现资源瓶颈的情况下,建议关闭SMP。
– 当资源许可的情况下,并行度越高,性能提升效果越好。
SMP并行度支持会话级设置,推荐在执行符合要求的查询前,打开SMP,执行结 束后,关闭SMP。以免在业务峰值时,对业务造成冲击。
query_dop的默认值是1, 可通过set query_dop=10,在会话中打开SMP。
2. enable_dynamic_workload:动态负载管理
动态负载管理指数据库内部根据用户负载情况,自动对复杂查询进行队列控制,
不再需要手动设置参数,做到系统参数免调优。
该参数默认打开,需要注意以下几点。
– 集群有一个CN会作为中心协调节点(CCN),用于收集和调度作业执行,该 节点可以通过gs_om -t status --detail查询到,Central Coordinator State会 显示其状态。当CCN不存在时,作业不再受动态负载管理控制。
– 简单查询作业(估算值<32MB)、非DML(即非INSERT、UPDATE、
DELETE和SELECT)语句,不走自适应负载,需要通过 max_active_statements来进行单CN的上限控制。
– 默认work_mem数值为64MB,在自适应负载特性下,该数值不能变大,否则 会引起内存不受控(例如未做Analyze的语句)。
– 以下场景或语句由于内存使用特殊性和不确定性,可能导致大并发场景内存 不受控,如果遇到需要降低并发数。
▪
单条元组占用内存过大的场景,例如,基表包含超过MB级别的宽列。▪
完全下推语句的查询。▪
需要在CN上耗费大量内存的语句,例如,不能下推的语句,withhold cursor场景。▪
由于计划生成不当导致hashjoin算子建立的hash表重复值过多,占用大ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连 接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。
对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议 work_mem=50%内存/10。
对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议 work_mem=50%内存/5。
对于并发场景,建议work_mem=串行下的work_mem/物理并发数。
– maintenance_work_mem
maintenance_work_mem用来设置维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。
设置建议:
建议设置此参数的值大于work_mem,可以改进清理和恢复数据库转储的速 度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并 且在执行维护性操作时不会有太多的会话。
当自动清理进程运行时,autovacuum_max_workers倍数的内存将会被分 配,所以此时设置maintenance_work_mem的值应该不小于work_mem。
6. bulk_write_ring_size
数据并行导入使用的环形缓冲区大小。
该参数主要影响入库性能,建议导入压力大的场景增加DN上的该参数配置。
7. 连接两大参数:
max_connections和max_prepared_transactions – max_connections
允许和数据库连接的最大并发连接数。此参数会影响集群的并发能力。
设置建议:
CN中此参数建议保持默认值。DN中此参数建议设置为CN的个数乘以CN中此 参数的值。
增大这个参数可能导致GaussDB(DWS)要求更多的System V共享内存或者信 号量,可能超过操作系统缺省配置的最大值。这种情况下,请酌情对数值加 以调整。
– max_prepared_transactions
设置可以同时处于"预备"状态的事务的最大数目。增加此参数的值会使 GaussDB(DWS)比系统默认设置需要更多的System V共享内存。
须知
max_connections取值的设置受max_prepared_transactions的影响,在设置 max_connections之前,应确保max_prepared_transactions的值大于或等于 max_connections的值,这样可确保每个会话都有一个等待中的预备事务。
8. checkpoint_completion_target 指定检查点完成的目标。
含义是每个checkpoint需要在checkpoints间隔时间的50%内完成。
默认值为0.5,为提高性能可改成0.9。
9. data_replicate_buffer_size
发送端与接收端传递数据页时,队列占用内存的大小。此参数会影响主备之间复 制的缓冲大小。
默认值为128MB,若服务器内存为256G,可适当增大到512MB。
10. wal_receiver_buffer_size
备机与从备接收Xlog存放到内存缓冲区的大小。
默认值为64MB,若服务器内存为256G,可适当增大到128MB。