通过在24核CPU,64G内存的机型上进行测试,9000W数据的排序在最短可以在25 ms内完成,QPS最高可达5400。
六.并行优化
随着当前硬件的发展,系统资源越来越丰富,多CPU大内存成了系统标配,充分利用这些资源可以有效的提升的处理效率优化性能。腾讯在2014年底开始进行PostgreSQL多核执行优化。
目前PostgreSQL9.6社区版也会包含部分并行化特性,但是没有我们这边这么丰富,下面介绍下腾讯PostgreSQL并行化的原理和效果:
系统创建一个全局的共享内存管理器,使用bitmap管理算法进行管理
系统启动时创建一定数据的Executor,这些Executor用来执行执行计划的碎片
系统会创建一个计划队列,所有的Executor都会在任务队列上等待计划
每个Executor对应一个任务结果队列,Executor在输出结果时就把结果的指针挂到结果队列中去
计划队列,结果队列,计划分片执行结果都存放在共享内存管理器中,这样所有的进程都可以访问到这些结构
Postgres会话进程在收到sql时,判断是否可以并行化,并进行任务的分发;在结果队列中有结果时就读出返回
我们完成优化的算子:
Seqscan
Hash join
Nestloop join
Remote query
Hash Agg
Sort Agg
Append
通过在24核CPU,64G内存的机型下测试,各个算子的优化结果:
整体来说性能普遍是优化前的10-12倍,优化的效果比较明显。
七.腾讯PostgreSQL-XZ的两地三中心容灾
两地三中心容灾是金融级数据库的必备能力,对于金融类业务数据安全是最基本也是最重要诉求,因此我们为了保障高效稳定的数据容灾能力,也为PostgreSQL-XZ建设了完善的两地三中心自动容灾能力。具体的两地三中心部署结构如下:
同城节点间采用强同步方式,保障数据强一致;异地采用专网异步同步。
节点内,每台物理机上部署CAgent,agent收集机器状态并进行上报,并进行相应的告警和倒换执行功能。
每个IDC至少部署一个JCenter,JCenter负责收集上报每个agent上报的状态到ZK集群。这么多个JCenter中只有一个是主用,主用的JCenter除了进行状态上报还进行故障裁决和倒换。在主用的JCenter异常后,系统通过ZK自动裁决挑选一个备用的JCenter升主。
JCenter和CAgent是两地三中心的控制和裁决节点。
对于数据库节点,CN在每个IDC至少部署一个。DN在每个中心部署一个,一个为主,另外两个并联作为备机放在主机上,一个为同步备机,另外一个为异步备机。
在主机故障宕机时,JCenter优先选择同城的备机升主。
目前,腾讯云已经提供云数据库PostgreSQL的内测使用,并将提供内核优化版和社区版两个版本来满足更多客户的要求。