分布式集群

Elasticsearch的分布式处理对用户来说是完全透明,你可以不关心它具体的实现就可以使用它,本章节中将对它进行大致的介绍
三个概念

  • 集群(cluster):ES服务器的部署集群,一个集群由一个或多个节点构成
  • 节点(node):具有相同cluster.name的ES服务组成一个节点
  • 分片(shard):存储索引数据的空间,一个节点可以存在一个或多个分片

集群健康
集群健康是用来监控整个ES集群的健康状态,可以通过/_cluster/health?pretty请求查看

{
  "cluster_name" : "es-local",  // 集群名称
  "status" : "green", // 状态值,green:所有主要分片和复制分片都可用,yellow:所有主要分片可用,但不是所有复制分片都可用,red:不是所有的主要分片都可用
  "timed_out" : false,
  "number_of_nodes" : 2,//节点数
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 176,
  "active_shards" : 352,
  "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.0
}

分片
分片可以是主分片(primary shard)或者是复制分片(replica shard)。你索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。复制分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档。

横向扩展
假设现在的ES集群中有两个节点,每个节点含有3个分片,如下图:

现在我们扩展一个节点,扩展后ES会自动转移部分分片数到新的节点,达到负载均衡,如下:

Node3包含了分别来自Node 1和Node 2的一个分片,这样每个节点就有两个分片,和之前相比少了一个,这意味着每个节点上的分片将获得更多的硬件资源(CPU、RAM、I/O)。

在集群系统中深度分页
为了理解为什么深度分页是有问题的,让我们假设在一个有5个主分片的索引中搜索。当我们请求结果的第一页(结果1到10)时,每个分片产生自己最顶端10个结果然后返回它们给请求节点(requesting node),它再排序这所有的50个结果以选出顶端的10个结果。 

现在假设我们请求第1000页——结果10001到10010。工作方式都相同,不同的是每个分片都必须产生顶端的10010个结果。然后请求节点排序这50050个结果并丢弃50040个!
你可以看到在分布式系统中,排序结果的花费随着分页的深入而成倍增长。这也是为什么网络搜索引擎中不提供跳页或者限制最大页数的原因。

Elasticsearch默认的最大查询页数是第10000页,如果需求中一定要有查10000页后的数据,可以通过下面的语句进行修改,但首先你最好尝试说服产品经理不要这么干
curl -XPUT 'http://192.168.23.163:9200/console/_settings' -d '{ "index" : { "max_result_window" : 100000000}}'

两次查询数据不一致的问题
之前遇到同一个sql查询两次,一次有结果、一次没结果的问题。引起这个问题的原因是因为我们创建索引时设置了副本(es默认副本数为1,即同样的数据会在副本里也保存一份),副本和主分片中数据不一致,再由于es负载均衡每次查的不一定是同一个分片,所以引起了这样的问题。
解决办法:强制刷新es,http://192.168.23.163:9200/test_console/_flush?force

ES管理界面
http://192.168.23.163:9200/_plugin/head/

猜你喜欢

转载自gegewuqin9.iteye.com/blog/2370359