索引生命周期管理ILM看完不懂你锤我

2023-05-16

阅读完本文你可以学到什么是索引生命周期管理,各个阶段可以做的操作以及如何使用索引模版使用索引生命周期策略,下面就跟我一起来吧

基础理论篇

索引生命周期管理(ILM)是一种可以让我们随着时间推移自动化的管理索引的一种方式。我们可以根据性能,索引文档数量、大小等弹性要求,文档的保留需求等方面来自定义索引生命周期管理策略,我们可以使用ILM实现如下需求

  • 当索引达到一定的大小或者一定的文档数量时生成一个新的索引

  • 每天、每周或者每个月创建一个新索引、并把之前的索引归档

  • 删除历史索引、按照数据保留标准执行是否保留索引

在ILM策略期间可以触发的操作有:Set Priority,Unfollow,Rollover,Read-only,Shrink,Force merge,Searchable snapshot,Allocate,Migrate,Wait for snapshot,Delete

下面是每个操作具体的含义

  • Set Priority

    可应用阶段:HotWarmCold

    设置步骤的优先级

    必须参数,设置索引优先级,大于等于0的整数;设置为null删除优先级;Hot阶段应具有最高值,Cold应具有最低值;例如Hot 100Warm 50Cold 0;未设置此值的索引优先级默认为1

  • Unfollow

    可应用阶段:HotWarmColdFrozen

    跨集群索引设置为标准索引,可以使shrinkrolloversearchable snapshot 操作安全的在follower索引上执行;

    在整个生命周期中移动follower索引时,也可以直接使用unfollow,对于不是follower索引的没有影响、阶段执行中只是跳转到下一个操作

    shrinkrolloversearchable snapshot 应用于follower索引时,该操作会自动触发

    follower索引安全转换为标准索引需要满足以下条件

    • leader 索引 index.lifecycle.indexing_complete设置为true。如果是rollover操作,则会自动设置此设置,或者使用index settings api手动设置
    • leader 索引执行的操作都已经复制到follower索引,这样可以确保在转换索引时不会丢失任何操作

    当上述条件都满足后,unfollow将执行以下操作

    • 暂停follower索引的索引
    • 关闭follower索引
    • 取消 leader索引
    • 打开follower索引(此时是标准索引)
  • Rollover

    滚动策略,也就是按照策略递增的实现方式;

    当前索引达到一定的大小、或者一定文档的数量或者年龄时自动创建一个新的写索引

    可应用阶段:Hot

    如果该操作是在follower索引上执行,那么该操作将等待leader 索引执行该操作完成

    rollover的目标可以是数据流或者索引别名

    当滚动目标是数据流时,这个生成的新索引将成为数据流的写入索引,并且索引名是递增

    当滚动目前是索引别名时,别名以及其写索引需要满足以下条件(重要!!!重要!!!重要!!!)

    • 索引名称必须满足如下匹配规则*^.\*-\d+$*
    • 索引的滚动目标别名index.lifecycle.rollover_alias必须要设置
    • 该索引必须是索引的写入索引

    例如:索引my-index-001别名为my_data,如下配置是必须的

    PUT my-index-001
    {
      "settings": {
        "index.lifecycle.name": "my_policy",
        "index.lifecycle.rollover_alias": "my_data"
      },
      "aliases": {
        "my_data": {
          "is_write_index": true
        }
      }
    }
    

    上面我们看到rollover的操作需要满足一种条件,那么我们必须至少设置一种滚动条件

    • max_age:从索引创建之日起开始计算时间,满足之后触发滚动操作。例如1d7d30d;即使我们通过index.lifecycle.parse_origination_date或者index.lifecycle.origination_date来设置索引的起始日期,计算时也是按照索引创建时的日期

    • max_docs:达到指定的最大文档数量之后触发滚动操作。上一次refresh之后的文档不计数,副本分片中的文档也不计数

    • max_size:当索引中所有的主分片之和达到一定的大小时触发滚动操作,副本分片不计算入最大索引大小

      在使用_cat API 时,pri.store.size的值就是主分片的大小

    • max_primary_shard_size:当索引中最大的主分片达到一定的大小时触发滚动操作,这是索引中最大主分片的最大大小。与max_size一样,副本分片大小也不计入其中

  • Read-only

    可应用阶段:HotWarmCold

    使索引变为只读索引,如果要在Hot阶段执行Read-only操作,前提是必须执行rollover操作,如果没有配置rollover操作,ILM将拒绝Read-only策略

  • Shrink

    可应用阶段:HotWarm

    前提:将源索引设置为只读;所有分片必须在同一个节点上;集群健康状态为 Green

    减少索引分片的数量或者减少主分片的数量,生成的索引名为shrink-<random-uuid>-<original-index-name>,分片数量使用如下参数控制

    • number_of_shards:可选整数类型,必须为现有索引分片数整除的数字,与max_primary_shard_size不兼容,只能设置一个
    • max_primary_shard_size:可选字节单位(b,kb,mb,gb,tb,pb),目标索引的最大主分片的大小,用于查找目标索引的最大分片数,设置此参数后,每个分片在目标索引的存储占用不会大于该参数
  • Force merge

    可应用阶段:HotWarm

    合并索引中的segments到指定的最大段数,此操作会将索引设置为Read-only;强制合并会尽最大的努力去合并,如果此时有的分片在重新分配,那么该分片是无法被合并的

    如果我们要在Hot阶段执行Force merge 操作,rollover操作是必须的,如果没有配置rolloverILM会拒绝该策略

    • max_num_segments:必须的整数类型,表示要合并到的segments数量,如果要完全合并索引,需要设置值为1
    • index_codec:可选字符串参数,压缩文档的编解码器,只能设置best_compression,它可以获得更高的压缩比,但是存储性能较差。该参数默认值LZ4,如果要使用LZ4,此参数可不用设置
  • Searchable snapshot

    可应用阶段:HotColdForzen

    将快照挂载为可搜索的索引。如果索引是数据流的一部分,则挂载的索引将替换数据流中的原始索引

    Searchable snapshot操作绑定对应的数据层,也就是(Hot-Warm-Cold-Forzen-Delete),恢复数据时直接恢复到对应的数据层,该操作使用index.routing.allocation.include._tier_preference设置,在冻结层(frozen)该操作会将前缀为partial-的部分数据恢复到冻结层,在其他层,会将前缀为restored-的全部数据恢复到对应层

  • Allocate

    可应用阶段:WarmCold

    设定副本数量,修改分片分配规则。将分片移动到不同性能特征的节点上并减少副本的数量,该操作不可在Hot阶段执行,初始的分配必须通过手动设置或者索引模版设置。如果配置该设置必须指定副本的数量,或者至少指定如下操作的一个(include,exclude,require),如果不设置分配策略即空的分配策略是无效的

    • number_of_replicas:整数类型,分配给索引的副本数
    • total_shards_per_node:单个ES节点上索引最大分片数,-1代表没有限制
    • include:为至少具有一个自定义属性的节点分配索引
    • exclude:为没有指定自定义属性的节点分配索引
    • require:为具有所有指定自定义属性的节点分配索引

    elasticsearch.yml 中自定义属性

    # 节点增加属性,在elasticsearch.yml里面
    node.attr.{attribute}: {value}
    # 例如:增加一个node_type属性
    node.attr.node_type: hot
    # 索引分配过滤器设置
    index.routing.allocation.include.{attribute}
    index.routing.allocation.exclude.{attribute}
    index.routing.allocation.require.{attribute}
    
  • Migrate

    可应用阶段:WarmCold

    通过更新index.routing.allocation.include._tier_preference设置,将索引移动到当前阶段对应的数据层

    ILM自动的在WarmCold阶段开启该操作,如果我们不想自动开启可以通过设置enabledfalse来关闭

    • 如果在Cold阶段定义了一个可搜索的快照(Searchable snapshot)动作,那么将不会自动注入Migrate操作,因为MigrateSearchable snapshot使用相同的index.routing.allocation.include._tier_preference设置
    • Warm阶段,Migrate操作会设置index.routing.allocation.include._tier_preferencedata_warm,data_hot。意思就是这会将索引移动到Warm层的节点上,如果Warm层没有,那就返回到Hot层节点
    • Cold阶段,Migrate操作会设置index.routing.allocation.include._tier_preferencedata_cold,data_warm,data_hot。这会将索引移动到Cold层,如果Cold层没有返回到Warm层,如果还没有可用的节点,返回到Hot
    • Frozen阶段不允许迁移操作,Migrate操作会设置index.routing.allocation.include._tier_preferencedata_frozen,data_cold,data_warm,data_hot。冻结阶段直接使用此配置挂载可搜索的镜像,这会将索引移动到(frozen)冻结层,如果冻结层没有节点,它会返回Cold层,依次是Warm层,Hot
    • Hot阶段是不被允许迁移操作的,初始的索引分配是自动执行的,我们也可以通过索引模版配置

    该阶段可选的配置参数如下

    • enabled:可选布尔值,控制ILM是否在此阶段迁移索引,默认true
  • Wait for snapshot

    可应用阶段:Delete

    在删除索引之前等待指定的SLM策略执行,这样可以确保已删除索引的快照是可用的

    • policy:必须的字符串参数,删除操作应等待的SLM策略的名称
  • Delete

    可应用阶段:Delete

    永久的删除索引

    • delete_searchable_snapshot:删除在上一个阶段创建的可搜索快照,默认true

