优炫数据库UXMPP集群最佳性能—查询性能调优
本文介绍如何调整uxmpp集群以获得最佳性能。我们将在一台UXDB服务器上调优数据库以提高性能,在所有的集群上进行扩展。
首先,先了解下选择正确的分发列对性能的影响。
分发列选择
创建分布式表的第一步是选择正确的分发列,这有助于uxmpp将多个操作直接下推到worker分片,并排除不相关的分片,从而显着提高查询速度。
通常,对于分发列的选择,可以选择常用的连接键,或者大多数查询都用到的过滤键。对于过滤键,uxmpp使用分发列范围排除不相关分片,确保查询只匹配与WHERE子句重叠的分片。对于连接键,如果连接键和分发列相同,则uxmpp只在具有匹配/重叠分布列范围的碎片之间执行连接。所有这些碎片连接都可以在worker上并行执行,因此效率更高。
此外,uxmpp还可以根据分发列将多个操作直接下发到各个worker上,这大大减少了每个节点上的计算量和跨节点传输数据产生的网络负荷。
UXDB调优
uxmpp协调器将传入的查询分为片段查询,并将它们下发到worker上进行并行处理。worker其实只是扩展的UXDB服务器,这些查询将应用UXDB的标准规划和执行逻辑。因此,我们需要先调优worker上的UXDB配置参数以提高性能。
调整参数是一个实验的过程,通常需要多次尝试才能达到理想的性能。因此,在调整参数的时候,可以选择加载一小部分数据,加快迭代速度。
开始调优前,先创建一个uxmpp集群并加载一些数据,在master上执行EXPLAIN命令,查看worker是如何处理查询,以及master如何汇总查询结果。
以github_events表为例:
EXPLAIN
SELECTdate_trunc('minute',created_at)ASminute,
sum((payload->>'distinct_size')::int)ASnum_commits
FROMgithub_events
WHEREevent_type='PushEvent'
GROUPBYminute
ORDERBYminute;
通过执行即可,了解执行过程。首先有32个分片,执行器选择的是real-time:
接下来,展示其中一个分片上的查询行为,指明了worker的主机、端口和数据库:
最后,显示了查询片段在worker的UXDB服务器的EXPLAIN的结果:
现在,我们可以通过EXPLAIN的执行结果,连接到192.168.1.83:5432的worker上,调整分片github_events_104169的查询性能。调优过程中,可以通过在master上执行EXPLAIN来查看调优结果。
我们先进行配置参数调优,shard_buffers和work_mem是对读取性能优化比较重要的参数。
shard_buffers定义了分配给数据库缓存数据的内存。默认是128MB。我们建议改值为当前节点的RAM的1/4—1/2。
如果查询中有很多复杂的排序,可以增加work_mem使排序在更大的内存中运行,这比在磁盘中排序要快的多。如果在worker节点中查看到有很多的磁盘活动,是非常有必要增大该值,提高查询的效率,让更多的操作在内存中进行。
最后,在表上创建索引来增强数据库的性能。对于索引的选择,可以通过EXPLAIN查看查询计划并优化查询计划中较慢的部分。创建索引之后,索引必须和表保持同步,这会增加一部分数据操作的开销。
对于写入性能,可以使用常规的UXDB调优来提高INSERT的速率。通常建议增加checkpoint_timeout和max_wal_size设置。此外,根据应用程序的可靠性要求,可以选择更改fsync或者synchronous_commit的值。
在其中一个worker上调整了合适的参数,也同时需要手动去修改其他worker上的对应参数。在master上打开uxmpp.explain_all_tasks开关,并执行EXPLAIN来验证其他worker上的调优。此时执行的EXPLAIN,将会显示所有分片的查询计划。
由于数据分布不均匀或者机器硬件的差异可能会导致worker程序执行的差异。可以运行EXPLAINANALYZE查询每个分片上运行的更详细的信息。
分布式查询性能调优
在群集中分发数据后,每个worker都会针对最佳性能进行优化。在此之后,是调整一些分布式性能调整参数。
在讨论特定配置参数之前,我们建议查看分布式群集上的查询时间(启用\timing),并将它们与单个分片性能进行比较。这有助于确定在master和worker上花费的时间,找出瓶颈并进行相应的优化。
一般性能调优满足大部分用例,涵盖所以常见的配置。
高级性能调优主要是在特定用例中提供性能增益。