分布式数据库-CrateDB架构分析与源码阅读之最佳实践

如果想要深入使用CrateDB,甚至用于生产的话,关于CrateDB的最佳实践还是很有研究价值的,比如对于同样一套框架,合理的参数配置的性能可能是不好的参数配置的性能的几倍以上。

官网其实已经给出了很多清晰易懂的最佳实践案例:https://crate.io/docs/crate/guide/en/latest/best-practices/index.html  我不是一个喜欢翻译搬运的人,所以对于官网给出的最佳事件场景这里不会再赘述,这里仅仅会给出一些个人在实际使用场景过程中积累的一些性能优化的经验,希望能帮大家少走一些弯路。

CrateDB最佳实践之Shard数设置

CrateDB中支持Shards的概念,也就是将数据分开存储在多个数据分片中。如同在架构分析那篇文章所说的那样,CrateDB很大程度上可以看做elastic search加上了一层sql层的封装,所以他在底层的存储模型上与elastic search基本一致,每个shard其实就是互相独立运行的lucene索引,它是ES处理的基本单位,可以提高并行性,shards的设置对CrateDB的性能具有一定影响。

CrateDB中数据在各个Shard的分配方式是:shardID = hash(routing)%shards数,其中routing代表做shards操作的路由列,cluster by routing;在cluster by操作不指定的时候,默认以_id作为路由列,进行hash。由于生成的_id往往具有足够的随机性,所以在默认情况下shard分配其实是比较均匀的,没有太大必要指定shard分配的路由列。

CrateDB的默认Shards数max(4, 集群节点数*2),shards数可以在建表的时候进行表级别设置:

create table quotes(id int, name string) clusterd into 10 shards

为了达到并行处理的目的,单机上单表 shards数*partition数略超过cpu核数是比较好的设置策略。集群上,shards数*partition数等于或略小于集群总体核数是比较好的设置策略;由于写入单个shards的IndexShard往往是单例,过低的shards数的情况下,即使一个很大、资源很充沛的集群也很难充分调用CPU资源(用于写入的线程数就是等于shards数,你加CPU也用不起来),从而可能会影响插入可扩展性和查询性能。但是过多的shards数造成在shard 写请求在线程池排队甚至被拒绝,增加了很多无意义的CPU线程轮转负担。

CrateDB最佳实践之数据插入

为了达到较好的插入性能,CrateDB需要在插入时:

1、选择合适的shards数,shards数影响并发能力和可扩展性,shards数的选择可以参考博客第一部分;

2、集群部署时,指定向集群的每个节点都发送请求,因为CrateDB集群接受请求的节点并不会自动做负载均衡;

3、尽量批量插入数据,一次写入多条数据,多线程写入,减少flush次数和多余的网络开销。

CrateDB最佳实践之运行环境

磁盘:对于CrateDB来说,磁盘的最佳选择是SSD,CrateDB的一些设计是在SSD场景下考虑的,在SSD盘下的性能远远高于普通机械硬盘,另外部署在多块盘上,相对于单块磁盘可以进一步提高CrateDB的并发性,提高磁盘吞吐。

内存:对于CrateDB来说,在内存空间没有远远大于64G的情况下,不建议给CrateDB分配大于等于32G的堆内存,这是因为在堆内存大于等于32GB以后,CrateDB对于Java引用的存储不再压缩,会造成较大的额外内存开销,也会增加GC的压力。

另外官网建议给CrateDB分配的堆内存不超过机器最大内存的一半,这是因为底层的lucene也会占用一部分内存,为了集群稳定考虑,要保留这部分内存。

 

关于最佳实践就简单举这几个例子,其实对于大规模数据的存储,最佳实践的探讨是十分重要的一块内容,因为任何一点点的优化,应用于海量数据之后,都可能产生非常大的性能影响,如果有其他关于最佳实践的讨论,欢迎随时留言。

 

大家如果想对CreateDB有一些深入了解的话,可以看一下我的CrateDB系列文章:

分布式数据库-CrateDB架构分析与源码阅读之总体概述与架构分析​​​​​ https://blog.csdn.net/u013970710/article/details/103219791

分布式数据库-CrateDB架构分析与源码阅读之常用命令 https://blog.csdn.net/u013970710/article/details/103219825

分布式数据库-CrateDB架构分析与源码阅读之搭建部署 https://blog.csdn.net/u013970710/article/details/103219820

分布式数据库-CrateDB架构分析与源码阅读之源码阅读 https://blog.csdn.net/u013970710/article/details/103219804

分布式数据库-CrateDB架构分析与源码阅读之最佳实践 https://blog.csdn.net/u013970710/article/details/103219797

分布式数据库-CrateDB架构分析与源码阅读之空间存储与空间计算 https://blog.csdn.net/u013970710/article/details/103226889

 

你可能感兴趣的:(#)