ILM可以很轻松的管理索引的各个阶段,常见的就是处理日志类型或者度量值等时间序列的数据

需要注意的是,ILM要生效的前提是集群中所有的节点都必须是使用相同的版本。虽说可以在混合版本汇中创建或者应用ILM,但是不能保证ILM按照预期的策略执行

下面我们就详细说一下索引生命周期的几个阶段

  • Hot:频繁的查询、更新
  • Warm:索引不在被更新、但是还有查询
  • Cold:索引不在被更新、但是还有少量查询,索引的内容仍然需要被检索、检索的速度快慢没关系
  • Frozen:索引不在被更新、但是还有少量查询,索引的内容仍然需要被检索、检索的速度非常慢也没关系
  • Delete:索引不在需要,可以安全的删除

在上面的这几个阶段中,每个阶段的执行操作是不同的以及从一个阶段转到另一个阶段的时间也是不固定的

操作HotWarmColdFrozenDelete
Set Priority
Unfollow
Rollover
Read-only
Shrink
Force merge
Searchable snapshot
Allocate
Migrate
Wait for snapshot
Delete

通过上面的学习我们知道了ILM相关的基本概念,下面我们进入实操环节,首先ILM策略的使用可以直接绑定索引,也可以在索引模版创建时绑定使用,下面跟我一起来操作起来吧

