ElasticSearch 的主旨是随时可用和按需扩容。 而扩容可以通过购买性能更强大( 垂直扩容 或 纵向扩容 ) 或者数量更多的服务器( 水平扩容 或 横向扩容 )来实现。
虽然 Elasticsearch 可以获益于更强大的硬件设备,但是垂直扩容是有极限的。 真正的扩容能力是来自于水平扩容—为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中。
对于大多数的数据库而言,通常需要对应用程序进行非常大的改动,才能利用上横向扩容的新增资源。 与之相反的是,ElastiSearch天生就是 分布式的 ,它知道如何通过管理多节点来提高扩容性和可用性。 这也意味着你的应用无需关注这个问题。
1.简单介绍
一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为主节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。
作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。该节点就称为协调节点。路由过程如下:
(1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)。
(2)coordinating node,对document进行路由,将请求转发给对应的node(有primary shard)。
(3)实际的node上的primary shard处理请求,然后将数据同步到replica node。
(4)coordinating node,如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端。
(5)特殊情况:document如果还在建立索引过程中,可能只有primary shard有,任何一个replica shard都没有,此时可能会导致无法读取到document,但是document完成索引建立之后,primary shard和replica shard就都有了。
2.集群健康
Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 集群健康 , 它在 status 字段中展示为 green 、 yellow 或者 red。
命令:GET /_cat/health?v || GET /_cluster/health
返回结果:epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1488007113 15:18:33 elasticsearch yellow 1 1 1 1 0 0 0 0 - 100.0%
(1).green:每个索引的primary shard和replica shard都是active状态的。
(2).yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态。
(3).red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了。
3.添加索引
索引实际上是指向一个或者多个物理分片的逻辑命名空间 。
一个分片是一个底层的工作单元 ,它仅保存了全部数据中的一部分。每个分片是一个Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
一个集群中的所有主分片包含着该集群的所有数据,副本分片只是主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。
在索引建立的时候就已经确定了的主分片数不可修改,但是副本分片数可以随时修改。
PUT /index
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
为什么主分片数量不允许修改?这个es的路由有关。
我们都知道一个index的数据会被分成多份,存放到各个分片中,路由就是根据路由算法决定该新增或者搜索的doc所存放的分片。
(1)路由算法:shard = hash(routing) % number_of_primary_shards。这就是当一个index被创建之后,primaryshard的数量不允许改变的原因。
(2)默认的routing就是_id,也可以在查询或新增记录时中手动指定。
put /index/type/id?routing=user_id
3.故障转移
当集群中只有一个节点在运行时,意味着会有一个单点故障问题——没有冗余。 幸运的是,我们只需再启动一个节点即可防止数据丢失。
启动第二个节点
为了测试第二个节点启动后的情况,你可以在同一个目录内,完全依照启动第一个节点的方式来启动一个新节点(参考安装并运行 Elasticsearch)。多个节点可以共享同一个目录。
当你在同一台机器上启动了第二个节点时,只要它和第一个节点有同样的cluster.name
配置,它就会自动发现集群并加入到其中。 但是在不同机器上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表。 详细信息请查看最好使用单播代替组播
启动第二个节点完成之后,此时我们查看集群的健康状态,status则会为green。因为如果任何一个节点出现故障,我们的数据都会完好无损。