Elasticsearch:《ElasticSearch深入理解》之es集群(7)分布式索引架构

 第4章:分布式索引架构 
----------------------------------------------------------------------------------------------------------------

4.1.选择合适的分片数和副本数
---------------------------------------------------------

4.1.1    集群分片数:默认是创建5个分片;理想的分片(shards)数量应该依赖于节点数量。最大节点数=分片数*(副本+1);分片多 索引小 执行的操作更快。

    查询时 多个分片上的索引再合并结果,时间开销会增大。分片解决了超过单机容量存储数据的问题。

4.1.2    lucene 索引和es索引:分片即lucene索引,不同的查询会被送到不同的分片,不同的查询执行偏好不同。


4.1.3    集群副本数:默认1个副本    ,副本解决日益增长的数据量和数据安全的问题。缺点,分片过多的副本占用存储空间,主分片与副本之间的数据拷贝需要时间开销。

4.1.4    常用的方法:get-查看 put-更新 post-创建+覆盖  delete+删除  -XPUT -POST -GET -DELETE


4.2     路由
----------------------------------------------------------

4.2.1    路由定义:限定查询在单个分片上执行。或者决定文档应该存储在哪个分片上。ES根据路由信息,决定哪个分片来存储和查询。哪个分片存储,查询时也用对应的分片查询。

    没有路由时:查询时 查询会放到所有的分片上 。

    路由的作用:指定用哪个分片来存储文档和执行查询。路由是优化集群的强大机制,根据应用程序的逻辑部署文档,构建更高效的查询。

            相同路由值会索引到相同的分片上。但一个分片上,也会拥有多个不同路由值的文档。

4.2.2 paramedic:    查看ES到底对数据做了什么。

4.2.3 路由语句: curl -XPUT 'localhost:9200/documents/doc/1?routing=A -d '{"title":"Document"}

            如在mapping 中设置了routing,则可以写如下代码

        curl -XPUT 'localhost:9200/documents/doc/1 -d '{"title":"Document no.1","_routing":"A"}

4.2.4 索引时:     一个分片上拥有很多拥有不同路由值的文档,路由确保了拥有相同路由值的文档会索引到相同的分片上。

4.2.5 查询:    查询无论是否使用路由,都需要使用相同的过滤器。

4.2.6 别名:    别名可以隐藏一些配置信息,共其他人查询和索引。


4.2.7 多路由值的查询:   curl -XGET localhost:9200/documents/_search?routing=A,B ' 多路由值也支持别名;查询支持多路由,索引不支持多路由值。


        
4.3    调整默认的分片分配行为
----------------------------------------------------------

4.3.1 分片分配器: ShardAllocator 承担分片分配最主要的类。

4.3.2 集群的拓扑结构变化:当加入和移除节点,集群的拓扑结构会发生变化。两个分片分配器even_shard ,balanced(默认),

              在elasticsearch.yml中设置cluster.rounting.allocation.type 可以指定分片器的类型。

              even_shard:es 0.9之前就有,每个节点上有相同的分片,同时可以禁止主分片和副本存在同一个节点上。需要重新分配和使用even_shard时
    
              es 从负载最高的节点向较低的节点移动直到完全平衡或无法移动。

    
    balanced: es0.9之后的版本有,加了可控制的权重进行分配

        cluster.rounting.allocation.balace.[shard|index|primary|threshold] 其默认值为【0.45|0.5|0.05|1.0】

        shard:每个节点的所有分配数,分配数量相近的分片数的重要程度。

        index: 同一索引的分片数

        primary:主分片平均分配到节点有多重要

4.3.3 自定义分配分片器

    因集群中硬件资源,CPU、容量等的不同,需考虑不同索引的大小。

    步骤1:cluster.rounting.allocation.type 设置成 一个类的全限定名。

    步骤2:而且这个类要实现,org.elasticsearch.cluster.routing.allocation.allocator.ShardsAllocator

4.3.4 裁决者 decider 

        

4.4    调整分片分配
----------------------------------------------------------

4.4.1 添加属性名:在elasticsearch.yml 里有node.tag ,node.group  如果添加party 则为node.party

4.4.2 部署意识:在elasticsearch.yml 里添加 cluster.routing.allocation.awareness.attributes:group 【告诉ES使用node.group 作为意识参数】

    有了此参数后,不会将分片和副本拥有相同值的属性,尤其是部署意识相同的节点上。

    强制部署意思:cluster.routing.allocation.awareness.attributes:group

        cluster.routing.allocation.awareness.force.zone.values: groupA, groupB  添加到elasticsearch.yml里即可。