环境信息

Docker 部署,yml文件中具体映射文件地址自行修改,可以替换D:\zuiyuftp\docker\es8.1\为自己本地文件路径

需要注意的是,ES三个节点指定不同的自定义属性

// eshot节点
node.attr.node_type=hot
// eswarm节点
node.attr.node_type=warm
// escold节点
node.attr.node_type=cold

windows docker启动中如遇到vm最大限制错误可使用如下命令修改

1、打开终端
wsl -d desktop
sysctl -w vm.max_map_count=262144
exit
  • docker-compose.yml

    version: '3.8'
    services:
      cerebro:
        image: lmenezes/cerebro:0.8.3
        container_name: cerebro
        ports:
         - "9000:9000"
        command:
         - -Dhosts.0.host=http://eshot:9200
        networks:
         - elastic
      kibana:
        image: docker.elastic.co/kibana/kibana:8.1.3
        container_name: kibana
        environment:
          - I18N_LOCALE=zh-CN
          - XPACK_GRAPH_ENABLED=true
          - TIMELION_ENABLED=true
          - XPACK_MONITORING_COLLECTION_ENABLED="true"
          - ELASTICSEARCH_HOSTS=http://eshot:9200
        ports:
          - "5601:5601"
        networks:
          - elastic
      eshot:
        image: elasticsearch:8.1.3
        container_name: eshot
        environment:
          - node.name=eshot
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=eshot,eswarm,escold
          - cluster.initial_master_nodes=eshot,eswarm,escold
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          - xpack.security.enabled=false
          - node.attr.node_type=hot
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - D:\zuiyuftp\docker\es8.1\eshot\data:/usr/share/elasticsearch/data
          - D:\zuiyuftp\docker\es8.1\eshot\logs:/usr/share/elasticsearch/logs
        ports:
          - 9200:9200
        networks:
          - elastic
      eswarm:
        image: elasticsearch:8.1.3
        container_name: eswarm
        environment:
          - node.name=eswarm
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=eshot,eswarm,escold
          - cluster.initial_master_nodes=eshot,eswarm,escold
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          - xpack.security.enabled=false
          - node.attr.node_type=warm
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - D:\zuiyuftp\docker\es8.1\eswarm\data:/usr/share/elasticsearch/data
          - D:\zuiyuftp\docker\es8.1\eswarm\logs:/usr/share/elasticsearch/logs
        networks:
          - elastic
      escold:
        image: elasticsearch:8.1.3
        container_name: escold
        environment:
          - node.name=escold
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=eshot,eswarm,escold
          - cluster.initial_master_nodes=eshot,eswarm,escold
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          - xpack.security.enabled=false
          - node.attr.node_type=cold
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - D:\zuiyuftp\docker\es8.1\escold\data:/usr/share/elasticsearch/data
          - D:\zuiyuftp\docker\es8.1\escold\logs:/usr/share/elasticsearch/logs
        networks:
          - elastic
    
    networks:
      elastic:
        driver: bridge
    
    
  • 启动成功之后浏览器进入 http://host:5601 管理页面,输入GET _cat/nodeattrs查看ES集群启动信息,返回如下所示

