ELK日志之elasticsearch数据存储

使用es作为日志存储,上手使用方便,但资源消耗大

冷热节点

定期将旧日志热节点移动到冷节点中存储,热节点配置高速度快,冷节点存储成本低,且支持低频率查询

使用node.attr.box_type: hot/cold标识冷热节点

存储:热节点使用ssd,冷节点使用高效云盘

配置参考

计算资源: 2 核 8GB 的节点可以支持 5000 qps 的写入,随节点数量和节点规格提升,写入能力基本呈线性增长

索引和分片数量: 一个 shard 的数据量在 30-50 GB为宜,1GB 堆内存支持 20-30 个分片为宜,集群总体的分片数量一般不要超过 3w

索引

shard数量: 一天单服务的日志最大在1g,链路追踪的日志最大为3g,shard设置为即可,后期考虑将服务日志做合并到一个索引,用appname区分

索引模板

创建索引模板

1
2
3
4
5
6
7
8
9
10
PUT _template/log_template
{
"template": "log_*”, // 匹配索引
"order": 98,//优先级 值越大越高
"settings": {
"index.number_of_shards": "1",
"index.refresh_interval": "5s",
"index.routing.allocation.require.box_type":"hot"
}
}

ILM策略

索引生命周期策略

warm阶段: 因为日志是按天生成,设置24小时后过渡到warm阶段,索引已不再写入,合并segment为1,其余不变,保障搜索性能

cold阶段: 系统要求90天内日志可查,所以设置90天后过渡到cold,并将节点设置为cold,同时副本数(index.number_of_replicas)改为0,并冻结索引(把索引常驻内存的一些数据从内存中清理掉(比如 FST , 元数据等),默认情况下无法查询已经冻结的索引,需要显式增加 “ignore_throttled=false” 参数)

旧索引不会自动加入ILM,需要手动修改(建议分批修改,否则master可能会oom)

1
2
3
4
PUT log_*/_settings
{
"index.lifecycle.name": "mylifecycle"
}

并且修改策略只对之后新创建的索引生效

快照

存储库:使用oss挂载到节点上作为共享存储

自动快照的索引选择不支持时间表达式,只能自己写脚本生成每月快照

1
2
3
4
5
6
7
8
9
10
POST /_snapshot/my_backup/my_snapshot?
{
"indices": "*-2020.11.*",
"ignore_unavailable": true, // 忽略不可用索引
"include_global_state": false, // 不包括全局状态
"metadata": {
"taken_by": "kimchy",
"taken_because": "backup before upgrading"
}
}

待快照完成后再删除索引

1
DELETE /*-2020.11.*

其他命令

集群配置

transient 临时:这些设置在集群重启之前一直会生效。一旦整个集群重启,这些设置就被清除

persistent 永久:这些设置永久保存,除非再次被手动修改。是将修改持久化到文件中,重启之后也不影响。

节点进行数据传输的每秒最大字节数,-1是指无限制,默认为40MB

1
2
3
4
5
6
PUT _cluster/settings
{
"transient": {
"indices.recovery.max_bytes_per_sec": "-1"
}
}

调整集群恢复时的单机并发度,默认是2

1
2
3
4
5
6
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.node_concurrent_recoveries": 4
}
}