Citus参数
参数
Citus的参数讲解
Citus参数配置参考
一般配置
- citus.max_worker_nodes_tracked(int)
任务追踪执行器任务数量,默认2048
Citus在协调节点上的共享哈希表中跟踪工作节点的资源任务数量。此配置值限制哈希表的大小,从而限制可以跟踪的工作节点上的任务数量。此参数只能在服务器启动时设置,并且在协调节点上有效。
- citus.use_secondary_nodes(enum)
设置SELECT查询选择节点时使用的策略,默认never
设置为“always”,则规划器将仅查询在pg_dist_node中标记为“secondary”noderole的节点。
"su_backend"级别,如下方法使用:
export PGOPTIONS='-c citus.use_secondary_nodes=always'
此枚举支持的值为:
never :(默认)所有读取都发生在主节点上。
always:读取针对辅助节点运行,并禁用插入/更新语句。
- citus.cluster_name(text)
设置所用集群的名字,默认’default’
通知协调器节点规划器使用哪个集群。设置cluster_name后,计划程序将仅查询该集群中的工作节点。
- citus.enable_version_checks(boolean)
升级时是否检查版本,默认true
升级Citus版本需要重新启动服务器(以获取新的共享库),以及运行ALTER EXTENSION UPDATE命令。无法执行这两个步骤可能会导致错误或崩溃。因此Citus验证代码的版本和扩展匹配的版本,如果不符合则验证错误。
此值默认为true,对协调器有效。在极少数情况下,复杂的升级过程可能需要将此参数设置为false,从而禁用检查。
- citus.log_distributed_deadlock_detection(boolean)
是否记录死锁检测的日志,默认false
是否在服务器日志中记录分布式死锁检测相关处理。它默认为false。
- citus.distributed_deadlock_detection_factor(float)
设置死锁检查时间因子,默认2
设置在检查分布式死锁之前等待的时间。特别是等待的时间将是这个值乘以PostgreSQL的deadlock_timeout设置。默认值为2。-1禁用分布式死锁检测的值。
- citus.node_conninfo(text)
设置非敏感的libpq连接参数用于所有的节点间的连接。
-- key=value pairs separated by spaces.
-- For example, ssl options:
ALTER DATABASE foo
SET citus.node_conninfo =
'sslrootcert=/path/to/citus.crt sslmode=verify-full';
Citus允许参数的白名单:
application_name
connect_timeout
gsslib†
keepalives
keepalives_count
keepalives_idle
keepalives_interval
krbsrvname†
sslcompression
sslcrl
sslmode (defaults to “require” as of Citus 8.1)
sslrootcert
- citus.override_table_visibility(boolean)
此GUC仅对Citus MX有影响
是否隐藏分片表名,默认on
分片表作为常规表存储在Worker节点上,并在其名称后附加分片ID。与常规Citus不同,默认情况下,例如用户\d在psql中运行时,Citus MX不会在表列表中显示分片。设置off,显示分片表和元表:
查询统计
- citus.stat_statements_purge_interval(integer)
是Citus Enterprise的一部分
设置删除不匹配查询记录的间隔,默认10秒
设置维护进程删除citus_stat_statements中与pg_stat_statements不匹配记录的频率。此配置设置清除之间的时间间隔(以秒为单位),0将禁用清除功能。
此参数在协调器上有效,可以在运行时更改。
- citus.stat_statements_max(integer)
是Citus Enterprise的一部分
要存储在citus_stat_statements中的最大行数,默认为50000。
可以更改为1000 - 10000000范围内的任何值。请注意,每行需要140个字节的存储空间,因此将stat_statements_max设置为最大值10M将占用1.4GB内存。
在重新启动PostgreSQL之前,更改此GUC将不会生效。
数据加载
- citus.multi_shard_commit_protocol(enum)
设置跨分片事务模式,默认2pc
设置在散列分布式表上执行COPY时要使用的提交协议。在每个单独的分片上,COPY在事务块中执行,以确保在COPY期间发生错误时不会摄取任何数据。但是,存在特定的故障情况,其中COPY在所有分片上成功,但在所有事务提交之前发生(硬件)故障。通过在以下提交协议之间进行选择,此参数可用于防止数据丢失:
2pc :(默认)首先使用PostgreSQL的两阶段提交准备在分片上执行COPY的事务,然后提交。可以分别使用COMMIT PREPARED或ROLLBACK PREPARED手动恢复或中止失败的提交。使用2pc时,应在所有工作人员上增加max_prepared_transactions,通常与max_connections的值相同。
1pc:在分片上执行COPY的交易将在一轮中提交。如果在COPY成功完成所有展示位置后提交失败,数据可能会丢失(很少见)。
- citus.shard_replication_factor(整数)
设置分片的复制因子,即将放置分片的节点数,默认为1.
此参数可在运行时设置,对协调器有效。此参数的理想值取决于群集的大小和节点故障的速率。设置2会使该分片表在不同work节点中存在两份副本,并且副本具有相同的ID
- citus.shard_count(int)
分片数量,默认32
如果2台机器,那么在创建散列分区表时每个work节点会分配16个分片表,对协调器有效。
- citus.shard_max_size(byte size)
append分片模式下分片表的伐值,默认1GB
此参数影响使用\ copy加载数据时自动创建的分片的最大大小,默认为1 GB。如果文件大于此参数,\ copy会将其分解为多个分片
规划器配置
- citus.limit_clause_row_fetch_count(int)
limit近似值,默认-1(关闭)
在某些情况下,使用LIMIT子句的SELECT查询可能需要从每个分片中获取所有行以生成精确结果。由于大量的网络数据传输,这降低了LIMIT子句的性能。
可以通过设置配置参数citus.limit_clause_row_fetch_count来启用LIMIT近似值。Citus将限制每个任务返回的行数,以便在协调器上进行聚合。由于此限制,最终结果可能是近似值。增加此限制将提高最终结果的准确性。
- citus.count_distinct_error_rate(float)
count_distinct近似值错误率,默认0.0(禁用)
Citus可以使用postgresql-hll扩展计算count(distinct)近似值。此配置条目在计算count(distinct )时设置所需的错误率。1.0并不保证结果的准确性。我们建议将此参数设置为0.005以获得最佳效果。此值可以在运行时设置,并且对协调器有效。
- citus.task_assignment_policy(enum)
仅当shard_replication_factor大于1时,或者对参考表查询时有用
设置将任务分配给Worker时使用的策略,默认greedy
协调器根据分片位置为Worker分配任务。此配置值指定进行这些分配时要使用的策略。
greedy:默认方式旨在Worker平均分配任务。
round-robin:以循环方式为Worker分配任务,在不同的副本之间交替。当表的分片计数低于Worker数量时,这可以实现更好的集群利用率。
first-replica:根据分片的放置(副本)的插入顺序分配任务。换句话说,分片的查询只是分配给具有该分片的第一个副本的worker。此方法允许您对哪些节点将在哪些节点上使用(即更强的内存驻留保证)有很强的保证。
此参数可以在运行时设置,并且对协调器有效。
中间数据传输
- citus.binary_worker_copy_format(boolean)
使用二进制格式在work和协调器器之间传输中间数据。默认false
在大表连接期间,Citus可能必须在不同工作者之间动态地重新分配数据。默认情况下,此数据以文本格式传输。启用此参数指示数据库使用PostgreSQL的二进制序列化格式来传输此数据。此参数对worker有效,需要在postgresql.conf文件中更改。编辑配置文件后,用户可以发送SIGHUP信号或重新启动服务器以使此更改生效。
- citus.binary_master_copy_format(boolean)
使用二进制格式在协调器和工作器之间传输数据。默认false
某些数据类型(如hll或hstore数组),序列化和反序列化数据的成本非常高。在这种情况下,使用二进制格式传输中间数据可以提高查询性能,因为这会降低CPU使用率。
运行分布式查询时,工作人员将其中间结果传输到协调器以进行最终聚合。默认情况下,此数据以文本格式传输。启用此参数指示数据库使用PostgreSQL的二进制序列化格式来传输此数据。此参数可以在运行时设置,并且对协调器有效。
- citus.max_intermediate_result_size(int)
CTE和复杂子查询的中间结果的最大大小(KB)。默认值为1GB
值为-1表示没有限制。超出限制的查询将被取消并生成错误消息。
DDL
- citus.enable_ddl_propagation(bool)
自动传播ddl,默认on
协调器上执行的ddl将自动传播至work节点执行
执行器配置
- citus.all_modifications_commutative(bool)
Citus强制执行交换规则并获取适当的锁以进行修改操作,以保证行为的正确性。例如,它假定INSERT语句与另一个INSERT语句交互,但不与UPDATE或DELETE语句交互。同样,它假定UPDATE或DELETE语句不与另一个UPDATE或DELETE语句交互。这意味着UPDATE和DELETE要求Citus获得更强的锁。
如果您有UPDATE语句与INSERT或UPDATE交互,那么您可以通过将此参数设置为true来放宽这些假设。当此参数设置为true时,所有命令都被视为可交互,并声明共享锁,这可以提高整体吞吐量。此参数可以在运行时设置,并且对协调器有效。
- citus.max_task_string_size(int)
设置工作程序任务调用字符串的最大大小(以字节为单位),默认值12288。
更改此值需要重新启动服务器,不能在运行时更改。
在主节点上的共享哈希表中跟踪活动工作程序任务。此配置值限制单个工作程序任务的最大大小,并影响预分配共享内存的大小。
最小值:8192,最大值65536
- citus.remote_task_check_interval(int)
设置Citus检查任务跟踪执行程序管理的作业状态的频率。默认为10毫秒。
协调员将任务分配给工人,然后定期检查每个任务的进度。此参数在协调器上有效,可以在运行时设置。
- citus.task_executor_type(enum)
Citus有两种执行器类型,用于运行分布式SELECT查询,默认real-time:
real-time:当您需要快速响应涉及跨多个分片的聚合和共址联接的查询时,它是最佳的。
task-tracker:任务跟踪器执行器非常适合长时间运行的复杂查询,这些查询需要跨工作节点进行数据混洗和有效的资源管理。
此参数可以在运行时设置,并且对协调器有效。
- citus.multi_task_query_log_level(enum)
为生成多个任务的任何查询设置日志级别(即,命中多个分片的SQL日志级别)。
这在多租户应用程序迁移期间非常有用,因为您可以选择对此类查询进行错误或警告,以查找它们并向其添加tenant_id过滤器。此参数可以在运行时设置,并且对协调器有效。此参数的默认值为“off”。
此枚举支持的值为:
off: Turn off logging any queries which generate multiple tasks (i.e. span multiple shards)
debug: Logs statement at DEBUG severity level.
log: Logs statement at LOG severity level. The log line will include the SQL query that was run.
notice: Logs statement at NOTICE severity level.
warning: Logs statement at WARNING severity level.
error: Logs statement at ERROR severity level.
实时执行器配置
- max_connections(int)
数据库的最大连接数,默认100
实时执行器为每个发送查询的分片维护一个打开的连接。增加此配置参数将允许执行程序具有更多并发连接,从而并行处理更多分片。必须在工作者和协调器上更改此参数,并且只能在服务器启动期间完成。
- max_files_per_process(int)
设置每个服务器进程的最大同时打开文件数,默认为1000
实时执行程序需要为它发送查询的每个分片提供两个文件描述符。增加此配置参数将允许执行程序能更多打开的文件描述符,从而并行处理更多分片。必须在工作人员和协调员上进行此更改,并且只能在服务器启动期间完成。
除了max_files_per_process之外,还需要使用ulimit命令增加每个进程的打开文件描述符的内核限制
- citus.enable_repartition_joins(boolean)
允许实时执行器重新分区数据,默认false
执行重新分区连接将失败并显示错误消息。但是,设置citus.enable_repartition_joins为true允许Citus临时切换到任务跟踪器执行程序以执行连接。默认值为false。
任务跟踪器执行器配置
- citus.task_tracker_delay(int)
任务最终执行器轮巡任务的休眠时间,默认200毫秒
任务跟踪器进程定期唤醒,遍历分配给它的所有任务,并安排和执行这些任务。然后,任务跟踪器在再次遍历这些任务之前会休眠一段时间。此配置值确定睡眠的时间。此参数对worker有效,需要在postgresql.conf文件中更改。编辑配置文件后,用户可以发送SIGHUP信号或重启服务器以使更改生效。
可以通过减少该参数以减少由于任务跟踪器执行器引起的延迟。这在分片查询非常短的情况下非常有用。
- citus.max_tracked_tasks_per_node(int)
设置每个节点的最大跟踪任务数,默认为1024.
此配置值限制用于跟踪分配的任务的哈希表的大小,因此限制在任何给定时间可以跟踪的最大任务数。此值只能在服务器启动时设置,并且对工作人员有效。
如果希望每个工作节点能够跟踪更多任务,则需要增加此参数。如果此值低于所需值,则Citus会在工作节点上输出错误消息,说明它超出了共享内存,并且还提供了一个提示,指示增加此参数可能有所帮助。
- citus.max_assign_task_batch_size(int)
协调器单次分配给Work的任务数量,默认64
协调器上的任务跟踪器执行器同步地将任务分批分配给工作人员的守护程序。此参数设置单个批次中要分配的最大任务数。选择更大的批量可以更快地分配任务。但是,如果工人数量很大,那么所有工人可能需要更长的时间来完成任务。此参数可以在运行时设置,并且对协调器有效。
- citus.max_running_tasks_per_node(int)
任务追踪器最大并发任务数,默认8
任务跟踪器进程会根据调度并执行分配给它的任务。此配置值设置在任何给定时间在一个节点上并发执行的最大任务数,默认为8.此参数在工作节点上有效,需要在postgresql.conf文件中更改。编辑配置文件后,用户可以发送SIGHUP信号或重启服务器以使更改生效。
此配置条目可确保您没有多个任务同时访问磁盘,并有助于避免磁盘I / O争用。如果您的查询是从内存或SSD提供的,则可以不必担心增加max_running_tasks_per_node。
- citus.partition_buffer_size(int)
设置用于分区操作的缓冲区大小,默认为8MB。
Citus允许在连接两个大表时将表数据重新分区为多个文件。在此分区缓冲区填满后,重新分区的数据将刷新到磁盘上的文件中。此配置条目可以在运行时设置,对worker有效。
Explain output
- citus.explain_all_tasks(boolean)
展开所有explain,默认false
默认情况下,Citus 在分布式查询上运行EXPLAIN时显示单个任意任务的输出。在大多数情况下,解释输出在任务中类似。有时,某些任务的计划方式不同或执行时间要长得多。在这些情况下,启用此参数可能很有用,之后EXPLAIN输出将包含所有任务。这可能会导致EXPLAIN花费更长时间。
[CitusDB中国]站主,PostgreSQL粉丝,现从事Citus研发工作
愿Citus在中国发展的越来越好