ILM验证

如果索引具有未分配的碎片,并且集群运行状况为黄色,则该索引仍然可以根据其索引生命周期管理策略过渡到下一阶段。然而,由于Elasticsearch只能在绿色集群上执行某些清理任务,因此可能会产生意想不到的副作用。

创建索引生命周期策略

  • 打开Kibana,找到Stack Management页面打开

  • 打开索引生命周期策略,点击创建策略

  • 输入策略名称

  • 配置热阶段属性

    关闭【使用建议的默认值】,配置文档数量最大为10个的时候发生滚动索引,其他暂不配置,如有需要可自行测试

  • 配置热阶段索引优先级100

  • 点击温阶段开关,开启温阶段

  • 配置为5分钟后移动到此阶段(实际使用根据自身场景设置,此处仅为测试)

  • 点击高级设置配置温阶段高级属性

  • 配置缩小分片数量为1

  • 选中数据分配,配置为定制属性

  • 选择节点属性为warm节点

  • 配置温阶段索引优先级50

  • 开启冷阶段

  • 配置5分钟后移动到该阶段(实际使用根据自身场景设置,此处仅为测试)

  • 与上一步warm节点类似,冷阶段数据分配选择cold节点

  • 配置冷阶段索引优先级0

  • 开启删除阶段

  • 设置一天之后索引删除

  • 保存策略

到此、一个完整的索引生命周期策略就创建完成了,以上我们只是做测试,具体数值使用中还是要根据实际场景设置,上面演示了一个完整的索引生命周期,下面是使用语句创建,也就是上面我们图形化创建的东西使用API创建

  • 使用API创建ILM

    PUT _ilm/policy/zuiyu_policy
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_docs": 10
              },
              "set_priority": {
                "priority": 100
              }
            },
            "min_age": "0ms"
          },
          "warm": {
            "min_age": "5m",
            "actions": {
              "shrink": {
                "number_of_shards": 1
              },
              "set_priority": {
                "priority": 50
              },
              "allocate": {
                "require": {
                  "node_type": "warm"
                }
              }
            }
          },
          "cold": {
            "min_age": "5m",
            "actions": {
              "set_priority": {
                "priority": 0
              },
              "allocate": {
                "require": {
                  "node_type": "cold"
                }
              }
            }
          },
          "delete": {
            "min_age": "1d",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
    

创建索引模版

指定分片数量为3,副本分片为0,生命周期策略为zuiyu_policyrollover操作时别名为zuiyu-index,索引分配策略为 "node_type":"hot",匹配索引模式为zuiyu-开头的索引名

PUT _index_template/zuiyu_template
{
  "index_patterns": ["zuiyu-*"],
  "template":{
     "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 0,
      "index.lifecycle.name": "zuiyu_policy",    
      "index.lifecycle.rollover_alias": "zuiyu-index" , 
      "index.routing.allocation.require.node_type":"hot"
    }
  }
}

