1. Mapping参数优化
- 字段类型选择:
- 对于数值型字段,在满足需求的前提下,尽量选择占用空间小的类型。例如,如果数据值范围在0 - 255之间,使用
byte
类型而不是integer
类型。对于文本字段,若不需要全文搜索,使用keyword
类型而非text
类型,因为text
类型会进行分词,占用更多资源。
- 例如,对于租户A的订单金额字段,若金额范围在0 - 10000且不需要小数,可定义为
short
类型:
{
"mappings": {
"properties": {
"order_amount": {
"type": "short"
}
}
}
}
- 动态映射控制:
- 可以根据租户需求,关闭不必要的动态映射。对于数据结构相对固定的租户索引,禁用动态映射可避免意外字段被自动添加,从而节省索引资源。通过设置
dynamic
参数为false
来关闭动态映射:
{
"mappings": {
"dynamic": false,
"properties": {
// 已定义的字段
}
}
}
- 若只想允许特定类型的字段动态添加,可设置
dynamic
为strict
,并通过dynamic_templates
定义允许动态添加的字段规则。
2. Field Data缓存优化
- 缓存配置:
- 对于读性能要求高且数据量相对稳定的租户索引,合理设置
fielddata
缓存。可通过修改elasticsearch.yml
文件,调整indices.fielddata.cache.size
参数,它可以设置为一个固定值(如10gb
)或占堆内存的百分比(如30%
)。
- 例如,对于租户B的用户信息索引,读操作频繁,可将
indices.fielddata.cache.size
设置为20%
:
indices.fielddata.cache.size: 20%
- 按需使用:
- 避免在不需要排序或聚合的字段上启用
fielddata
。因为fielddata
在首次访问时会将磁盘数据加载到内存,这会消耗资源。对于租户C的日志索引,其中的日志详情字段一般不需要排序或聚合,不应对该字段启用fielddata
。
3. 索引设置以避免资源争用
- 索引分片与副本:
- 根据租户数据量和读写需求分配分片和副本。对于读多写少的租户,可适当增加副本数来提高读性能,但要注意副本过多会增加写操作的负担。对于租户D,其数据量较大且读操作频繁,可设置较多的副本,如
replicas: 3
,同时根据数据量合理分配分片,如number_of_shards: 10
:
{
"settings": {
"number_of_shards": 10,
"number_of_replicas": 3
}
}
- 对于写多的租户,减少副本数,同时确保分片数量足够以分散写压力。
- 索引优先级:
- 可通过插件或自定义脚本实现索引优先级管理。对于性能要求高的租户索引,在资源有限时优先分配读写资源。例如,在使用
elasticsearch - curator
工具时,可以通过设置权重来控制索引的优先级,在资源紧张时,高优先级的租户索引能优先获取资源。
4. 资源隔离
- 节点分配:
- 利用Elasticsearch的节点标签和索引分配过滤功能,将不同租户的索引分配到不同的节点或节点组。例如,对于对性能要求极高的租户E,可以为其单独划分一组高性能节点,并通过设置
index.routing.allocation.require.tag
参数将租户E的索引分配到这些节点上:
{
"settings": {
"index.routing.allocation.require.tag": "high_performance"
}
}
- 同时在节点启动时,通过
node.attr.tag
参数为高性能节点添加相应标签。
- 资源限制:
- 使用操作系统层面的资源限制工具(如
cgroups
)或Elasticsearch的资源限制插件(如x-pack
中的资源限制功能),为不同租户的索引进程设置CPU、内存等资源的使用上限,防止某个租户过度占用资源影响其他租户。