引言
openGauss是华为在2020.06.30开源的数据库,基于Postgresql9.2.4演进而来。华为在Postgresql基础上做了较多的改进点,因此openGauss相比于Postgresql是有一定优势的。不过Postgresql本身强大的社区能力,自身也在一直不停的更新版本,目前最新版本已经是PG 15。所以不好说openGauss一定比Postgresql好或者是一定比Postgresql差。
目前国内大部分的国产数据库要么是基于MySQL路线开发,要么是基于Postgresql开发,也有一些是基于openGauss开源社区。个人认为,基于Postgresql或openGuass开发的产品,可以针对Postgresql和openGuass的各自的优势进行补齐,作为产品后续迭代的功能。当然,如果既能够把好的新功能合并进来,同时又能够时刻与社区最新的版本兼容,这个是不容易的,需要强大的研发能力支撑。
本文只是针对两者的优劣势做一个稍微记录,供后续深入进行学习。
openGauss优势
openGuass支持最大可用模式most_available_sync
PG流复制有一个痛点就是在一主一从同步模式下,如果备库宕机,主库就会hang住,同步模式不能自动降级。Oracle有最大可用模式,而MySQL有半同步模式。PG中出现此问题时需要依靠第三方工具进行判断和监控,或者使用一主多备的方式来防止备库异常对主库的影响。
openGauss支持了最大可用模式,开启该参数后在主从连接正常的情况下处于同步模式,如果备机断连会立刻切为异步模式,如果备机再次启动会自动连接并切为同步模式。
openGauss中xid不可能耗尽
PG数据库中的xid是一个32位的整型,如果PG数据库运行了很久,会有xid耗尽的问题。PG针对xid耗尽的问题,采取环的方式进行处理,并在vacuum的过程中增加xid冻结处理。
openGauss中将xid由32位改为64位,因此正常情况下xid不可能会耗尽,不过openGauss中针对xid冻结处理的逻辑仍然存在,只是永远不会担心xid耗尽的风险。
流复制环境自动创建物理复制槽
openGauss中搭建主从流复制环境后会默认自动创建一个slot_name为对端nodename的物理复制槽,为了防止备库需要的xlog被主库删除或清理。
增量检查点
PG数据库中每次检查点执行时,会将所有buffer中的脏页刷到磁盘,如果脏页太多可能会一定的性能影响。
openGauss中支持增量检查点的功能,通过enable_incremental_checkpoint参数开启,通过小批量的分阶段的滚筒式进行脏页刷盘,同时更新LSN信息,回收不需要的xlog日志。
双写double write
由于操作系统数据块是4K,数据库的一个数据块是8K、16K或32K,这样当一个数据库从内存刷到操作系统的过程中可能因为宕机造成坏损坏从而数据库无法启动或恢复。
PG针对此问题采用了全页写Full Page Write,就是在checkpoint之后每个页面第一次修改时将整个页面的信息写到WAL中,但是这样会导致写放大的问题。MySQL针对此问题是采用双写,在脏块落盘时先把整个块写到共享表空间中并落盘,如果发现坏损坏,从共享表空间中将整个块读取出来进行恢复。不过Oracle针对块损坏的问题并没有采用什么处理,而是依靠ADG等恢复机制进行故障恢复。
openGauss实现了类似MySQL的双写功能,也是在写块的时候把脏页写到共享表空间中,如果发生问题会从双写表空间中找到完整的数据页进行恢复。通过参数enable_double_write并需要开启增量检查点一起使用。
客户端密码认证增强
PG默认的密码加密算法是md5,openGauss增强为SHA256,该功能需要配合客户端改造才能兼容。
xlog预分配
PG中的xlog日志是在写满后才会分配下一个日志,这样会导致写满一个16M的xlog日志时会有等待,导致PG在做并发写测试的时候性能会有抖动。
openGauss中实现了xlog的预分配,以xlog未写满时就分配下面一个或几个xlog,经压测性能较稳定。
流复制线程连接认证
openGauss中主备复制线程要连接对端服务器时默认需要进行ssl认证,增强安全性,可以通过remote_read_mode设置为non_authentication关闭认证。如果不关闭认证以主从方式启动数据库就会启动失败。
dbe_perf性能监控schema
openGauss在每个库下面增加一个dbe_perf性能监控视图,类似MySQL的performance_schema,里面有几百个性能视图,大部分PG里面也有,不过openGauss单独做到一个schema里面方便查看和管理。
流复制环境主库归档xlog数量最大值限制
openGauss对xlog做了最大值硬限制,通过max_sie_for_xlog_prune参数控制,不论xlog删除会不会影响备机,只要超过该值就进行删除。可以防止主备长期断连造成主库目录爆掉。
public schema安全权限增强
openGauss将每个数据库下默认的public schema做了安全增强,默认普通用户没有权限在public下创建对象,需要进行授权。
去除recovery.conf文件
openGauss去除了recovery.conf文件,将相关配置并入postgresql.conf。这一点PG 12版本中也去除了recovery.conf文件。
基于数据页的复制
openGauss支持基于redo的复制、基于数据页的复制以及两种混合复制,通过enable_data_replicate和enable_mix_replication参数进行控制。
支持列存表,列存缓冲区
openGauss支持列存表,通过cstore_buffers控制列存缓冲区大小,列存表支持压缩。openGauss优化了列存表并发插入性能,解决了插入时一行数据占一个cu造成空间急剧膨胀的问题。通过开启enable_delta_store参数控制列存表的插入使用临时表向主表merge的方式进行,既保证了性能,也解决了膨胀的问题。
内存表
openGauss支持基于LLVM的内存查询引擎,支持高吞吐、低延迟访问。
NUMA架构优化
通过NUMA绑核,减少跨核内存访问时延问题,提升CPU利用率,提升多线程间同步性能,xlog日志批量插入,热点数据分散处理。
用户资源管理
支持多租户环境下的CPU内存限制,配置资源池,调用操作系统cgroup实现。
WDR报告
支持类似Oracle WDR性能报告。
内存池memorypool
在更上一层管理数据库内存使用,限制一个数据库节点可用的最大物理内存。
查询内存限制query_mem
可以对某个查询使用的内存进行限制。
异步直接IO
开启磁盘预分配,IO预取,提升写入性能。
列存表delta merge性能增强
开启enable_delta_store参数控制列存表的插入使用临时表向主表merge,提升性能,解决膨胀。
并行回放
支持备机并行回放日志,提升复制性能。
会话超时
session_timeout参数控制会话超时时间,防止由于线程长期不释放造成数据库意外宕机。
主备从与一主多备
除了支持一主多备,也支持主备从模式,主备机物理复制,从机默认没有数据。当主库宕机时,备机和从机组成新的复制关系,从机开始复制数据。
线程池
openGauss将PG的进程模型改为线程模型,线程池支持上万并发,通过线程池实现session和thread之间的解耦,提高线程利用率,高并发下不会导致线程频繁切换。
commit log由256K改为16M
为了配合64位xid。
openGauss不足
openGauss中没有pg_stat_replication视图
PG中查看复制状态的视图在openGauss中被丢弃,无法查询主从Lag信息。
编译复杂,依赖过多
openGauss的编译需要很多依赖,而且版本固定,造成跨平台编译难度很大,平台通用性差。
不支持并行
openGauss不支持并行。这个不太理解。
没有postgresql.auto.conf
无法使用alter system set配置相关参数
不支持PITR
目前不支持基于时间点恢复。
不支持插件
PG的扩展性在于支持插件,openGauss不支持。
社区成熟度不高
没有PG的社区成熟度高。
周边工具
高可用工具、数据同步工具不具备。
性能不如原生PG
性能不如原生PG,由于不支持并行,分析类场景也有不足。
copydir限制
openGauss将数据库导入目录限制到pg_copydir中,如果要导数,需要先拷贝到数据目录下,容易造成数据目录满。