创建测试索引

分片数量3,索引别名zuiyu-index

PUT zuiyu-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "aliases": {
    "zuiyu-index": {}
  }
}

查看分片分布可以看到,所有的分片都按照分配策略分不到了hot节点上,访问cerebro可看到如下(http://host:9000)

插入测试文档

连续执行多次,大于10次即可

POST zuiyu-index/_doc
{
  "id":"zuiyu index",
  "content":"ilm alias insert content"
}

查看文档数量

GET zuiyu-index/_count
// 返回结果如下
{
  "count" : 21,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  }
}

我在上面插入了21条数据,按照刚才我们定义的ILM,在文档数量大于10个的时候会发生rollover操作,滚动生成一个新的索引(具体索引名规则、不生效约束查看前文rollover小节)

验证ILM策略

  • 打开Kibana,找到定义的zuiyu_policy策略

  • 找到索引管理,点击生成的索引zuiyu-000001

  • 弹出的页面中我们可以清晰的看到当前索引的相关信息,此时处于hot阶段

ILM策略刷新的时间默认是10分钟(并不是固定10分钟,哪怕我们设置为10分钟也可能20分钟才能执行,甚至可能赶巧的话马上就执行也说不准),我们可以通过如下API进行修改为10s测试,也可以等待ILM自动执行

官网的说明如下

https://www.elastic.co/guide/en/elasticsearch/reference/8.1/ilm-index-lifecycle.html

PUT _cluster/settings
{
    "transient": {
      "indices.lifecycle.poll_interval": "10s"
    }
}
  • 等待10多分钟之后,索引zuiyu-000002生成,此时索引zuiyu-000001zuiyu-000002都在hot节点

  • 继续等待约10分钟,此时发现zuiyu-000001节点已经移动到了warm节点上

  • 我们呢此时也可以通过Kibana查看ILM执行情况,也可以看到执行该操作的时间,如下

  • 继续等待约10分钟,索引zuiyu-000001已经减少分片数量为1,并且移动到节点cold上了

按照上面ILM策略执行的话,我们当时定义的是一天之后删除,也就是24小时之后,移动到cold节点上的索引就会被删除,这个大家可以自行验证一下,这边就不演示了,不过我本地是测试成功过的

我们还可以通过创建索引时直接绑定索引生命周期策略,API如下,测试就不测试了,感兴趣的自己下面测试下吧

注意测试时别与上面的索引模版冲突覆盖了哦

PUT zy-index-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0,
    "index.lifecycle.name": "zuiyu_policy",
     "index.lifecycle.rollover_alias": "zy-index" , 
    "index.routing.allocation.require.node_type":"hot"
  },
  "aliases": {
    "zy-index": {}
  }
}

上面我们测试了通过索引模版创建索引,并且应用索引生命周期策略,下面来测试一下数据流索引,与索引模版的类似,首先还是创建一个数据流模版

创建数据流模版

该模版会匹配zyds-开头的,匹配为数据流索引,创建的分片数量为3,应用刚才我们创建的ILM策略,路由分片到hot节点

PUT _index_template/zyds_template
{
  "index_patterns": ["zyds-*"],
  "data_stream": {},
  "priority": 200,
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas":0,
      "index.lifecycle.name": "zuiyu_policy",
      "index.routing.allocation.require.node_type": "hot"
    }
  }
}

创建数据流索引

PUT _data_stream/zyds-stream

查看生成的数据流索引

此时我们在cerebro页面输入zyds进行过滤,并且勾选special,可以看到生成的数据流也是在hot节点上

