概述
Elasticsearch用于构建高可用和可扩展的搜索系统。其扩展的方式有两种:
- 纵向扩展(提示硬件性能,比如购买更好的服务器);
- 横向扩展(购买更多的服务器,共同搭建一个集群);
集群的基本原理
1.集群中节点的职责
Elasticsearch虽然能从更强大的硬件中获得更好的性能,但是纵向扩展有它的局限性。真正的扩展应该是横向的,它通过增加节点来均摊负载和增加可靠性。如果我们启动一个单独的节点,它还没有数据和索引,这个集群看起来就像下图。
Elasticsearch集群中的节点有候选主节点(Master-eligible node)、数据节点(Data node)、客户端节点(Ingest node)、部落节点(Tribe node)等角色/类型:
- node.master: true; (默认值true)Master-eligible node,表示这个节点既有成为主节点的资格。
- node.data: true; (默认值true)Data node,数据节点主要工作是数据的CRUD、索引和数据的整合。
- node.ingest: true; (默认值true) Ingest node,客户端节点主要协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
- 在elasticsearch.yml中的新增tribe.*相关配置; Tribe node部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据,部落节点。
2. 如何设置节点的职责
创建一个专用的候选主节点:
node.master: true
node.data: false
node.ingest: false
cluster.remote.connect: false
Note: 为了防止数据丢失,配置discovery.zen.minimum_master_nodes设置是至关重要的
(默认为1),每个主节点应该知道形成一个集群的最小数量的主资格节点的数量,discovery.zen.minimum_master_nodes: (master_eligible_nodes / 2) + 1
创建一个专用的数据节点:
node.master: false
node.data: true
node.ingest: false
cluster.remote.connect: false
创建一个专用的客户端节点:
node.master: false
node.data: false
node.ingest: true
cluster.remote.connect: false
创建一个部落节点:
在节点的elasticsearch.yml中新增如下配置
tribe:
t1:
cluster.name: cluster_one
t2:
cluster.name: cluster_two
集群中的一个节点(node.master: true)会被选举为主节点(master),它将临时管理集群级别的一些变更,例如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。
3. 集群节点上的分片
当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。接下来我们在集群中唯一一个空节点上创建一个叫做 people 的索引。默认情况下,一个索引会分配5个主分片,但是为了演示的目的,我们只分配3个主分片和一个复制分片(每个主分片都有一个复制分片):
PUT /people
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
在单一节点上运行意味着有单点故障的风险:没有数据备份。幸运的是,要防止单点故障,我们唯一需要做的就是启动另一个节点。如下图:
第二个节点已经加入集群,三个复制分片(replica shards)也已经被分配了,分别对应三个主分片,这意味着在丢失任意一个节点的情况下依旧可以保证数据的完整性。
4. 索引在集群中的存储及扩展
文档的索引将首先被存储在主分片中,然后并发复制到对应的复制节点上。这可以确保我们的数据在主节点和复制节点上都可以被检索。随着应用需求的增长,我们该如何扩展?如果我们启动第三个节点,我们的集群会自我感知,这时便成为了三节点集群。分片已经被重新分配以平衡负载:
从 Node 1 和 Node 2 来的分片已经被移动到新的 Node 3 上,这样每个节点就有两个分片(主分片和其副本分片不能在同一个节点),以代替之前的三个。这意味着每个节点的硬件资源(CPU、RAM、I/O)被较少的分片共享,这样每个分片就会有更好的表现。分片本身就是一个完整成熟的搜索引擎,它可以使用单一节点的所有资源。