openGauss

开源数据库

openGauss社区官网

开源社区

openGauss与PostgreSQL的对比

数据库架构之美2020-11-27openGauss与PG对比

openGauss 与 PostgreSQL 的对比

华为公司今年 6.30 开源了 openGauss 数据库,openGauss 数据库内核基于 postgresql9.2.4 演进而来,pg11.3 版本数据库中共有 290 个数据库参数,而 openGauss 目前有 515 个数据库参数,每个参数对应一个数据库内核功能,所以可以看到华为公司对 pg 的内核还是做了非常大的改造和增强。

这篇文章对比了 openGauss 数据库相比 pg 做了哪些增强和相比 pg 的不足之处,本文只列举一些较大的增强。

内核增强

1.最大可用模式 most_available_sync

pg 流复制一直有个痛点就是在一主一从同步模式下,如果备库宕机,主库会 hang,同步模式不会自动降级,需要依靠第三方工具进行判断和监控,或者使用一主多备 quorum 的方式来防止备库异常对主库的影响。openGauss 中支持了最大可用模式,开启该参数后在主从连接正常的情况下处于同步模式,如果备机断连会立刻切为异步模式,如果备机再次启动会自动连接并切为同步模式。这个降级切换时间非常快,切换过程甚至不会 hang,而且没有超时窗口参数来进行设置,这一点是个不足的地方。

2.xid 不可耗尽

这个大家都知道了,openGauss 将 transactionid 由 int32 改为了 int64,64 位的 xid 永远不可能耗尽,虽然 xid 改为了 64 位,但是过期的 xid 依旧需要 freeze 清理,只是永远不用担心会发生 xid 回卷宕机的风险。

3.流复制环境自动创建物理复制槽

openGauss 中搭建主从流复制环境后会默认自动创建一个 slot_name 为对端 nodename 的物理复制槽,为了防住备库需要的 xlog 被主库删除或清理。

4.增量检查点

openGauss 支持了增量检查点,通过 enable_incremental_checkpoint 参数开启。Pg 中的检查点执行时会将 buffer 中所有的脏页刷到磁盘,需要在 checkpoint_timeout*checkpoint_completion_target 时间内完成刷脏页动作。刷脏对数据库是消耗非常大的动作,高斯中的增量检查点会小批量的分阶段的滚筒式的去进行脏页刷盘,同时更新 lsn 信息,回收不需要的 xlog 日志。

5.双写 double write

我们知道操作系统数据块是 4k,数据库一般是 8k/16k/32k,这样有可能造成页面断裂问题,一个数据库数据块刷到操作系统的过程中可能发生宕机造成块损坏数据库无法启动。mysql 通过双写 double write 来解决这个问题,oracle 不管这个问题,出了事情通过 rman 或者 dg 备库来恢复,pg 通过 full_page_write 来解决这个问题,就是在数据页第一次发生变更的时候将整个页面记录到 xlog 日志中,这样出了问题就有了完整的数据页加 xlog 日志进行恢复,但是这样带来的问题就是大大增加了 xlog 的日志量,也对性能有一定影响。openGauss 实现了类似 mysql 的双写,写数据块的同时将脏页也写到一个共享的双写空间里,如果发生问题会从双写空间里找到完整的数据页进行恢复。双写特性参数 enable_double_write 需要配合增量检查点一起使用。

6.客户端密码认证增强

pg 默认的密码加密算法为 md5,openGauss 增强为 sha256,该功能需要配合客户端改造才能兼容。

7.xlog 预分配

pg 中的 xlog 日志是在写满后才会分配下一个日志,这样带来的问题是在操作系统写一个 16M 的 xlog 日志时会有等待,那时候可能会卡一下,这也是为什么 pg 在做并发 insert 测试的时候性能抖动的原因。openGauss 中实现了 xlog 预分配,在 xlog 未写满时就分配下面一个或者几个 xlog,经压测性能较稳定。

8.流复制线程连接认证

openGauss 中主备的复制线程要连接对端服务器时默认需要进行 ssl 认证,pg 是不需要的,增强了安全,可以通过将 remote_read_mode 设置为 non_authentication 关闭认证(如果不关闭就需要配置相关 ca 证书密钥,否则以-M primary/standby 方式启动数据库会失败)。

9.dbe_perf 性能监控 schema

openGauss 在每个库下面会默认存在一个 dbe_perf 的性能监控视图,类似 mysql 的 performance_schema,里面有几百个性能视图,虽然这些视图大部分 pg 里面都有,但是单独做到一个 schema 里方便查看和管理。

10.流复制环境主库归档 xlog 数量最大值限制