验证数据流ILM策略

  • 定义一个pipeline,方便插入数据到数据流使用,作用是生成字段@timestamp

    PUT _ingest/pipeline/add-timestamp
    {
      "processors": [
        {
          "set": {
            "field": "@timestamp",
            "value": "{{_ingest.timestamp}}"
          }
        }
      ]
    }
    
  • 添加测试数据

    点击多次,大于10即可,此处我点了19次,生成了19个文档,也是可以触发ILM策略的

    POST zyds-stream/_doc?pipeline=add-timestamp
    {
      "user": {
        "id": "zuiyu",
        "name":"鱼"
      },
      "message": "zuiyu is successful!"
    }
    

  • 等待约10分钟,文档数量大于10,发生滚动策略,生成新索引

  • 等待约10分钟,第一个索引已经从hot节点数据移动到warm节点

  • 继续等待约10分钟,分片减少为1

    后面就不演示了,相信大家也看到了,本篇文章耗时巨长了,感觉写的还不错的可以点赞分享哦

总结

通过上面的学习我们学会了ILM期间的各种操作,并且实操了索引模版,数据流模版使用索引生命周期策略的例子,相信大家看完本篇文章也有一定的收获,毕竟我可以非常自信的说的是,看完本篇文章,你可能不会很精通ILM,但是ILM入门你绝对可以

参考链接

ILM:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-lifecycle-management.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

索引生命周期管理ILM看完不懂你锤我 的相关文章

  • 03137计算机网络原 - 物理层

    物理层 基础概念 OSI模型最底层 功能 为在链路实体间传送比特流而对物理连接的 接通 维持 和 拆除 提供机械 电气 功能和规程方面的方法 作用 尽可能屏蔽现有多种多样的硬件设备 传输媒体和通信手段的差异 确保原始数据可以在各种物理媒介上
  • 03137计算机网络原理 - 数据链路层

    数据链路层 功能 定义 基本功能是 向该层用户 提供透明和可靠的数据传送基本服务 帧和介质访问控制 数据链路层 是 对物理层传输原始比特流功能的加强 将物理层提供的可能出错的粗粒连接改造成逻辑上无差错的数据链路 使之对网络层表现为无差错的线
  • 彻底卸载Android Studio

    在安装Android Studio会有很多问题导致无法正常运行 xff0c 多次下载AS多次错误后了解到 xff0c 删除以下四个文件才能彻底卸载Android Studio 第一个文件 xff1a gradle 路径 xff1a C Us
  • Linux远程登录

    L i n u x 远程登录
  • 03_SpringBoot项目配置

    文章目录 SpringBoot项目配置0x01 properties格式配置文件0x02 yml格式配置文件配置对象类型数据配置集合类型配置数组类型 0x03 properties和yml的区别优先级区别 0x04 配置文件在项目中的位置0
  • VS中空项目、win32项目、控制台程序的区别

    一 区别 xff08 1 xff09 Win32控制台程序 xff0c 没有界面 xff0c 只有命令符 生成的 exe 文件直接运行操作即可 xff08 2 xff09 Win32项目 xff0c 有界面 但是界面里面的控件 xff0c
  • kubectl命令应用

    kubectl命令语法 kubectl span class token punctuation span command span class token punctuation span span class token punctua
  • java生成10个随机数(1-100)到数组中,并倒序打印以及求平均值,最大值和最大值下标,并查找其中是否有8.

    代码如下 Scanner in 61 new Scanner System in Random r 61 new Random int arr 61 new int 10 int sum 61 0 int max 61 0 int a 61
  • [ 常用工具篇 ] Esxi 安装详解

    博主介绍 nbsp 博主介绍 大家好 我是 nbsp PowerShell nbsp 很高兴认识大家 主攻领域 渗透领域 数据通信 通讯安全 web安全 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步
  • day13_spring环境配置及bean使用

    1 spring简介 xff1a 整合现有的技术框架 是一个轻量级的控制反转 xff08 IOC xff09 和面向切面编程的框架 xff08 AOP xff09 xff0c 支持事务的处理和对框架整合的支持 DI 控制反转 就是IOC x
  • 二叉树--求树的高度

    实现思想 1 求树高时我们可以利用递归思想来求 而递归主要的思想就是要将大问题化为小问题 2 我们求树高时 xff0c 可以分别求左右子树的高度然后比较左右子树的高度 xff0c 返回较大的值 代码实现 xff1a span class t
  • 实现BottomNavigationView和Navigation联动

    实现BottomNavigationView和Navigation联动 界面展示引入依赖创建Fragment创建navigation为BottomNavigationView创建menu主界面布局实现BottomNavigationView
  • Centos8安装JDK

    官网下载页 xff1a https www oracle com java technologies downloads 选择自己需要的JDK版本进行下载即可 一 下载上传 https docs oracle com javase 8 do
  • linux操作系统关机命令

    关机命令 在linux中关机命令 有以下几个 shutdow shutdown命令安全地将系统关机 有些用户会使用直接断掉电源的方式来关闭linux xff0c 这是十分危险的 因为linux与windows不同 xff0c 其后台运行着许
  • .eslintrc.js文件内容/配置eslint/eslint参数

    首先放一个官网的链接 List of available rules ESLint中文文档 然后直接上代码 这里以vue项目为例 xff0c 主要两个文件 xff0c 1是 eslintrc js文件 xff08 配置 xff09 xff0
  • 【python】使用pyinstaller将程序打包为exe文件

    前言 xff1a 如何将python的 py文件打包为exe文件 xff0c 以打包单独文件的简单程序 和打包基于pygame库编写的多模块程序 为例 xff0c 以及如何处理素材文件使打包后的文件可以正常运行 xff0c 还有一些总结 x
  • 关于AndroidStudio添加一个新的Activity但没有配置或者模拟器无法打开app的问题

    今天原本打算测试一下是否可以用图片imageView当做一个点击事件使用 xff0c 于是我建立了一个新的Activity xff0c 结果折腾了大半天启动的时候发现模拟器怎么都无法打开那个app xff0c 检查了一下注册表已经存在这个a
  • k8s资源清单创建pod、deployment、service

    资源清单配置 pod yaml span class token comment 暴露端口可以进行访问 span span class token punctuation span root 64 master span class tok
  • windows和ubuntu双系统怎么设置默认启动windows选项

    首先获得管理员权限才能修改 sudo su 打开相应目录 cd etc default 打开编辑界面 sudo gedit grub 把下面一段代码中的 GRUB DEFAULT 61 0 中的 0 改为你的windows系统在引导界面所在
  • 解决ubuntu18.04&windows10双系统时间不同步问题(在ubuntu环境下使用)

    sudo apt get install ntpdate sudo ntpdate time windows com sudo hwclock localtime systohc

