| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747 | [role="xpack"][testenv="basic"][[ilm-policy-definition]]== Policy phases and actionsThere are four stages in the index lifecycle, in the orderthey are executed.[options="header"]|======| Name     | Description| `hot`    | The index is actively being written to| `warm`   | The index is generally not being written to, but is still queried| `cold`   | The index is no longer being updated and is seldom queried. Theinformation still needs to be searchable, but it's okay if those queries areslower.| `delete` | The index is no longer needed and can safely be deleted|======Each of these stages is called a "phase". A policy does not need to configureeach phase for an index. For example, one policy may define only the hotphase and the delete phase, while another may define all four phases.=== TimingIndices enter phases based on a phase's `min_age` parameter.The index will not enter the phase until the index's age is older than thatof the `min_age`. The parameter is configured using a timeduration format (see <<time-units, Time Units>>).`min_age` defaults to zero seconds `0s` for each phase if not specified.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "min_age": "1d",        "actions": {          "allocate": {            "number_of_replicas": 1          }        }      },      "delete": {        "min_age": "30d",        "actions": {          "delete": {}        }      }    }  }}--------------------------------------------------// CONSOLEThe Above example configures a policy that moves the index into the warmphase after one day. Until then, the index is in a waiting state. Aftermoving into the warm phase, it will wait until 30 days have elapsed beforemoving to the delete phase and deleting the index.`min_age` is usually the time elapsed from the time the index is created. If theindex is rolled over, then `min_age` is the time elapsed from the time the indexis rolled over. The intention here is to execute following phases and actionsrelative to when data was written last to a rolled over index.The previous phase's actions must complete before {ilm} will check `min_age`and transition into the next phase.=== Phase ExecutionThe current phase definition, of an index's policy being executed, is storedin the index's metadata. The phase and its actions are compiled into a seriesof discrete steps that are executed sequentially. Since some {ilm-init} actionsare more complex and involve multiple operations against an index, each of theseoperations are done in isolation in a unit called a "step". The<<ilm-explain-lifecycle,Explain Lifecycle API>> exposes this information to usto see which step our index is either to execute next, or is currentlyexecuting.=== ActionsThe below list shows the actions which are available in each phase.* Hot  - <<ilm-set-priority-action,Set Priority>>  - <<ilm-rollover-action,Rollover>>  - <<ilm-unfollow-action,Unfollow>>* Warm  - <<ilm-set-priority-action,Set Priority>>  - <<ilm-allocate-action,Allocate>>  - <<ilm-readonly-action,Read-Only>>  - <<ilm-forcemerge-action,Force Merge>>  - <<ilm-shrink-action,Shrink>>  - <<ilm-unfollow-action,Unfollow>>* Cold  - <<ilm-set-priority-action,Set Priority>>  - <<ilm-allocate-action,Allocate>>  - <<ilm-freeze-action,Freeze>>  - <<ilm-unfollow-action,Unfollow>>* Delete  - <<ilm-delete-action,Delete>>[[ilm-allocate-action]]==== AllocatePhases allowed: warm, cold.The Allocate action allows you to specify which nodes are allowed to host theshards of the index and set the number of replicas.Behind the scenes, it is modifying the index settingsfor shard filtering and/or replica counts. When updating the number of replicas,configuring allocation rules is optional. When configuring allocation rules,setting number of replicas is optional. Although this action can be treated astwo separate index settings updates, both can be configured at once.Read more about index replicas <<getting-started-shards-and-replicas,here>>.Read more about shard allocation filtering inthe <<shard-allocation-filtering,Shard allocation filtering documentation>>.[[ilm-allocate-options]].Allocate Options[options="header"]|======| Name                 | Required  | Default     | Description| `number_of_replicas` | no        | -           | The number of replicas to                                                   assign to the index| `include`            | no        | -           | assigns an index to nodes                                                   having at least _one_ of the attributes| `exclude`            | no        | -           | assigns an index to nodes having                                                   _none_ of the attributes| `require`            | no        | -           | assigns an index to nodes having                                                   _all_ of the attributes|======If `number_of_replicas` is not configured, then at least one of `include`,`exclude`, and `require` is required. An empty Allocate Action with no configurationis invalid.===== Example: Change number of replicasIn this example, the index's number of replicas is changed to `2`, while allocationrules are unchanged.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "actions": {          "allocate" : {            "number_of_replicas" : 2          }        }      }    }  }}--------------------------------------------------// CONSOLE===== Example: Assign index to node with specific "box_type" attributeThis example assigns the index to nodes with `box_type` attribute of "hot" or "warm".[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "actions": {          "allocate" : {            "include" : {              "box_type": "hot,warm"            }          }        }      }    }  }}--------------------------------------------------// CONSOLE===== Example: Assign index to a specific node and update replica settingsThis example updates the index to have one replica per shard and be allocatedto nodes with a `box_type` attribute of "cold".[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "actions": {          "allocate" : {            "number_of_replicas": 1,            "require" : {              "box_type": "cold"            }        }        }      }    }  }}--------------------------------------------------// CONSOLE[[ilm-delete-action]]==== DeletePhases allowed: delete.The Delete Action does just that, it deletes the index.This action does not have any options associated with it.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "delete": {        "actions": {          "delete" : { }        }      }    }  }}--------------------------------------------------// CONSOLE[[ilm-forcemerge-action]]==== Force MergePhases allowed: warm.NOTE: Index will be be made read-only when this action is run(see: <<dynamic-index-settings,index.blocks.write>>)The Force Merge Action <<indices-forcemerge,force merges>> the index into atmost a specific number of <<indices-segments,segments>>.[[ilm-forcemerge-options]].Force Merge Options[options="header"]|======| Name                 | Required  | Default             | Description| `max_num_segments`   | yes       | -                   | The number of                                                           segments to merge to.                                                           To fully merge the                                                           index, set it to `1`|======[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "actions": {          "forcemerge" : {            "max_num_segments": 1          }        }      }    }  }}--------------------------------------------------// CONSOLE[[ilm-freeze-action]]==== FreezePhases allowed: cold.This action will <<frozen-indices, freeze>> the indexby calling the <<freeze-index-api, Freeze Index API>>.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "cold": {        "actions": {          "freeze" : { }        }      }    }  }}--------------------------------------------------// CONSOLE[IMPORTANT]================================ Freezing an index will close the index and reopen it within the same API call. This causes primaries to not be allocated for a short amount of time and causes the cluster to go red until the primaries are allocated again. This limitation might be removed in the future.================================[[ilm-readonly-action]]==== Read-OnlyPhases allowed: warm.This action will set the index to be read-only(see: <<dynamic-index-settings,index.blocks.write>>)This action does not have any options associated with it.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "actions": {          "readonly" : { }        }      }    }  }}--------------------------------------------------// CONSOLE[[ilm-rollover-action]]==== RolloverPhases allowed: hot.[WARNING]index format must match pattern '^.*-\\d+$', for example (`logs-000001`).[WARNING]The managed index must set `index.lifecycle.rollover_alias` as thealias to rollover. The index must also be the write index for the alias.[IMPORTANT]If a policy using the Rollover action is used on a <<ccr-put-follow,followerindex>>, policy execution will wait until the leader index rolls over (or has<<skipping-rollover, otherwise been marked as complete>>), then convert thefollower index into a regular index as if <<ilm-unfollow-action,the Unfollowaction>> had been used instead of rolling over.For example, if an index to be managed has an alias `my_data`. The managedindex "my_index" must be the write index for the alias. For more information, read<<indices-rollover-is-write-index,Write Index Alias Behavior>>.[source,js]--------------------------------------------------PUT my_index{  "settings": {    "index.lifecycle.name": "my_policy",    "index.lifecycle.rollover_alias": "my_data"  },  "aliases": {    "my_data": {      "is_write_index": true    }  }}--------------------------------------------------// CONSOLEThe Rollover Action rolls an alias over to a new index when theexisting index meets one of the rollover conditions.[[ilm-rollover-options]].Rollover Options[options="header"]|======| Name       | Required  | Default             | Description| `max_size` | no        | -                   | max index storage size.                                                 See <<byte-units, Byte Units>>                                                 for formatting| `max_docs` | no        | -                   | max number of documents an                                                 index is to contain before                                                 rolling over.| `max_age`  | no        | -                   | max time elapsed from index                                                 creation. See                                                 <<time-units, Time Units>>                                                 for formatting|======At least one of `max_size`, `max_docs`, `max_age` or any combinations of thethree are required to be specified.===== Example: Rollover when index is too largeThis example rolls the index over when it is at least 100 gigabytes.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "hot": {        "actions": {          "rollover" : {            "max_size": "100GB"          }        }      }    }  }}--------------------------------------------------// CONSOLE===== Example: Rollover when index has too many documentsThis example rolls the index over when it contains at least100000000 documents.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "hot": {        "actions": {          "rollover" : {            "max_docs": 100000000          }        }      }    }  }}--------------------------------------------------// CONSOLE===== Example: Rollover when index is too oldThis example rolls the index over when it has been created at least7 days ago.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "hot": {        "actions": {          "rollover" : {            "max_age": "7d"          }        }      }    }  }}--------------------------------------------------// CONSOLE===== Example: Rollover when index is too old or too largeThis example rolls the index over when it has been created at least7 days ago or it is at least 100 gigabytes. In this case, the index will berolled over when any of the conditions is met.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "hot": {        "actions": {          "rollover" : {            "max_age": "7d",            "max_size": "100GB"          }        }      }    }  }}--------------------------------------------------// CONSOLE===== Example: Rollover condition stalls phase transitionThe Rollover action will only complete once one of its conditions ismet. This means that any proceeding phases will be blocked until Rolloversucceeds.[source,js]--------------------------------------------------PUT /_ilm/policy/rollover_policy{  "policy": {    "phases": {      "hot": {        "actions": {          "rollover": {            "max_size": "50G"          }        }      },      "delete": {        "min_age": "1d",        "actions": {          "delete": {}        }      }    }  }}--------------------------------------------------// CONSOLEThe above example illustrates a policy which attempts to delete anindex one day after the index has been rolled over. It does notdelete the index one day after it has been created.[[ilm-set-priority-action]]==== Set PriorityPhases allowed: hot, warm, cold.This action sets the <<recovery-prioritization, index priority>> on the index assoon as the policy enters the hot, warm, or cold phase. Indices with a higherpriority will be recovered before indices with lower priorities following a noderestart. Generally, indexes in the hot phase should have the highest value andindexes in the cold phase should have the lowest values. For example:100 for the hot phase, 50 for the warm phase, and 0 for the cold phase.Indicies that don't set this value have an implicit default priority of 1.[[ilm-set-priority-options]].Set Priority Options[options="header"]|======| Name         | Required  | Default     | Description| `priority`   | yes       | -           | The priority for the index. Must be 0 or greater.                                           The value may also be set to null to remove the priority.|======[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "actions": {          "set_priority" : {            "priority": 50          }        }      }    }  }}--------------------------------------------------// CONSOLE[[ilm-shrink-action]]==== ShrinkNOTE: Index will be be made read-only when this action is run(see: <<dynamic-index-settings,index.blocks.write>>)[IMPORTANT]If a policy using the Shrink action is used on a <<ccr-put-follow,followerindex>>, policy execution will wait until the leader index rolls over (or has<<skipping-rollover, otherwise been marked as complete>>), then convert thefollower index into a regular index as if <<ilm-unfollow-action,the Unfollowaction>> had been used before shrink is applied, as shrink cannot be safelyapplied to follower indices.This action shrinks an existing index into a new index with fewer primaryshards. It calls the <<indices-shrink-index,Shrink API>> to shrink the index.Since allocating all the primary shards of the index to one node is aprerequisite, this action will first allocate the primary shards to a validnode. After shrinking, it will swap aliases pointing to the original indexinto the new shrunken index. The new index will also have a new name:"shrink-<origin-index-name>". So if the original index was called "logs",then the new index will be named "shrink-logs".[[ilm-shrink-options]].Shrink Options[options="header"]|======| Name               | Required  | Default             | Description| `number_of_shards` | yes       | -                   | The number of shards                                                         to shrink to. must be                                                         a factor of the number                                                         of shards in the                                                         source index.|======[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "warm": {        "actions": {          "shrink" : {            "number_of_shards": 1          }        }      }    }  }}--------------------------------------------------// CONSOLE[[ilm-unfollow-action]]==== Unfollow[IMPORTANT]This action may be used explicitly, as shown below, but this action is also runbefore <<ilm-rollover-action,the Rollover action>> and <<ilm-shrink-action,theShrink action>> as described in the documentation for those actions.This action turns a {ref}/ccr-apis.html[ccr] follower indexinto a regular index. This can be desired when moving followerindices into the next phase. Also certain actions like shrinkand rollover can then be performed safely on follower indices.This action will wait until is it safe to convert a follower index into aregular index. In particular, the following conditions must be met:* The leader index must have `index.lifecycle.indexing_complete` set to `true`.This happens automatically if the leader index is rolled over using<<ilm-rollover-action,the Rollover action>>, or may be set manually usingthe <<indices-update-settings,Index Settings API>>.* All operations performed on the leader index must have been replicated to thefollower index. This ensures that no operations will be lost when the index isconverted into a regular index.If the unfollow action encounters a follower index thenthe following operations will be performed on it:* Pauses indexing following for the follower index.* Closes the follower index.* Unfollows the follower index.* Opens the follower index (which is at this point is a regular index).The unfollow action does not have any options andif it encounters a non follower index, then theunfollow action leaves that index untouched andlets the next action operate on this index.[source,js]--------------------------------------------------PUT _ilm/policy/my_policy{  "policy": {    "phases": {      "hot": {        "actions": {          "unfollow" : {}        }      }    }  }}--------------------------------------------------// CONSOLE=== Full PolicyWith all of these actions, we can support complex management strategies for ourindices. This policy will define an index that will start in the hot phase,rolling over every 50 GB or 7 days. After 30 days it enters the warm phaseand increases the replicas to 2, force merges and shrinks. After 60 daysit enters the cold phase and allocates to "cold" nodes, and after 90 days theindex is deleted.[source,js]--------------------------------------------------PUT _ilm/policy/full_policy{  "policy": {    "phases": {      "hot": {        "actions": {          "rollover": {            "max_age": "7d",            "max_size": "50G"          }        }      },      "warm": {        "min_age": "30d",        "actions": {          "forcemerge": {            "max_num_segments": 1          },          "shrink": {            "number_of_shards": 1          },          "allocate": {            "number_of_replicas": 2          }        }      },      "cold": {        "min_age": "60d",        "actions": {          "allocate": {            "require": {              "type": "cold"            }          }        }      },      "delete": {        "min_age": "90d",        "actions": {          "delete": {}        }      }    }  }}--------------------------------------------------// CONSOLE
 |