xlog 最大值的硬限制,通过 max_size_for_xlog_prune 参数控制,他不管 xlog 的删除会不会影响备机,只要超过该值就进行删除。可以防止主备长期断连造成主库目录爆掉。

11.public schema 安全权限增强

openGauss 将每个数据库下的默认的 public schema 做了安全增强,默认普通用户没有权限在 public 下创建对象,需要进行授权。不敢说这个是不是改进,因为既然叫 public,就是给大家用的。

12.摒除 recovery.conf 文件

使用 replconninfo 配置主备连接信息,application_name 等相关配置并入 postgresql.conf,简化流程,方便主备进行来回切换,pg12 的流复制也摒弃了 recovery.conf 文件。

13.基于数据页的复制

openGauss 支持基于 redo 的复制、基于数据页的复制以及两种混合复制,通过 enable_data_replicate 和 enable_mix_replication 参数进行控制。

14.支持列存表,列存缓冲区

openGauss 支持了列存表,通过 cstore_buffers 控制列存缓冲区大小,列存表支持压缩。并且当前版本的高斯优化了列存表的并发插入性能,解决了插入时一行数据占一个 cu 造成空间急剧膨胀的问题。通过开启 enable_delta_store 参数控制列存表的插入使用临时表向主表 merge 的方式进行,既保证了性能,也解决了膨胀的问题。

15.内存表

支持基于 llvm 的内存查询引擎,支持高吞吐、低延迟访问。

16.NUMA 架构优化

通过 numa 绑核,减少跨核内存访问的时延问题,提升 CPU 利用率,提升多线程间同步性能,xlog 日志批量插入,热点数据分散处理。

17.用户资源管理

支持多租户环境下的 cpu 内存限制,配置资源池,调用操作系统 cgroup 实现。

18.wdr 报告

支持类似 oracle awr 性能报告。

19.内存池 memorypool

在更上一层管理数据库内存使用,限制一个数据库节点可用的最大物理内存。

20.查询内存限制 query_mem

可以对某个查询使用的内存进行限制。

21.异步直接 io

开启磁盘预分配,io 预取,提升写入性能。

22.列存表 delta merge 性能增强

开启 enable_delta_store 参数控制列存表的插入使用临时表向主表 merge,提升性能,解决膨胀。

23.并行回放

支持备机并行回放日志,提高复制性能。

24.会话超时

Session_timeout 参数控制会话超时时间,防止由于线程长期不释放造成数据库意外宕机。

25.主备从与一主多备

除了支持一主多备模式,也支持主备从模式,主备机直接物理复制,从机默认没有数据,当主库宕,备机和从机组成新的复制关系,从机开始复制数据,这样节省了空间的同时保证了高可用。

26.线程池

进程模型改为线程模型,线程池支持上万的并发,通过线程池实现 session 和 thread 之间的解耦,提高线程的利用率,高并发下不会导致线程的频繁切换。

27.commit log 由 256k 改为 16M

为了配合 64 位 xid。

正视不足

1.pg_stat_replication 视图丢失

pg 中查看复制状态的基本视图被丢掉了,虽然使用 gs_ctl query 命令也可以复制状态,但是 pg_stat_replication 还可以查看主从 lag 信息,高斯中无法查询。

2.编译过于复杂,依赖过多

编译需要很多依赖,而且版本固定,造成跨平台编译难度很大,平台通用性差,你可能发现编译华为的第三方编译工具比编译数据库还麻烦。

3.不支持并行

目前高斯还不支持并行,希望后续引入 pg9.6 开始支持的并行功能。

4.没有 postgresql.auto.conf

无法使用 alter system set 配置相关参数。

5.不支持 pitr

目前还不支持基于时间点的恢复,据说 830 版本会支持。

6.不支持插件

这是一个极大的劣势,pg 良好的扩展性在于他支持插件,吸引了很多开发者开发基于 pg 的插件,而 openGauss 中已经不支持插件。

7.社区刚刚起步,参与度不高

openGauss 社区刚刚起步,目前活跃度不高,希望未来越来越好吧,也希望高斯中的优秀特性也能被 pg 吸收。

8.周边工具

高可用工具、数据同步工具不具备。

9.性能与原生 pg 存在差距

使用并发工具压测数据库代码速度发现与原生 pg 存在差距,同时目前不支持并行,所以分析类场景也有不足。

8.copydir 限制

openGauss 中将数据库数据导入目录限制到数据目录下的 pg_copydir 中,这个是很不人性化的设计,试想生产环境需要导数,需要先拷贝到数据目录下,容易造成数据目录满。