(一)、ES技术上优化(运维做的)

一、硬件和系统的优化

1、使用SSD磁盘
2、内存的设置原则:一半的物理内存给JVM,另一半的内存给lucene,所以在ES内存设置方面遵循如下原则:
  • 物理内存小于64G时,ES<=50% (<=32G) Lucene>=50%
  • 当物理内存大于64G时 ES [4-32]G 其他的内存给Lucene
3、禁止swap,不允许内存与磁盘进行交换。

elasticsearch.yml设置 bootstrap.memory_lock: true保持jvm锁定内存,保证ES性能。

4、GC设置原则

GC的设置保持默认即可。

二、系统拓扑设计,采用HOT-Warm模式:Master节点、Hot节点、warm节点

2.1、Master节点

设置3个专用的Master节点,以提供最好的弹性扩展能力。discovery.zen.minimum_master_nodes属性设置防止脑裂。使用的公式设置:N/2+1为候选master节点。该节点保持node.data: false,master节点不参与查询、索引等操作,仅负责用于集群管理,资源配置为:(CPU:2C,内存:4G,磁盘:50G即可)x 3

2.2、Hot节点设置

索引节点(写节点),同时保持近期频繁使用索引。属于IO和CPU密集型操作,磁盘用SSD保持良好的写性能。节点设置为hot node.attr.box_type: hot 。功能用于索引的写,资源的配置为(CPU:16C,内存:32G SSD磁盘:2T)x 7

2.3、Warm节点

用于不经常访问的read-only索引(读节点),由于不经常使用可使用普通的磁盘即可。资源的配置(CPU:16C,内存:32G 磁盘:2T )X7。当索引不再被频繁查询时,通过设置:index.routing.allocation.require.box_type: warm将索引标记为warm,从而保证索引不写入hot节点(写节点),ES会自动将索引合并到warm节点。也可以设置elasticsearch.yml中设置index.codec: best_compression保证warm节点的压缩配置。

2.4、coordination节点

协调节点用于做分布式里的协调,将各分片或节点返回的数据整合后返回,es集群中,所有的节点都有可能是协调节点,可通过设置node.master: false node.data: false、node.ingest: false 都为false来设置专门的协调节点。需要较高的CPU和内存,可以放在warm节点(读节点上)

三、集群分片的设置

分片分为:主分片和副本分片
  • 主分片创建完成后就无法调整分片的数量。主分片数过小,如果索引增长过快的话,集群无法通过节点实现对这个索引的数据扩展,主分片数设置过大:导致单个shard容量很小,引发一个节点上有过多的分片,影响性能。
  • 副本数设置过多,将会降低集群整体的写入性能
分片的原则:
  • ​ 控制每个分片占用的磁盘容量不超过ES最大JVM堆空间设置(一般不超过32G,参加上下文切换的设置原则)

  • ​ 考虑下node节点数量。一般一个节点有时候是一台物理机,分片过多,大大超过了节点数,导致一个节点存在多个分片,一旦节点有问题的话,有可能造成数据丢失,集群节点无法恢复,所以设置的分片数不超过节点数的3倍。

    综上所述,节点数要尽可能的多,数据量大的话,尽可能多分片,分片尽量在不同的节点上,提供分布式计算。

四、索引的优化

1、设置refresh_interval为-1 同时设置number_of_replicas为0通过关闭refresh间隔周期刷新

,同时不设置副本来提高写的性能。

2、修改index_buffer_size的设置,可以设置成百分数,也可以设置成具体的大

indices.memory.index_buffer_size: 10%

indices.memory.min_index_buffer_size: 48mb

indices.memory.max_index_buffer_size

3、修改translog相关设置。

  • ​ 控制数据从内存到硬盘的操作频率,以减少磁盘IO,可将sync_interval的时间设置大一些 index.translog.sync_interval: 10s

  • 控制tranlog数据块的大小,达到threshold大小时,才会flush到lucene索引文件。

    index.translog.flush_threshold_size: 512mb

(二)、业务上的优化(业务方)

1、日志格式要统一json格式

2、查询的优化

  • query_string或multi_match查询的字段越多,查询越慢,可以在mapping阶段利用copy_to属性将多字段的值索引到一个新字段,mult_match时用新字段进行查询。

  • 日期字段的查询,尤其是用now的查询实际上是不存在缓存的,因此,可以从业务的角度来考虑是否用now,毕竟利用query cache是能够大大提高查询效率的。

  • 查询结果集的大小要设置成合理的值。es内部需要建立一个数据结构来放指定大小的结果集数据。

  • 尽量避免使用script,万不得已选择painless&expressions引擎,使用script查询,一定要控制返回,千万不要有死循环。ES没有脚本运行超时的控制,只要脚本没有执行完,该查询会一直堵塞。

  • 避免过深层级的聚会查询或层级过深的group by,会导致内存、CPU消耗。建议在服务层通过程序来组装业务,也可以通过pipline的方式来优化。

  • 复用预索引数据方式来提高AGG性能

  • cache的设置及使用:

    ​ querycache:es查询的时候,使用filter查询使用query cache,如果业务场景中过滤查询比较多可以将querycache设置大一些,以提高查询速度。indeices.queries.cache.size: 10%

    ​ FieldDataCache: 在聚类或排序是,field datacache会使用频繁,设置字段数据缓存的大小。

(三)、ES安装时需要的注意

