1. jvm配置:

        1.1内存配置(推荐第一种)

                编辑:config/jvm.options 修改:-Xms20g -Xmx20g
                编辑:bin/elasticsearch  加上:export ES_HEAP_SIZE=10g

       1.2 配置独立的jdk:

                修改bin/elasticserach文件:
                export PATH=/.../jdk1.8.0_144/bin:$PATH
                export JAVA_HOME=/.../jdk1.8.0_144
                export ES_HOME=/.../elasticsearch-5.1.2)

2.yml文件配置:

              es默认的配置基本支持很好的运行:

              

# ---------------------------------- Cluster -----------------------------------
                #定义es集群名称
                cluster.name: my-application
                # ------------------------------------ Node ------------------------------------
                #定义该节点的名称,各个节点不能重复
                node.name: node-1
                node.master: true
                node.data: true
                node.max_local_storage_nodes: 5
                # ----------------------------------- Paths ------------------------------------
                #配置数据目录
                path.data: /usr/es/data
                #配置日志目录
                path.logs: /usr/es/logs
                # ----------------------------------- Memory -----------------------------------
                #关闭锁定内存
                bootstrap.memory_lock: false
                #bootstrap.system_call_filter: false
                # ---------------------------------- Network -----------------------------------
                #指定本机IP地址,每个节点都要修改
                network.host: 172.16.2.90
                #指定http访问端口
                #http.port: 9200
                # --------------------------------- Discovery ----------------------------------
                #master节点列表
                discovery.zen.ping.unicast.hosts: ["172.16.2.90"]
                #discovery.zen.minimum_master_nodes: 3
                # 增加新的参数,这样head插件可以访问es
                #http.cors.enabled: true
                #http.cors.allow-origin: "*"

        2.1node节点冷热分离

              可以指定索引存到哪个节点

       

node.attr.tag: tag_one  
               node.attr.zone: zone_one 
               
               curl -u elastic:changeme -XPUT '172.16.2.206:9200/scistor/_settings' -d 
               '{"index.routing.allocation.require.tag":"tag_one"}'
               curl -u elastic:changeme -XPUT '172.16.2.206:9200/scistor/_settings' -d 
               '{"index.routing.allocation.include.zone":"zone_one"}'

        2.2集群健康相关属性配置

              1.节点种类:
              a.主(master)节点
                     node.master:true
                     主节点负责集群操作,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点
              b.数据(data)节点
                     node.data:true
                     该节点保存数据和执行数据相关的操作,如增删改查,搜索,和聚合
              c.客户端节点(访问的入口需要指向此节点的IP)
                     node.master:false   node.data:false
                     客户端节点,响应用户的情况把相关操作发送到其他节点,处理路由请求,处理搜索,分发索引操作等,表现为智能负载平衡器。负责协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。 
              d.部落节点
                    当一个节点配置tribe.*的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接的集群上执行搜索和其他操作
              2.#discovery.zen.minimum_master_nodes: 2  
              (master节点数/2+1 3===2)当没有足够master候选节点时,不要进行master选举,等master候选节点足够了才进行选举。
        

#discovery.zen.ping.multicast.enabled: false
                #discovery.zen.ping.unicast.hosts: ["host1","host2"]


              关闭多播,开启主节点单播)
              3.(gateway.expected_nodes/gateway.expected_master_nodes/gateway.expected_data_nodes) 三种节点分别设置
             

#gateway.expected_data_nodes: 10
                #gateway.recover_after_time: 5m
                #gateway.recover_after_data_nodes: 8


              集群有10个data node加入了,或者5分钟以后8个以上的data node加入了,才会正常工作,复制数据

        2.2集群性能相关属性配置

                  1.index.store.type: niofs # 读写文件方式
                  2.bootstrap.memory_lock: true #锁住内存
                   (
                   切换到root用户,编辑limits.conf配置文件, 添加类似如下内容:
                   sudo vim /etc/security/limits.conf
                   添加如下内容:
                   * soft memlock unlimited
                   * hard memlock unlimited
                   备注:* 代表Linux所有用户名称
                   )          
                  3.#索引线程池size默认为可用处理器的数量,队列的size默认为100
                   threadpool.index.type: fixed #线程池类型
                   threadpool.index.size: 64 #线程池大小(不能超过cpu数)       
                   threadpool.index.queue_size: 1000 #队列大小
                   #批量线程池size默认为可用处理器的数量,队列的size默认为50                                            
                   threadpool.bulk.type: fixed  
                   threadpool.bulk.size: 32
                   threadpool.bulk.queue_size: 1000           
                  4.# 缓存类型设置为Soft Reference,只有当内存不够时才会进行回收
           

index.cache.field.type: soft
                    index.cache.field.max_size: 50000 #最大缓存数据条数
                    index.cache.field.expire: 10m #缓存失效时间
      
                    curl -u elastic:changeme -XPUT '172.16.2.206:9200/_all/_settings/?preserve_existing=true -d '{
                      "index.cache.field.expire" : "10m",
                      "index.cache.field.max_size" : "5000",
                      "index.cache.field.type" : "soft"
                    }'
5.transport.tcp.compress: true #压缩传输  
                    index.refresh_interval: -1  #-1禁止刷新index.store.type
                    indices.memory.index_buffer_size: 20% #索引缓冲大小,通常是JVM的0.1,确保他足够处理至多512MB的索引
                    index.translog.durability: async #异步写硬盘,增大写的速度
                    index.translog.flush_threshold_size: 600MB #当translog的大小达到此值时会进行一次flush操作.默认是512mb
                   index.translog.flush_threshold_ops: 50000 #当发生多少次操作时进行一次flush.默认是 unlimited
                    index.translog.flush_threshold_period: 30m #在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作.默认是30m 
                    index.translog.interval: 5s #多少时间间隔内会检查一次translog,来进行一次flush操作.es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s
                    index.gateway.local.sync: 5s #多少时间进行一次的写磁盘操作,默认是5s
      
                    curl -u elastic:changeme -XPUT '172.16.2.206:9200/_all/_settings/?preserve_existing=true' -d '{
                      "index.refresh_interval" : "-1",
                      "index.translog.durability" : "async",
                      "index.translog.flush_threshold_ops" : "50000",
                      "index.translog.flush_threshold_size" : "600MB"
                    }'

                 6.shard重新复制,移动,删除,再次移动的过程,会大量的耗费网络和磁盘资源。对于数据量庞大的集群来说,可能导致每次集群重启时,都有TB级别的数据无端移动,可能导致集群启动会耗费很长时间。但是如果所有的节点都可以等待整个集群中的所有节点都完全上线之后,所有的数据都有了以后,再决定是否要复制和移动shard,情况就会好很多。

               gateway.recover_after_nodes: 8。这个参数可以让es直到有足够的node都上线之后,再开始shard recovery的过程。所以这个参数是跟具体的集群相关的,要根据我们的集群中节点的数量来决定。

               此外,还应该设置一个集群中至少要有多少个node,等待那些node的时间:gateway.expected_nodes: 10,gateway.recover_after_time: 5m。

               经过上面的配置之后,es集群的行为会变成下面这样,等待至少8个节点在线,然后等待最多5分钟,或者10个节点都在线,开始shard recovery的过程。这样就可以避免少数node启动时,就立即开始shard recovery,消耗大量的网络和磁盘资源,甚至可以将shard recovery过程从数小时缩短为数分钟

                  7.关闭swap,设置bootstrap.memory_lock放置内存被偷走