系统参数
- 修改系统最大打开文件描述符数
-
vi /etc/security/limits.conf
,增加配置,用户退出后重新登录生效
-
* soft nofile 65535
* hard nofile 65535
- 修改用户可以打开的最大线程数
-
vi /etc/security/limits.conf
, 增加配置,用户退出后重新登录生效
-
* soft nproc 4096
* hard nproc 4096
- 单个jvm能开启的最大线程数
vi /etc/sysctl.conf
- 添加如下配置
sysctl -p
vm.max_map_count=262144
- 锁定物理内存
vi /etc/security/limits.conf
es soft memlock unlimited
es hard memlock unlimited
es soft memlock unlimited
es hard memlock unlimited
- 关闭swap,锁定进程地址空间,防止内存swap
vi /etc/sysctl.conf
vm.swappiness=0
- 重启机器,使配置生效
reboot
elasticsearch.yml
# 集群的名称,同一个集群该值必须设置成相同的
cluster.name: demo-application
# 该节点的名字
node.name: node-1
# 内存锁定
bootstrap.memory_lock: true
#该节点有机会成为master节点
node.master: true
# 该节点可以存储数据
node.data: true
# 设置绑定的IP地址,可以是IPV4或者IPV6
network.bind_host: 0.0.0.0
# 设置其他节点与该节点交互的IP地址
network.publish_host: 191.168.1.100
# 该参数用于同时设置bind_host和publish_host
network.host: 191.168.1.100
# 设置节点之间交互的端口号
transport.tcp.port: 9300
# 设置是否压缩tcp上交互传输的数据
transport.tcp.compress: true
# 设置对外服务的http端口号
http.port: 9200
# 设置http内容的最大大小
http.max_content_length: 100mb
# 是否开启http服务对外提供服务
http.enabled: true
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点,建议设置(n/2)+1, 防止脑裂问题
discovery.zen.minimum_master_nodes: 2
# 设置集群中自动发现其他节点时ping连接的超时时间
discovery.zen.ping_timeout: 30s
# 设置是否打开多播发现节点
#discovery.zen.ping.multicast.enabled: false
# 置集群中的Master节点的初始列表,可以通过这些节点来自动发现其他新加入集群的节点
discovery.zen.ping.unicast.hosts: ["191.168.1.100:9300","191.168.1.101:9300","191.168.1.102:9300"]
# 是否支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
jvm.options
- Heap Size不超过物理内存的一半,且小于32G
- 如果Heap Size大于6g,建议使用G1垃圾回收
# 初始的Heap的大小,与Xmx的值保持一致
-Xms8g
# 最大Heap的大小,与Xms的值保持一致
-Xmx8g
# 修改默认的垃圾回收机制CMS为G1
#-XX:+UseConcMarkSweepGC
#-XX:CMSInitiatingOccupancyFraction=75
#-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
全量导入数据准备操作
- 开始导入前将副本分片数量设置为0
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/cmas/_settings' -d '{"index": {"number_of_replicas":0}}'
- 导入完成后设置副本分片数量为1
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/cmas/_settings' -d '{"index": {"number_of_replicas":1}}'
索引优化
合理设置分片
- 适当增大分片,可以提升建立索引的能力,5~20个比较合适
- 如果分片数过多或过少,都会导致检索比较慢
- 分片数过多,会导致检索时打开文件较多,另外也会导致多台服务器之间通讯,影响效率
- 分片数过少会导致至单个分片索引过大,所以检索速度慢
- 建议单个分片最多存储20G左右的索引数据,通用计算公司:分片数量=数据总量/20G
合理设置副本数
- 增加副本,可以提升搜索的能力
- 如果副本设置过多,会对服务器造成额外的压力,因为主分片需要给所有的副本分片同步数据。另外,副本过多也会占用磁盘空间
- 一般建议最多设置2~3个即可
合并索引
-
定时对索引进行合并优化,segment越多,占用的segment memory越多,查询的性能也越差
- 索引量不大的情况下,可以将segment设置为1
- 在es1.2.0以前调用_optimize接口,后期改为_forcemerge接口
curl -u elastic:123456 -XPOST 'http://master:9200/test/_forcemerge?max_num_segments=1'
关闭索引
- 针对不使用的index,建议close,减少内存占用
- 只要索引处于open状态,索引库中的segment就会占用内存,close之后就只会占用磁盘空间,不会占用内存空间
curl -u elastic:123456 -XPOST 'master:9200/test/_close'
清除删除文档
- 在Lucene中删除文档,数据不会马上在磁盘上清除,而是在Lucene索引中产生一个.del文件。然而在检索过程中,这部分数据也会参与检索,Lucene在检索过程中会判断是否删除,如果已经删除,再过滤掉,这样也会降低检索效率
- 可以执行清除删除文档命令
curl -u elastic:123456 -XPOST 'http://master:9200/test/_optimize?only_expunge_deletes=true
合理数据导入
- 如果在项目开始阶段,需要批量入库大量的数据,建议将副本数量设置为0.因为es在索引数据的时候,如果副本已经存在,数据会立即同步到副本中,这样会对es增加压力
- 等到索引完成之后,再恢复副本数即可,可以提高索引效率
curl -XGET http://master:9200/test/_settings?pretty
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/test/_settings' -d '{"index": {"number_of_replicas":0}}'
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/test/_settings' -d '{"index": {"number_of_replicas":1}}'
设置索引_all
- 去掉mapping中_all域,index中默认会有__all域,虽然会给查询带来方便,但是会增加索引时间和索引尺寸
PUT /my_index
{
"mapping": {
"user": {
"_all": {
"enable": false
}
}
}
}
设置索引_source
- _source字段在我们检索时相当重要
- ES默认检索只会返回ID,如果在{"enable":false}情况下,你需要通过根据这个ID去倒排索引中去取每个Field数据,效率不高。反之,在{"enable":true}情况下可以根据ID直接检索对应source JSON的字段,不用去倒排索引去按FIeld取数据
版本一致
- 使用Java代码操作ES集群,要保证本地es的版本和集群上es的版本保持一致
- 保证集群中的每个节点的JDK版本和es配置一致
问题处理
集群脑裂问题
-
原因
- 网络原因
- 节点负载
- 回收内存
-
解决方案
- 将master节点与data节点分离
node.master:true node.data:false
- 为了使新加入的节点快速确定master位置,可以将data节点的默认master发现方式由multicast修改为unicast
discovery.zen.ping.multicast.enable:false discovery.zen.ping.unicast.hosts:["master1","master2","master3"]
- discovery.zen.ping.timeout: 默认三秒,如果master节点在3秒内没有应答,那么这个节点就是挂掉了。增加这个值,会增加节点等待响应的时间,从一定程度上会减少误判
- discovery.zen.minimum_master_node:默认是1,这个参数控制的是一个节点需要看到的具有master节点资质的最小数量,然后才能在集群中做操作。官方推荐的是(n/2)+1,其中n是具有master资格的节点的数量
翻页问题
- 尽量不要使用浅分页
- 如果业务需要必须使用浅分页,需要考虑最大翻页数
PUT /my_index/_settings
{
"index": {
"max_result_window": 50000
}
}