一、使用rpm包安装ES,OS系统重要的配置如下:

1、切换root用户,更改打开最大的文件数,此更改尽在elasticsearch用户打开新会话时生效。
vim /etc/security/limits.conf
elasticsearch  -  nofile  65535

2、rpm安装es,需要打开最大文件数配置为65535
cat  /usr/lib/systemd/system/elasticsearch.service
LimitNOFILE=65535
3、在systemd配置内存锁定
cat  /etc/systemd/system/elasticsearch.service.d/override.conf
[Service]
LimitMEMLOCK=infinity

systemctl daemon-reload
systemctl restart elasticsearch
4、禁用交换空间
swapoff -a
5、配置swapiness,vm.swappiness = 1减少和内核交换的趋势。
 vim  /etc/sysctl.conf 
vm.swappiness = 1
sysctl -p
6、开启bootstrap.memory_lock
vim /etc/elasticsearch/elasticsearch.yml
bootstrap.memory_lock: true
7、查看是否锁定内存(GET _nodes?filter_path=**.mlockall)
curl http://172.21.42.153:9200/_nodes?filter_path=**.mlockall
{
    "nodes":{
        "wUSVTk-ER-CwkpCLyrIWIQ":{
            "process":{
                "mlockall":true
            }
        },
        "mPXmWxxyQ_OPwD4k--jE3A":{
            "process":{
                "mlockall":true
            }
        },
        "rqwflb9nRRWu6NG4Qt9pfQ":{
            "process":{
                "mlockall":true
            }
        }
    }
}
8、查看打开的最大文件数查询(GET _nodes/stats/process?filter_path=**.max_file_descriptors)
curl http://172.21.42.153:9200/_nodes/stats/process?filter_path=**.max_file_descriptors
{
    "nodes":{
        "wUSVTk-ER-CwkpCLyrIWIQ":{
            "process":{
                "max_file_descriptors":65536
            }
        },
        "rqwflb9nRRWu6NG4Qt9pfQ":{
            "process":{
                "max_file_descriptors":65536
            }
        },
        "mPXmWxxyQ_OPwD4k--jE3A":{
            "process":{
                "max_file_descriptors":65536
            }
        }
    }
}
9、修改虚拟内存(es使用mmapfs目录存储索引,默认的max_map_count太小)
sysctl -w vm.max_map_count=262144
vim /etc/sysctl.conf
vm.max_map_count=262144
sysctl vm.max_map_count

参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html

二、ES相关的配置

1、JVM配置,一半的内存分给JVM,另一半的内存给Luence用于查询,且ES的jvm不得大于32G
vim /etc/elasticsearch/jvm.options
-Xms31g
-Xmx31g

2、Master节点的配置
cat /etc/elasticsearch/elasticsearch.yml
#####集群的名字可以换
cluster.name: zmbiz-csc-lesson-aggr 
node.name: es-master1.com
node.attr.rack: r6
node.master: true
node.data: false
node.ingest: false
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
transport.tcp.compress: true
http.enabled: true
http.port: 9200
bootstrap.memory_lock: true
discovery.zen.ping.unicast.hosts: ["es-master1.com:9300","es-master2:9300", "es-master3:9300","es-hot1.com:9300","es-hot2.com:9300"......,"es-coldn.com:9300"]
discovery.zen.minimum_master_nodes: 2
bootstrap.system_call_filter: false

3、hot节点的配置
cat /etc/elasticsearch/elasticsearch.yml
#####集群的名字可以换
cluster.name: zmbiz-csc-lesson-aggr 
node.name: es-hot1.com
node.attr.rack: r1
node.master: false
node.data: true
node.attr.hotwarm_type: hot
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 172.21.22.24
transport.tcp.compress: true
http.enabled: true
http.port: 9200
bootstrap.memory_lock: true
discovery.zen.ping.unicast.hosts: ["es-master1.com:9300","es-master2:9300", "es-master3:9300"]
discovery.zen.minimum_master_nodes: 2
bootstrap.system_call_filter: false

4、cold节点
cat /etc/elasticsearch/elasticsearch.yml
cluster.name: zmbiz-csc-lesson-aggr 
node.name: es-cold1.com
node.attr.rack: r1
node.master: false
node.data: true
node.attr.hotwarm_type: cold
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 172.21.22.20
transport.tcp.compress: true
http.enabled: true
http.port: 9200
bootstrap.memory_lock: true
discovery.zen.ping.unicast.hosts: ["es-master1.com:9300","es-master2:9300", "es-master3:9300"]   ###只配置主节点的地址
discovery.zen.minimum_master_nodes: 2
bootstrap.system_call_filter: false

5、coordination节点配置
cat /etc/elasticsearch/elasticsearch.yml
cluster.name: zmbiz-csc-lesson-aggr 
node.name: es-coord.com
node.master: false
node.data: false
node.ingest: false

path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 172.21.22.10
transport.tcp.compress: true
http.enabled: true
http.port: 9200
bootstrap.memory_lock: true    
discovery.zen.ping.unicast.hosts: ["es-master1.com:9300","es-master2:9300", "es-master3:9300"] ###只配置主节点的地址
discovery.zen.minimum_master_nodes: 2  ####防止脑裂3个master设置为2
bootstrap.system_call_filter: false

######
discovery.zen.ping.unicast.hosts: 只配置master主机的地址

es安装

ansible-playbook -i ipp /etc/ansible/playbook/elasticsearch.yml