一、ES优化
调大系统的"最大打开文件数",建议32K甚至是64K
ulimit -a (查看)
ulimit -n 32000(设置)
修改配置文件调整ES的JVM内存大小
1:修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置一样大,避免频繁的分配内存,根据服务器内存大小,一般分配60%左右(默认256M)
2:如果使用searchwrapper插件启动es的话则修改bin/service/elasticsearch.conf(默认1024M)
设置mlockall来锁定进程的物理内存地址
避免交换(swapped)来提高性能
修改文件conf/elasticsearch.yml
boostrap.mlockall: true
分片多的话,可以提升建立索引的能力,5-20个比较合适。
如果分片数过少或过多,都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件,另外也会导致多台服务器之间通讯。而分片数过少会导至单个分片索引过大,所以检索速度慢。建议单个分片最多存储20G左右的索引数据,所以,分片数量=数据总量/20G
副本多的话,可以提升搜索的能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为需要同步数据。所以建议设置2-3个即可。
要定时对索引进行优化,不然segment越多,查询的性能就越差
索引量不是很大的话情况下可以将segment设置为1
curl -XPOST 'http://localhost:9200/megacorp/_optimize?max_num_segments=1'
java代码:client.admin().indices().prepareOptimize("megacorp").setMaxNumSegments(1).get();
删除文档:在Lucene中删除文档,数据不会马上在硬盘上除去,而是在lucene索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,lucene在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档
curl -XPOST 'http://localhost:9200/megacorp/_optimize?only_expunge_deletes=true'
client.admin().indices().prepareOptimize("megacorp").setOnlyExpungeDeletes(true).get();
如果在项目开始的时候需要批量入库大量数据的话,建议将副本数设置为0
因为es在索引数据的时候,如果有副本存在,数据也会马上同步到副本中,这样会对es增加压力。待索引完成后将副本按需要改回来。这样可以提高索引效率
去掉mapping中_all域,Index中默认会有_all的域,(相当于solr配置文件中的拷贝字段text),这个会给查询带来方便,但是会增加索引时间和索引尺寸
"_all":{"enabled":"false"}
log输出的水平默认为trace,即查询超过500ms即为慢查询,就要打印日志,造成cpu和mem,io负载很高。把log输出水平改为info,可以减轻服务器的压力。
修改ES_HOME/conf/logging.yaml文件
或者修改ES_HOME/conf/elasticsearch.yaml
二、es需要注意的问题
1、在使用java代码操作es集群的时候要保证本地使用的es的版本和集群上es的版本保持一致。
2、保证集群中每个节点的JDK版本和es配置一致
三、es源码分析-shard分片规则
elasticsearch在建立索引时,根据id或id,类型进行hash,得到hash值与该索引的文档数量取余,取余的值即为存入的分片。
具体源码为:根据PlainOperationRouting类的shardId方法进行分片
四、es+hbase
jetty 安装
http://eclipse-jetty.github.io/installation.html
项目中索引库的设计
curl -XPUT 'localhost:9200/megacorp/' -d'{"settings":{"number_of_shards":5,"number_of_replicas":0}}'
curl -XPOST 'localhost:9200/megacorp' -d @megacorp.json
测试索引库中某个字段的分词效果
curl -XGET 'http://localhost:9200/megacorp/_analyze?pretty&field=article.title' -d '超人学院'
五、mapping中可以设置的类型
字符串string
数字(byte,short,integer,long,float,double)
日期date
日期的话可以设置格式
{"type":"date","store":"yes","format":"YYYY-mm-dd"}
布尔型boolean
二进制binary
调大系统的"最大打开文件数",建议32K甚至是64K
ulimit -a (查看)
ulimit -n 32000(设置)
修改配置文件调整ES的JVM内存大小
1:修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置一样大,避免频繁的分配内存,根据服务器内存大小,一般分配60%左右(默认256M)
2:如果使用searchwrapper插件启动es的话则修改bin/service/elasticsearch.conf(默认1024M)
设置mlockall来锁定进程的物理内存地址
避免交换(swapped)来提高性能
修改文件conf/elasticsearch.yml
boostrap.mlockall: true
分片多的话,可以提升建立索引的能力,5-20个比较合适。
如果分片数过少或过多,都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件,另外也会导致多台服务器之间通讯。而分片数过少会导至单个分片索引过大,所以检索速度慢。建议单个分片最多存储20G左右的索引数据,所以,分片数量=数据总量/20G
副本多的话,可以提升搜索的能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为需要同步数据。所以建议设置2-3个即可。
要定时对索引进行优化,不然segment越多,查询的性能就越差
索引量不是很大的话情况下可以将segment设置为1
curl -XPOST 'http://localhost:9200/megacorp/_optimize?max_num_segments=1'
java代码:client.admin().indices().prepareOptimize("megacorp").setMaxNumSegments(1).get();
删除文档:在Lucene中删除文档,数据不会马上在硬盘上除去,而是在lucene索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,lucene在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档
curl -XPOST 'http://localhost:9200/megacorp/_optimize?only_expunge_deletes=true'
client.admin().indices().prepareOptimize("megacorp").setOnlyExpungeDeletes(true).get();
如果在项目开始的时候需要批量入库大量数据的话,建议将副本数设置为0
因为es在索引数据的时候,如果有副本存在,数据也会马上同步到副本中,这样会对es增加压力。待索引完成后将副本按需要改回来。这样可以提高索引效率
去掉mapping中_all域,Index中默认会有_all的域,(相当于solr配置文件中的拷贝字段text),这个会给查询带来方便,但是会增加索引时间和索引尺寸
"_all":{"enabled":"false"}
log输出的水平默认为trace,即查询超过500ms即为慢查询,就要打印日志,造成cpu和mem,io负载很高。把log输出水平改为info,可以减轻服务器的压力。
修改ES_HOME/conf/logging.yaml文件
或者修改ES_HOME/conf/elasticsearch.yaml
二、es需要注意的问题
1、在使用java代码操作es集群的时候要保证本地使用的es的版本和集群上es的版本保持一致。
2、保证集群中每个节点的JDK版本和es配置一致
三、es源码分析-shard分片规则
elasticsearch在建立索引时,根据id或id,类型进行hash,得到hash值与该索引的文档数量取余,取余的值即为存入的分片。
具体源码为:根据PlainOperationRouting类的shardId方法进行分片
四、es+hbase
jetty 安装
http://eclipse-jetty.github.io/installation.html
项目中索引库的设计
curl -XPUT 'localhost:9200/megacorp/' -d'{"settings":{"number_of_shards":5,"number_of_replicas":0}}'
curl -XPOST 'localhost:9200/megacorp' -d @megacorp.json
测试索引库中某个字段的分词效果
curl -XGET 'http://localhost:9200/megacorp/_analyze?pretty&field=article.title' -d '超人学院'
五、mapping中可以设置的类型
字符串string
数字(byte,short,integer,long,float,double)
日期date
日期的话可以设置格式
{"type":"date","store":"yes","format":"YYYY-mm-dd"}
布尔型boolean
二进制binary