Es学习第十课,ElasticSearch集群搭建

  前面几课咱们已经把ES的基本概念和查询了解了,你们知道ES的核心优点就是天生支持分布式,因此,这课咱们专门讲讲怎么搭建实现ES的集群部署。node

ES分布式原理

  一、es分布式概念 

主分片(Primary shard) 索引的子集,索引能够切分红多个分片,分布到不一样的集群节点上。分片对应的是 Lucene 中的索引。默认是根据id进行hash分片的。
副本分片(Replica shard)每一个主分片能够有一个或者多个副本。
Mapping 至关于数据库中的schema,用来约束字段的类型,不过 Elasticsearch 的 mapping 能够自动根据数据建立。
分配(Allocation) 将分片分配给某个节点的过程,包括分配主分片或者副本。若是是副本,还包含从主分片复制数据的过程。数据库

  在一个分布式系统里面,能够经过多个elasticsearch运行实例组成一个集群,这个集群里面有一个节点叫作主节点(master),elasticsearch是去中心化的,因此这里的主节点是动态选举出来的,不存在单点故障。es在外部看来elasticsearch就是一个总体。app

在同一个子网内,只须要在每一个节点上设置相同的集群名,elasticsearch就会自动的把这些集群名相同的节点组成一个集群。节点和节点之间通信以及节点之间的数据分配和平衡所有由elasticsearch自动管理。elasticsearch

二、客户端请求

请求能够发送到es集群中的任意一个节点上,该节点会将请求的query转发给集群中全部节点,各个节点返回是否包含该query的倒排索引信息给该节点,而后该节点再发送二次请求给具体包含该query倒排的节点上进行计算。分布式

三、es集群的选主和发现:

分布式系统要解决的第一个问题就是节点之间互相发现以及选主的机制。若是使用了 Zookeeper/Etcd 这样的成熟的服务发现工具,这两个问题都一并解决了。但 Elasticsearch 并无依赖这样的工具,带来的好处是部署服务的成本和复杂度下降了,不用预先依赖一个服务发现的集群,缺点固然是将复杂度带入了 Elasticsearch 内部。工具

服务发现以及选主 ZenDiscoveryspa

节点启动后先ping(这里的ping是 Elasticsearch 的一个RPC命令。若是 discovery.zen.ping.unicast.hosts 有设置,则ping设置中的host,不然尝试ping localhost 的几个端口, Elasticsearch 支持同一个主机启动多个节点)
Ping的response会包含该节点的基本信息以及该节点认为的master节点。
选举开始,先从各节点认为的master中选,规则很简单,按照id的字典序排序,取第一个。
若是各节点都没有认为的master,则从全部节点中选择,规则同上。这里有个限制条件就是 discovery.zen.minimum_master_nodes,若是节点数达不到最小值的限制,则循环上述过程,直到节点数足够能够开始选举。
最后选举结果是确定能选举出一个master,若是只有一个local节点那就选出的是本身。
若是当前节点是master,则开始等待节点数达到 minimum_master_nodes,而后提供服务。
若是当前节点不是master,则尝试加入master。
Elasticsearch 将以上服务发现以及选主的流程叫作 ZenDiscovery 。因为它支持任意数目的集群(1-N),因此不能像 Zookeeper/Etcd 那样限制节点必须是奇数,也就没法用投票的机制来选主,而是经过一个规则,只要全部的节点都遵循一样的规则,获得的信息都是对等的,选出来的主节点确定是一致的。但分布式系统的问题就出在信息不对等的状况,这时候很容易出现脑裂(Split-Brain)的问题,大多数解决方案就是设置一个quorum值,要求可用节点必须大于quorum(通常是超过半数节点),才能对外提供服务。而 Elasticsearch 中,这个quorum的配置就是 discovery.zen.minimum_master_nodes 。
日志

ES集群搭建流程

elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,因此logging.yml里的设置按普通log4j配置文件来设置就好了。排序

打开elasticsearch.yml的第一眼,配置文件的实例很是的简单,咱们主要讲两点:索引

cluster.name
配置es的集群名称,默认是elasticsearch,不一样的集群用名字来区分,es会自动发如今同一网段下的es,配置成相同集群名字的各个节点造成一个集群。若是在同一网段下有多个集群,就能够用这个属性来区分不一样的集群。
http.port
设置对外服务的http端口,默认为9200。不能相同,不然会冲突。

安装实践

一、集群将部署3个节点:

节点1:

cluster.name:elasticsearch-test

http.port:9200

节点2:

cluster.name:elasticsearch-test

http.port:19200

节点3:

cluster.name:elasticsearch-test

http.port:29200

二、集群配置

上文提到过,只要集群名相同,且机器处于同一局域网同一网段,es会自动去发现其余的节点。

三、配置完成,启动三个es节点

四、上述三步完成后,一个集群就搭建好了,是否是很简单;这时咱们经过客户端添加一个索引后,数据就会在这三个节点自动分片存储,同时ES会自动分配副本分片作备份。 

本站公众号
   欢迎关注本站公众号,获取更多信息