4.4.3 过滤

    集群级别的过滤:包含类似或者关系,require 类似and关系

        cluster.routing.allocation.include

        cluster.routing.allocation.require

        cluster.routing.allocation.exclude
        

    索引级别的过滤:
        index.routing.allocation.include

        index.routing.allocation.require

        index.routing.allocation.exclude

    实例:

        cluster.routing.allocation.include._ip: 192.168.2.1

        cluster.routing.allocation.include.group: groupA

        可以使用通配符:group* 包含 groupA 和 groupB


4.4.4 运行时更新分配策略


    集群级别更新:curl -XPUT 'localhost:9200/_cluster/settings' -d '{"transient":{"cluster.routing.allocation.require":"groupA"}}

    索引级别更新:curl -XPUT 'localhost:9200/mastering/_settings' -d '{"transient":{"cluster.routing.allocation.require":"groupA"}}

    以上两个值:集群重启后生效

    永久生效如下:永久和临时都可以包含多个属性

    集群级别更新:curl -XPUT 'localhost:9200/_cluster/settings' -d '{"persistent":{"cluster.routing.allocation.require":"groupA"}}

    索引级别更新:curl -XPUT 'localhost:9200/mastering/_settings' -d '{"persistent":{"cluster.routing.allocation.require":"groupA"}}

4.4.5 设置总的分片数

    在elasticsearch.yml 里设置  index.routing.allocation.total_shards_per_node: 4 这样单个节点最多4个分片。


    运行时设置:curl -XPUT 'localhost:9200/mastering/_settings' -d '{"cluster.routing.allocation.total_shards_per_node":"4"}


4.4.6  更多的分片分配属性

    cluster.routing.allocation.allow_rebalance 把握再平衡的时机

    cluster.routing.allocation.allow_concurrent_rebalance 多少分片并发参与,在平衡

    cluster.routing.allocation.node_intital_primairies_recoveries 每个节点并发恢复的主分片数量

    cluster.routing.allocation.node_concurrent_Recoveries 每个节点允许并发恢复的最大分片数量

    cluster.routing.allocation.diable_new_allocation 是否禁止为新创建的索引分配新分片

    cluster.routing.allocation.diable_allocation 是否禁止为对已创建的主副分片的分配

    cluster.routing.allocation.diable_replica_allocation  是否禁止分配副本分片到节点。


4.5    查询执行偏好
----------------------------------------------------------

4.5.1 preference 参数

    _primary : 操作仅会在主分片上执行。

    _primary_first: 主分片异常时,可以在副本分片上执行

    _local: 在本地节点查询

    _only_node_: 标识符    在特定的标识符上执行

    _prefer_node_: 标识符    优先在特定的标识符上执行

    _shards:0,1;_local  在本地的0,1分片上查询

    custom: 相同值的查询 会在相同的分片上执行

4.6    应用我们的知识
----------------------------------------------------------

4.6.1    集群测试工具 ApacheJMeter;ActionGenerator;elasticsearch paramedic;BigDesk;SPM for elasticsearch

4.6.2   相关的配置:节点级配置【cluster.name,node.master,node.max_local_storage_nodes】

             索引级配置【index.number_of_shards,index.number_of_replicas】

             目录布局【conf,data,work,log】

             网关配置【type,recover_after_nodes,recover_after_time,expected_nodes】

             恢复【cluster.routing.allocation.node_intital_primairies_recoveries,cluster.routing.allocation.node_concurrent_Recoveries ,
                indices.recovery.concurrent_stream将此值设置为8,则可以同时读取8个索引文件】

             发现【discovery.zen.minimum_master_nodes,指定成为主节点的最小节点数,最小为节点数一半加1】

             记录慢查询【index.search.slowlog.threshold.query|fetch.info: 500ms,index.search.slowlog.threshold.query|fetch debug: 100ms】

             记录垃圾回收器的工作情况【monitor.jvm.gc.加上其他参数,在elasticsearch.yml里即可】

             内存设置【不要超过电脑一半的内存,总16G内存,Xmx和Xms Java设置为8G;但如果有复杂的父子关系和高基数的字段,可以适当提高内存,但要给系统留够

                空间,swapping才会快,这个时候考虑是否可以锁定堆内存 bootstrap.mlockall为true 即可以,同时设置 ES_MIN_MEM 和 ES_MAX_MEM为同样的值】

4.6.3 业务量巨增 如何优化

    解决策略1:重新索引-----多建一个索引

    解决策略2:用别名

    解决策略3:用别名定义虚拟索引 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值