从物理空间概念,Elasticsearch 分布式系统会有 3 个关键点需要学习。本次总结了下面相关内容:
Elasticsearch 分布式特性包括如下几个点:
什么是高可用?CAP 定理是分布式系统的基础,也是分布式系统的 3 个指标:
那高可用(High Availability)是什么?高可用,简称 HA,是系统一种特征或者指标,通常是指,提供一定性能上的服务运行时间,高于平均正常时间段。反之,消除系统服务不可用的时间。
衡量系统是否满足高可用,就是当一台或者多台服务器宕机的时候,系统整体和服务依然正常可用。举个例子,一些知名的网站保证 4 个 9 以上的可用性,也就是可用性超过 99.99%。那 0.01% 就是所谓故障时间的百分比。
Elasticsearch 在高可用性上,体现如下两点:
随着公司业务发展,Elasticsearch 也面临两个挑战:
那么需要将原来节点和增量数据重新从 10 个节点分布到 100 个节点。Elasticsearch 可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级数据。Elasticsearch 为了可扩展性而生,由小规模集群增长为大规模集群的过程几乎完全自动化,这是水平扩展的体现。
上面通过可扩展性,可以看出 Elasticsearch 分布式的好处明显:
Elasticsearch 在后台自动完成了分布式相关工作,如下:
Elasticsearch 集群知识点如下:
Elasticsearch 集群有多个节点组成,形成分布式集群。那么,什么是节点呢?
节点(Node),就是一个 Elasticsearch 应用实例。大家都知道 Elasticsearch 源代码是 Java 写的,那么节点就是一个 Java 进程。所以类似 Spring 应用一样,一台服务器或者本机可以运行多个节点,只要对应的端口不同即可。但生产服务器中,一般一台服务器运行一个 Elasticsearch 节点。还有需要注意:
可以通过命令 _cluster/health
查看集群的健康状态,如下:
如图,有主(Master)节点和其他节点。那么节点有多少类型呢?
Elasticsearch 被启动后,默认就是 Master-eligible Node。然后通过参与选主过程,可以成为 Master Node。具体选主原理,后续单独写一篇文章。Master Node 有什么作用呢?
Data Node,又称数据节点。用于保存数据,其在数据扩展上起至关重要的作用。
Coordinating Node,是负责接收任何 Client 的请求,包括 REST Client 等。该节点将请求分发到合适的节点,最终把结果汇集到一起。一般来说,每个节点默认起到了 Coordinating Node 的职责。
还有其他节点类型,虽然不常见,但需要知道:
一般在开发环境中,设置单一的角色节点:
同样看这个图,3 个节点分别为 Node1、Node2、Node3。并且 Node3 上面有一个主分片 P0 和一个副本 R2。那什么是主分片呢?
主分片,用来解决数据水平扩展的问题。比如上图这个解决可以将数据分布到所有节点上:
副本,用来备份数据,提高数据的高可用性。副本分片是主分片的拷贝
如何查看 Elasticsearch 集群的分片配置呢?可以从 settings 从看出:
{
"my_index": {
"settings": {
"index": {
"number_of_shards": "8",
"number_of_replicas": "1"
}
}
}
}
实战建议:对生产环境中,分片设置很重要,需要最好容量评估与规划
索引评估,每个索引下面的单分片数不用太大。如何评估呢?比如这个索引 100 G 数据量,那设置 10 个分片,平均每个分片数据量就是 10G 。每个分片 10 G 数据量这么大,耗时肯定严重。所以根据评估的数据量合理安排分片数即可。如果需要调整主分片数,那么需要进行 reindex 等迁索引操作。
从上一篇到这一篇:
比如知道了搜索性能场景,例如多少数据量,多大的写入,是写为主还是查询为主等等,才可以确定: