4.1.1.1.1-PostgreSQL-调研

优质
小牛编辑
134浏览
2023-12-01

Postgresql调研 摘要 本文介绍了Postgresql的功能和集群构建方案,及集群读写分离、负载均衡和分库功能的实现方法。

1. 简介

PostgreSQL是一个功能强大的、可靠性高、能保证数据完整性和一致性对象的开源关系数据库系统。它可以运行在所有主流的操作系统上,包括Linux、UNIX(AIX, BSD, HP-UX, SGI IRIX, MACOS, Solaris, Tru64)和Windows,实现ACID事务机制、外键、连接、视图、触发器和存储过程(在多种语言中)等功能,支持大多数SQL2008数据类型,如INTEGER, NUMERIC, BOOLEAN、CHAR、VARCHAR、DATE、INTERVAL和TIMESTAMP,还支持二进制大对象的存储,包括图片、声音或视频。它为C / c++、Java、Net, Perl, Python, Ruby, Tcl, ODBC提供了编程接口。 作为一款企业类数据库,PostgreSQL拥有一些复杂的特性,例如多版本并发控制(MVCC)、即时恢复、表空间、异步备份、事务保存点、在线/热备份、复杂的查询规划器/优化器,以及预写式日志提高容错等,在能够管理的数据量和可以容纳的并发量方面都具有高度的可伸缩性下面的下表中包含了一些一般的PostgreSQL限制。

表1 PostgrelSQL 的一般限制

LimitValue
Maximum Database SizeUnlimited
Maximum Table Size32 TB
Maximum Row Size1.6 TB
Maximum Field Size1 GB
Maximum Rows per TableUnlimited
Maximum Columns per Table250 - 1600 depending on column types
Maximum Indexes per TableUnlimited

2. postgresql自带工具和集群策略

提供面向高并发访问的分布式数据构建技术来提升整个数据库并发尤其是并发读的能力,实现负载均衡、读写分离和数据分库功能。

2.1 关键技术

2.1.1 可扩展性

可扩展性是指当系统需要增加资源执行更多的工作时系统能获得划算的等同提升。构建可扩展性系统时要尽量遵循避免串行化和交互的原则。 实现可扩展性方法可大致分为以下三类:

  • 向上扩展:使用性能更好的机器。
  • 向外扩展:水平扩展。向外扩展策略:数据复制、数据库拆分及数据分片。数据复制主要利用主从同步实现了读写分离。数据数据分片:大多数分片系统有一些全局的数据不会被分片,大多保存在单个节点上,通常缓存。
  • 向内扩展:数据归档。

    2.1.2 分表

    确定分区键方法:结合ER图和应用的查询。汇总表、全局表(不分片)。避免分片过大(同样大小最好)。多个分布键:或许存储多份。 优点: 缺点:数据分片的最大挑战是查找和获取数据。对重要且频繁访问的数据减少分片,可扩展性法则之一避免同节点之间交互,最重要的是分区键的选取。维护数据一致性的挑战。聚合和关联操作等跨分片查询需要数据交互。

    2.1.3 主从同步

    是指在备用节点保存一份副本,对主节点进行数据增删改的同时,将修改同步到备用节点中。备用节点在主节点出现故障时接替主节点故障,除了实现数据高可用性之外,同时承担了应用服务器的读请求,实现读写分离。针对读多写少的情况,还能使用一主多从的架构,实现读请求的负载均衡。数据分库,数据分区:对大表采用的一种分割策略,将表中的纪录按照一定规律分到不同机器集群中。实现这种架构的方案有:Postgresql使用pgpool-II中间件实现负载均衡和读写分离,基于Pg/Proxy实现数据分库;以及基于Postgresql构建Postgresql-XL集群策略。

    2.1.4 冷热分离

    PostgreSQL能通过定义表空间的方式确定表文件存储的路径,再通过挂载不同的存储介质就能实现分级存储。定期分表,在系统空闲时,将过期数据所在表的表空间设置成性能较差的存储介质。

    2.1.5 缓存

    如何指定表进缓存?如何查看哪些表被缓存?缓存的种类?

    2.2 组件

    2.2.1 pgpool-II

    pgpool-II相当于中间件,位于应用程序和PG服务端之间,对应用程序来说,Pgpool-II就相当于PG服务端;对PG服务端来说,Pgpool-II相当于PG客户端。由此可见,Pgpool-II与PG是解耦合的,基于这样的机制,Pgpool-II可以搭建在已经存在的任意版本的PG主从结构上,主从结构的实现与Pgpool-II无关,可以通过slony等工具或者PG自身的流复制机制实现。除了主从结构的集群,Pgpool-II也支持多主结构,称为复制模式,该模式下PG节点之间是对等的,没有主从关系,写操作同时在所有节点上执行,这种模式下写操作的代价很大,性能上不及主从模式。PG 9.3之后支持的流复制机制可以方便的搭建主从结构的集群(包括同步复制与异步复制),因此pgpool-II中比较常用的模式是流复制主从模式,其结构如下图(也可以一主多从)。 既然PG可以通过自身的流复制机制方便的搭建主从结构集群,为什么还要在它上面搭建pgpool-II呢?因为简单的主从结构集群并不能提供连接池、负载均衡、自动故障切换等功能,pgpool-II正好可以做到这些,当然负载均衡只针对读操作,写操作只发生在主节点上。 为了避免单点故障,Pgpool-II自身也可以配置为主从结构,对外提供虚拟IP地址,当主节点故障后,从节点提升为新的主节点并接管虚拟IP。

    2.2.2 plproxy

    plproxy能够在PostgreSQL上运行的一种过程语言,能够通过用户自定义函数完成对远程数据库的调用,实现数据切片的功能。图2给出了plproxy实现原理,具体事例参考文献[2]。图4给出了基于plproxy进行分库的架构,图中cluster1和cluster2可以是PostgreSQL单机版,也可以是图1中实现了负载均衡和读写分离的集群,这样便整个架构便实现了数据分库、负载均衡和读写分离。[2][3][4]

