扩容
副本分片可以动态的增加副本分片的数目,但是主分片不可以。
扩容本质上就是迁移分片至新的节点以达到扩容的目的。
如果有6个分片(3主3从),那么就可以扩容至6个节点。每个节点存放一个分片,并且每个分片拥有该节点的全部资源。
如果想要扩容超过6个节点怎么办?
主分片的数目在创建索引的时候就已经确定。这个数目定义了这个索引能够存储的最大数据量。但是读操作可以被主分片和副本分片同时处理,所以增大副本分片的数量可以提高吞吐量,集群搜索性能将大幅度提升。
如果只是在一个集群同数量的节点上增加副本数量并不会增加性能,因为每个分片从节点上分到的资源会变少,需要增加硬件资源来提升吞吐量。
副本分片数量增加数据冗余性。
扩容的两种方法
方式一:垂直扩容
例如当前的服务器能够容纳1T的数量,现在数据量达到了10T,直接购买一台10T的服务器进行替换。
方式二:水平扩容
增加多台拥有类似性能的服务器构成集群。
es一般采用方式二水平扩容的方式进行扩容。从成本上来说,内存容量小,并且性能相对较低的服务器相比较与内存容量大,性能好的服务器,在价格上的差距不是一个量级的。从另一方面来说,elasticSearch是一套分布式的系统,分布式的存在也是为存放大量的数据。讲到elasticSearch的扩容,自然就会想到shard和replica shard。
elasticSearch拥有cluster discovery(集群发现机制),当我们启动一个新的节点,该节点会发现集群并且自动加入到集群中。并且es集群会自动进行各个shard之间的数据均衡处理。并且当节减少时,es集群也会自动将减少的节点中的数据移到其他正在运行的节点中。所以elasticSearch一般选择水平扩容的方式
容灾
ES有很完善的容灾机制,候选master一般有多个,data节点也有多个,因此节点异常的时候通过访问切换到其他节点来容灾。
1.故障发现
master会定时去ping其他节点(包括其他master节点),datanode也会去ping master节点。
Discovery.zen.fd.ping_interval=1s 默认每隔1秒探测1次
Discovery.zen.fd.ping_timeout=30s 默认ping探测的超时时间为30秒
Discovery.zen.fd.ping_retry=3 默认重试3次
2.节点切换
master节点切换
当其他节点探测到master异常且超过重试次数后,候选master节点会进行竞争,规则:
1.每次选举每个节点会把自己所知道的候选master节点根据nodeid进行一次排序,然后选出第一个节点,暂且认为它是master节点
2.如果对某个几点的投票数达到 候选master数/2+1 个(防止脑裂的发生)并且该节点也选举自己为master,那么这个节点即为master,否则重新选举。
data节点切换
当master节点检测到某个data节点有异常的时候:
1.master剔除该data节点,如果有副本,此时数据不丢失,集群状态为yellow;如果没有副本,则数据丢失,集群状态为red。
2.master找出该异常data节点的所有分片,如果该节点上有主分片,则将其他节点上的副本分片提升为主分片;该节点的所有主分片恢复后,该异常data节点所涉及的数据读写都恢复正常。
3.集群状态恢复为green