我们使用ElasticSearch存储历史搜索数据。索引旨在按天从模板拆分。所有字段均为静态,可搜索字段已建立索引,其余字段均已禁用。
该索引经常被更新和搜索。更新是在其中添加文档;搜索将检索500个最新历史记录。它在低工作负载下表现不错,但是当我们在压力测试下(例如每秒150次更新+搜索操作)进行测试时,它的执行速度会慢5倍。
索引的大小不是很大,每天大约1GB。我们每30天轮换一次数据。
为此,我们配置了一个ES群集,其中包括1个主节点(4VCPU,8GB RAM)和5个数据节点(8VCPU,24GB RAM)。考虑到索引大小,我们将shard设置为0,将副本设置为4。在每个数据节点上,我们让ES使用12GB RAM,并将其他12GB分配给堆。
我们尝试增加刷新间隔之类的方法,但似乎没有效果:如果负载很轻,搜索时间为30毫秒;当负载很高时,可以跳到220毫秒。
我检查了缓存情况,这很糟糕:
"primaries": {
"query_cache": {
"memory_size_in_bytes": 0,
"total_count": 7883586,
"hit_count": 0,
"miss_count": 7883586,
"cache_size": 0,
"cache_count": 0,
"evictions": 0
}
},
"total": {
"query_cache": {
"memory_size_in_bytes": 0,
"total_count": 39982611,
"hit_count": 14,
"miss_count": 39982597,
"cache_size": 0,
"cache_count": 6,
"evictions": 6
此设置的每种可能都不是最优的,所以我愿意接受所有建议。
谢谢!