2.2.3 Postgres-XL

Postgres-XL的机制和Pgpool-II与Pl/Proxy大不相同,它不是独立于PG的,是在PG源代码的基础上增加新功能实现的。简单来说,Postgres-XL将PG的SQL解析层的工作和数据存取层的工作分离到不同的两种节点上,分别称为Coordinator节点和Datanode节点,而且每种节点可以配置多个,共同协调完成原本单个PG实例完成的工作。客户端发出请求,通过负载均衡器(例如 HaProxy)将请求分发给Coordinator。此外,为了保证分布模式下事务能够正确执行,增加了一个GTM节点。为了避免单点故障,可以为所有节点配置对应的slave节点。

2.2.3.1 Postgres-XL的特点

Postgres-XL 是一种提供写可靠性,多主节点数据同步,数据传输的开源集群方案。 写可靠性 (Write-scalable )是指可以部署多个数据库主节点,并且向这些主节点发出 update 语句,这种特性单个 Postgres 库无法提供; 主节点数据同步(Synchronous):是指在一台数据库上更新操作会立刻呈现在另一台数据库中; 数据传输(Transparent)是指;数据位于不同的数据库节点中,当查询数据时,不必关心数据位于具体的节点。

2.2.3.2 Postgres-XL 架构

Postgres_XL 架构.PNG.jpg Postgres_XL 架构.PNG Postgres-XC主要组件有GTM,GTM_Standby,GTM_Proxy, Coordinator 和Datanode。

  • GTM:GTM 是 Postgres_XL 的核心组件,用于全局事务控制,遵循数据库的ACID原则。
  • GTM_Standby:GTM_Standby 为 GTM 的备机。
  • GTM_Proxy:GTM_Proxy 为降低GTM压力而诞生的, 用于对 Coordinator 节点提交的任务进行分组等操作, 机器中可以存在多个 GTM_Proxy。
  • Coordinator:协调节点 (Coordinator) 是数据节点 (Datanode) 与应用之间的接口,Coordinator 节点并不物理上存储表数据,表数据以分片或者副本的方式分布式存储在数据节点上。当应用发起SQL时,会先到达 Coordinator 节点,然后 Coordinator 节点将 SQL 分发到各个数据节点,汇总数据,这一系统过程是通过 GXID 和 Global Snapshot 来控制的。
  • Datanode:数据节点(datanode)物理上存储表数据,表数据存储方式分为分片(distributed)和完全复制(replicated)两种,数据节点只存储本地的数据。

下表来自是2016年云栖社区的博客,是PostgreSQL和MySQL针对GIS运算的比较。

功能MySQLPostgreSQL
空间索引仅MyISAM支持R树索引,InnoDB不支持GIST树索引(R树的变种)
支持的空间类型仅二维数据二维、三维以及曲线
空间投影有限的空间函数基本实现OGC标准定义的空间操作函数
事务支持不支持PostGIS提供了一系列的长事务支持,可以有效支持复杂的空间分析功能。
GIS系统使用使用较少使用较多,例如openstreetmap的数据库后台就是Postgresql +Postgis。

参考资料