随机推荐

  • ROS Melodic 安装(ubuntu18.04)

    因为后面需要用到python所以我先安装一下 xff0c 不安装应该也行 sudo apt get install python 设置sources list sudo sh c 39 echo 34 deb http packages r
  • ubuntu双系统怎么完全删除ubuntu系统(主要是删除引导)

    必备基础 xff1a 会制作和简单的使用PE系统 xff0c 以下操作均需要在PE中完成 步骤 1 首先你要用U盘制作一个可以使用的PE系统 xff08 推荐使用微PE xff09 2 进入PE系统中把ubuntu对应的分区全部删除 xff
  • arch安装wps

    输入以下命令即可 yay S wps office mui zh cn wps office mime cn wps office cn wps office fonts ttf ms fonts ttf wps fonts
  • oh-my-posh 配置powershell

    写这篇文章记录的原因就是因为很多关于oh my posh的之前的配置教程已经不适用 xff0c 特此记录下来 打开powershell输入 winget span class token function install span JanD
  • 后端开发工具有哪些

    标题 后端开发工具有哪些 1 阿尔萨斯Java在线诊断工具 Arthas是一款用于Java应用程序的在线诊断工具 xff0c 由阿里巴巴于2018年9月开源 2 Cloud Toolkit IDE插件 Cloud Toolkit是一个集成开
  • 启动Zookeper时出现闪退现象

    这里写自定义目录标题 最近在回顾项目的时候遇到zookeeper闪退问题第一步 xff1a 查找问题原因第二步 xff1a 解决问题 最近在回顾项目的时候遇到zookeeper闪退问题 最近打算复习一下之前写的项目 xff0c 却在启动zo
  • 详解基数排序

    1 基数排序 基数排序是一种特殊的排序方式 xff0c 不是基于比较进行排序 xff0c 而是基于关键字的各个位置大小进行 34 分配 34 和 34 收集 34 两种操作对关键字序列进行排序的一种排序方式 基数排序可以分为 xff1a 最
  • Maven基础教程

    文章目录 一 jar包 xff08 一 xff09 打开一个jar包 xff08 二 xff09 打包一个jar包 二 Maven xff08 一 xff09 概述 xff08 二 xff09 仓库与坐标 本地仓库 第三方仓库 xff08
  • 重启策略 ,健康检查,环境变量,初始化容器

    重启策略 简介 Always 当容器终止退出后 xff0c 总是重启容器 xff0c 默认策略 OnFailure 当容器异常退出 退出状态码非0 时 xff0c 才重启容器 Never 当容器终止退出 xff0c 从不重启容器 span
  • 用两种方法求阶乘的累加和(1050: 阶乘的累加和)

    题目描述 求1 43 2 43 n 输入 输入一个整数n xff0c 你可以假定n不大于10 输出 输出一个整数 xff0c 即阶乘累加的结果 xff0c 单独占一行 样例输入 4 样例输出 33 方法一 xff1a 用for的循环两次 s
  • 小白一起学Android studio 创建项目

    本人也是在学习Android Studio xff0c 就想把自己熟悉的记录一下 我用的是Android Studio是 2021 1 1 Patch 2版本 xff1b 1 点击New Project 2 选择Empty Activity
  • numpy实现cnn

    经过多天的奋战 xff0c 终于写出了一个完成的cnn框架 xff0c 里面最主要的还是卷积反向传播这一块 网络架构 用到的包 数据集 xff1a minist 这里是随机抽取了1000份做训练集 100份做测试集 整体流程 39 39 3
  • Notepad++ 中 tab 转 空格

    目录 一 引言 二 tab转空格 一 引言 为了便于观看 xff0c 以及防止程序出bug xff0c 一般不用tab键 xff0c 而是用4个空格代替 因为tab键在不同的软件里代表不同的空格 xff0c 有的代表4个空格 xff0c 有
  • 如何将windows桌面变成类似mac样式

    文章目录 背景效果实现步骤便捷的终端终端的选择快速跳转文件夹power shell颜色更改安装vim 更改桌面下载MyDockFinder进行配置 背景 最近实习快结束了 xff0c 用惯了公司的mac电脑 xff0c 然后用自己的电脑就不
  • 对接诺诺电子发票(Java)

    沙箱环境 xff1a url https sandbox nuonuocs cn open v1 services appKey SD63236305 appSecret SDDED2523BED4643 下载诺诺的SDK xff1a SD
  • Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.6:generate (default-

    Failed to execute goal org mybatis generator mybatis generator maven plugin 1 3 6 generate default cli on project Spring
  • Maven中JDBC驱动问题

    Failed to execute goal org mybatis generator mybatis generator maven plugin 1 3 6 generate default cli on project Spring
  • Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop

    运行springboot时出现了这个错误 xff0c 看出8080端口号被占用 xff0c 所以我就这样 xff1a 在配置文件中修改端口号 看运行结果 xff1a 就好了
  • org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is ‘com/hujin

    注意 xff1a springboot项目中的包名必须放到运行类的同级目录或者下级目录 运行类就是 xff1a 问题解决 xff1a 把运行类用一个包装起来 xff0c 与项目的其他包是同级包 谢谢 xff0c 希望对你有帮助
  • 索引生命周期管理ILM看完不懂你锤我

    阅读完本文你可以学到什么是索引生命周期管理 xff0c 各个阶段可以做的操作以及如何使用索引模版使用索引生命周期策略 xff0c 下面就跟我一起来吧 基础理论篇 索引生命周期管理 xff08 ILM xff09 是一种可以让我们随着时间推移