elasticSearch-进阶知识

elasticSearch-进阶知识,第1张

elasticSearch-进阶知识 一:集群  Node节点组合: 主节点 + 数据节点( master+data) 默认 。 
node.master: true  (为true只是代表有成为master的资格,如果集群中多个节点为true,需要竞选master) node.data: true (如果请求量和数据量较大,master节点最好不要存储数据)
数据节点( data )
node.master: false node.data: true
客户端节点( client )
不会成为主节点,也不会存储数据,主要是针对海量请求的时候可以进行负载均衡,分担压力

分片:

每个索引有1个或多个分片,均衡分布在集群中的节点上,存储不同的数据。 分片还可以指定副本,防止主分片挂掉,也可以响应查询。    创建索引时在settings中指定(不指定默认一个主分片,一个副本分片):

PUT /my_test
{
    "settings":{
        "number_of_shards" : "2",
        "number_of_replicas" : "2"
    },
    "mappings":{
        "properties":{
            "name":{
                "type":"text"
            }
        }
    }
}

如上,左边是没有设置分片和副本时候,默认一个主分片,一个副本分片。    右边有两个主分片0和1,各有两个副本分片。(主分片不一定在master节点)

集群规划:

1、需要多大规模:

Elasticsearch JVM heap 最大可以设置32G 。 30G heap 大概能处理的数据量 10 T。如果内存很大如128G,可在一台机器上运行多个ES节点实例。  所以通常业务在千万到几亿的数据量,2-4台节点即可。 跟随数据量增加。 

2、如何避免脑裂:

脑裂:

集群中出现多个master。

比如master因为处理任务太多,或者网络原因,和其他节点失去联系,然后选出了新的master,后续原master又恢复了。

又比如网络分区,将集群节点划分到两个区域,各分区选出自己的master,后续网络恢复后就有多个master。

解决方式:

1 ) Master 和 dataNode 角色分开,master不存储数据,防止处理业务压力过大或者发送fullGC等失去响应。 2)延长 ping master 的等待时长 discovery.zen.ping_timeout: 30 (默认值是 3 秒,超过后其他节点ping不通就认为不可用了) es7 中换成了 discovery.request_peers_timeout 3)es7之前,尽量避免脑裂,需要添加最小数量的主节点配置 discovery.zen.minimum_master_nodes: ( 有 master 资格节点数 /2) + 1。也就是要求过半才选新的master。   这样做可以防止分区后,每个分区都选举。 es7中不需要配置,集群自己控制。
以上措施都只能在一定程度上防止脑裂,并不会真正杜绝。 3、索引设置多少分片和副本?
分片: ElasticSearch 推荐的最大 JVM 堆空间是 30~32G, 所以把你的分片最大容量限制为 30GB, 然后再对分片数 量做合理估算 . 例如 , 你认为你的数据能达到 200GB, 推荐你最多分配 7 到 8 个分片。 在开始阶段 , 最好是根据你的节点数量按照 1.5~3 倍的原则来创建分片 . 例如 , 如果你有 3 个节点 , 则创建不超过9个。当性能下降时,增加节点,ES 会平衡分片的放置 副本: 为保证高可用,副本数设置为 2 即可,所以要求至少3个节点。  如果增加节点,可以重新设置副本数,提升查询性能。
注意: 创建索引后,分片数就不能变。 但是副本数是可以调节的。 性能优化建议: 写 *** 作:
1. 副本数置 0 如果是集群首次灌入数据 , 可以将副本数设置为 0,写入完毕再调整回去,这样副本分片只需要拷贝,节省了索引过程. 2 自动生成 doc ID     如果写入 doc 时如果外部指定了 id ,则 Elasticsearch 会先尝试读取原来doc 的版本号,以判断是否需要更新。这会涉及一次读取磁盘的 *** 作,通过自动生成 doc ID 可以避免这个环节。 3、合理设置mappings。 不需要分词的尽量用keyword,不需要索引字段的就不要索引。 4、对不需要打分的字段,禁用norms属性。 5、增大索引的刷新时间(默认1s),这种方式牺牲了可见性,不能及时看到最新的结果。 PUT /my_index/_settings {  "index" : {       "refresh_interval": "30s"     } } 6、写 *** 作使用批处理。
读 *** 作:
1、使用filter代替query 如果搜索不需要打分,可以直接使用 filter 查询。如果部分搜索需要打分,建议使用 'bool'查询。把打分的查询和不打分的查询组合在一起使用。 2、对于不需要range查询的numeric 类型,还是尽量使用keyword来等值查询。numeric为了做范围查询,没有使用倒排索引,而是使用的 block KD tree的存储结构。 3、对参数做优化,不要出现很多OR或者* 的查询    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5656542.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存