ES(ElasticSearch)集群基础知识02
集群结构
节点:
一个运行中的 Elasticsearch 实例称为一个 节点
集群:
是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。
当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
单节点集群:
仅启动一个单独的节点,构成一个单节点集群
空节点集群:
集群中至于一个节点,且里面没有任何数据和索引
上图只有一个节点,节点内没有数据和索引
上图有一个节点,但是节点内有一个索引(3个主分片)
主节点:
被选中用来管理集群内所有变更(索引的增加、删除,节点的增加删除)的节点。
主节点不需要涉及文档级别的变更和搜索等操作。所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。
请求可以发送到集群中的任何节点(含主节点)每个节点都知道任意文档存储的位置,能够将我们的请求直接转发到存储我们所需文档的节点
启动多个节点
和启动单个节点方式一致。
统一机器:只要cluster.name 配置相同就可以自动识别加入集群并平衡资源
不同机器:需要配置单播主机列表
分片与索引
分片:
ES的底层物理工作单元,数据存储的容器,全部数据可以有多个分片存储。
一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎
分片是一个功能完整的搜索引擎,它拥有使用一个节点上的所有资源的能力
应用程序通过索引与其间接打交道
索引:
保存相关数据的地方,当需要添加数据时会用到。
本质为物理分片的逻辑命名空间
应用程序直接与其打交道
主分片:
主分片简单解释为已存储文档的源,索引内任意文档都属于某一个主分片。
主分片个数决定了索引能够保存的文档最大数,而单个主分片能够保存的最大文档数由Integer.MAX_VALUE - 128 决定,具体值需要参考使用场景。
副分片:
副分片是主分片的一个拷贝,用于数据容灾以及平衡负载,可提供搜索和返回文档等读操作的服务。
一般情况下副分片的个数要比主分片多(倍数增加),个别情况(集群亚健康yellow)下存在部分主分片无副分片的情形。
当主分片故障后,副分片可以转换成主分片(因此主分片副分片无本质的差异)
上图一个集群3个节点,6个分片(3主3副)
创建索引与分片设定:
在索引建立的时候就已经确定了主分片数(默认5个主分片),但是副本分片数可以随时修改。
让我们在包含一个空节点的集群内创建名为 blogs 的索引。我们将分配3个主分片和一份副本(每个主分片拥有一个副本分片):
PUT /blogs
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
集群健康状态
Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是集群健康。
它在 status 字段中展示为 green 、 yellow 或者 red
查看方式:
GET /_cluster/health
返回如下:
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
Green | 所有的主分片和副本分片都正常运行。 |
Yellow | 所有的主分片都正常运行,但不是所有的副本分片都正常运行。 |
Red | 有主分片没能正常运行。 |
集群扩容与容灾
扩容方式:
垂直扩容:通过提升性能的扩容方式
水平扩容:通过增加更多的设备扩容方式
真正的扩容能力:水平扩容,而ES天生分布式的可以有效的支持水平扩容
水平扩容:
单一节点的状态,3个分片
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 3,
"active_shards": 3,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 3,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 50
}
unassigned_shards:没有被分配到任何节点的副本数。
启动第二个节点后的状态,6个分片
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 2,
"number_of_data_nodes": 2,
"active_primary_shards": 3,
"active_shards": 6,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100
}
启动三个节点的状态,6个分片
增加副本扩容
PUT /blogs/_settings
{
"number_of_replicas" : 2
}
两倍副本扩容后状态,9个分片
故障容灾
删除一个主节点后,重新分配主节点node2,以及副分片转换成主分片(R1->P1,R2->P2)