为什么要在OushuDB实现存储缓存?

在云环境下,大量弹性的计算资源支持了数据库集群快速地扩容或缩容计算资源,这也就使得“计算和存储分离” 必然是大势所趋。当存储资源和计算资源不在同一个节点的时候,远程读是一个不可忽略的问题。由于建立远程连接和数据读取的高延迟和存算集群之间的带宽瓶颈,导致每次读取操作性能低于本地磁盘读取,从而造成查询性能下降。

存储缓存是在OushuDB 内核中实现的数据缓存功能,采用将远程数据缓存到本地存储的方式来减少远程读的数量,从而改善小查询的中远程读的延迟情况以及降低高并发时网络的压力。

使用存储缓存的性价比

以对象存储举例,对于小查询,从存储缓存读数据延迟通常在微秒级,而从远程读数据延迟通常在数十到数百毫秒,从而有效地降低了小查询的响应时间。对于高并发大数据量的查询,由于可以多次访问本地数据,存储缓存能够有效降低集群的远程读次数,避免存算集群之间的带宽成为瓶颈。从费用上看,首先由于性能提升,降低了计算资源的使用时间。同时存储缓存也降低了对于对象存储的请求次数,从而也降低了访问费用。

存储缓存的操作方法

l 存储缓存的启动及配置

存储缓存服务随OushuDB集群启动同时启动,如下图所示:


ps -ef |grep cacheserver
gpadmin  579169 579167  0 17:27 ?        00:00:07 cacheserver -l pg_log/hawq_cache-2022-01-12_172702.log -C /data1/hawqsin/tmp,/data2/hawqsin/tmp,/data3/hawqsin/tmp,/data4/hawqsin/tmp -r 1024 -D 10240


其中-C 代表缓存到的磁盘数据的存放路径,默认是放在hawq_segment_temp_directory配置参数下的cacheserver目录。-r 代表cache默认的内存容量1024MB,-D代表cache默认的磁盘容量10240MB。

l 如何修改存储缓存的内存/磁盘容量大小?

在master节点运行select cache_server_clean_memory(内存大小,磁盘大小) from segments; ,例:select cache_server_clean_memory(10240,307200) from segments; 代表将cache server的内存大小改为10G,磁盘大小改为300G,不用重启集群即可生效。

l 如何查看存储缓存的统计信息?

在master节点运行select hornet_helper.get_cache_server_info() from segments; 获取Cache Server 的统计信息。

l 如何清理当前缓存?

在master节点上运行select hornet_helper.cache_server_clean_memory() from segments;

l 如何禁用缓存?

集群启动时默认同时启动存储缓存服务,可以在集群启动前配置hawq_init_with_urlcache为off来禁⽌启动存储缓存服务。

l 如何修改缓存作用的存储类型?

参数cache_read_protocols 用来设置当前session要缓存的存储类型,默认值为s3(代表对象存储),可选参数为(s3 、hdfs), s3代表数据库只会缓存数据在对象存储上的表数据。

l 如何让存储缓存作用于单张表?

参数cache_tables用来设置当前session要缓存的存储表表名,默认值为cache_server_cache_all,即代表缓存所有(存储协议为cache_read_protocols)表,例:如果修改该参数为'public.test_tbl'(public是schema名,test_tbl是表名),同时test_tbl的存储协议为cache_read_protocols定义的存储类,只会缓存test_tbl这张表的数据。