Storage Tiering

November 12-15, 2018

Supercomputing 2018

Dallas, TX

Justin James

Applications Engineer, iRODS Consortium

Storage Tiering

iRODS Capabilities

  • Packaged and supported solutions
  • Require configuration not code
  • Derived from the majority of use cases observed in the user community

Storage Tiering Overview

Getting a Docker Image with iRODS

docker pull justinkylejames/irods-storage-tiering-demo:latest

Get the docker image with iRODS 4.2.

Run the instance

docker run -ti justinkylejames/irods-storage-tiering-demo:latest /bin/bash

Connect a terminal to the instance

$ docker ps --format "{{.Image}} {{.Names}}"
justinkylejames/irods-storage-tiering-demo:latest cranky_villani

 

$ docker exec -ti cranky_villani /bin/bash

Installing Tiered Storage Plugin

wget -qO - https://packages.irods.org/irods-signing-key.asc | sudo apt-key add -
echo "deb [arch=amd64] https://packages.irods.org/apt/ $(lsb_release -sc) main" | \
  sudo tee /etc/apt/sources.list.d/renci-irods.list
sudo apt-get update

Install the package repository

sudo apt-get install irods-rule-engine-plugin-storage-tiering

Install the storage tiering package

Configuring Tiered Storage Plugin

Plugin is configured in  /etc/irods/server_config.json

"rule_engines": [
    {
         "instance_name": "irods_rule_engine_plugin-storage_tiering-instance",
         "plugin_name": "irods_rule_engine_plugin-storage_tiering",
         "plugin_specific_configuration": {
         }
    },
    {    
        "instance_name": "irods_rule_engine_plugin-irods_rule_language-instance",
        "plugin_name": "irods_rule_engine_plugin-irods_rule_language",
        "plugin_specific_configuration": {  
            <snip>
        },
        "shared_memory_instance": "irods_rule_language_rule_engine"
    },
]

Tiering Example

Three Tier Groups with Common Archive

We will demonstrate data flow from instrument to archive

Storage Tiering Demo

We will illustrate storage tiering with three storage groups (A, B, and C) each with three storage tiers (0, 1, and 2).

In this example, a common resource is used for the archive tier (2).

 

Creating the resources:

iadmin mkresc tier2 unixfilesystem `hostname`:/tmp/irods/tier2
iadmin mkresc tier0_A unixfilesystem `hostname`:/tmp/irods/tier0_A
iadmin mkresc tier1_A unixfilesystem `hostname`:/tmp/irods/tier1_A
iadmin mkresc tier0_B unixfilesystem `hostname`:/tmp/irods/tier0_B
iadmin mkresc tier1_B unixfilesystem `hostname`:/tmp/irods/tier1_B
iadmin mkresc tier0_C unixfilesystem `hostname`:/tmp/irods/tier0_C
iadmin mkresc tier1_C unixfilesystem `hostname`:/tmp/irods/tier1_C

Configuring the Tiering Policy

The tiering policy can be configured  simply by adding metadata to our resources.  

 

  • irods::storage_tiering::group - Used to assign a resource to a tier group
     
  • irods::storage_tiering::time - Used to set the time violation policy for objects within the resource
 

 

Assigning resources to a storage tiering group

imeta set -R tier0_A irods::storage_tiering::group tier_group_A 0

imeta set -R tier1_A irods::storage_tiering::group tier_group_A 1

imeta add -R tier2 irods::storage_tiering::group tier_group_A 2

Tier Group A

Tier Group B

imeta set -R tier0_B irods::storage_tiering::group tier_group_B 0

imeta set -R tier1_B irods::storage_tiering::group tier_group_B 1

imeta add -R tier2 irods::storage_tiering::group tier_group_B 2

Tier Group C

imeta set -R tier0_C irods::storage_tiering::group tier_group_C 0

imeta set -R tier1_C irods::storage_tiering::group tier_group_C 1

imeta add -R tier2 irods::storage_tiering::group tier_group_C 2

Notice that the archive tier (tier 2) belongs to all three tier groups.

Set Tier Time Constraints

imeta set -R tier0_A irods::storage_tiering::time 30
imeta set -R tier1_A irods::storage_tiering::time 60

Tier Group A

Tier Group B

imeta set -R tier0_B irods::storage_tiering::time 45
imeta set -R tier1_B irods::storage_tiering::time 120

The archive tier has no time constraints.

Tier Group C

imeta set -R tier0_C irods::storage_tiering::time 100
imeta set -R tier1_C irods::storage_tiering::time 180

Running a Storage Tiering Rule

{
   "rule-engine-instance-name": "irods_rule_engine_plugin-storage_tiering-instance",
   "rule-engine-operation": "apply_storage_tiering_policy",
   "delay-parameters": "<PLUSET>1s</PLUSET><EF>REPEAT FOR EVER</EF>",
   "storage-tier-groups": [
       "tier_group_A",
       "tier_group_B",
       "tier_group_C"
   ]
}
INPUT null
OUTPUT ruleExecOut

Now we will create a rule file (/var/lib/irods/foo.r) which describes our storage tiering policy for tier groups A, B, C.

Executing this rule with the irule command will put the storage tiering policy on the delay execution queue.

irods@hostname:~$ irule -r irods_rule_engine_plugin-storage_tiering-instance -F /var/lib/irods/foo.r

irods@hostname:~$ iqstat
id     name
10096 {"rule-engine-operation":"apply_storage_tiering_policy","storage-tier-groups":["tier_group_A","tier_group_B","tier_group_C"]} 

 

Reminder of What We Have Configured

Stage data into all three groups and watch

irods@hostname:~$ iput -R tier0_A 10Mfile 10MfileA && iput -R tier0_B 10Mfile 10MfileB && iput -R tier0_C 10Mfile 10MfileC
irods@hostname:~$ ils -l
/tempZone/home/rods:
  rods              0 tier0_A     10485760 2018-11-07.14:15 & 10MfileA
  rods              0 tier0_B     10485760 2018-11-07.14:15 & 10MfileB
  rods              0 tier0_C     10485760 2018-11-07.14:16 & 10MfileC

All newly ingested files reside in tier 0.

Create a test file

truncate -s 10M 10Mfile

Put the test file at tier 0 in tier groups A, B, and C.

Wait for it...

irods@hostname:~$ ils -l
/tempZone/home/rods:
  rods              2 tier2       10485760 2018-11-07.15:26 & 10MfileA
  rods              1 tier1_B     10485760 2018-11-07.15:26 & 10MfileB
  rods              0 tier0_C     10485760 2018-11-07.15:25 & 10MfileC

After one minute...

irods@hostname:~$ ils -l
/tempZone/home/rods:
  rods              2 tier2     10485760 2018-11-07.15:26 & 10MfileA
  rods              2 tier2     10485760 2018-11-07.15:27 & 10MfileB
  rods              2 tier2     10485760 2018-11-07.15:28 & 10MfileC​​

All newly ingested files now reside in tier 2.

After three minutes...

Restage to Lowest Tier

imeta add -R tier1_A irods::storage_tiering::minimum_restage_tier true
irods@hostname:~$ iget 10MfileA
irods@hostname:~$ ils -l
/tempZone/home/rods:
  rods              6 tier0_A     10485760 2018-11-07.15:40 & 10MfileA
  rods              2 tier2       10485760 2018-11-07.15:27 & 10MfileB
  rods              2 tier2       10485760 2018-11-07.15:28 & 10MfileC

Now retrieve 10MfileA again

Now let's say we want tier1 to be the minimum tier from group A

Now retrieve 10MfileA

irods@hostname:~$ iget -f 10MfileA
irods@hostname:~$ ils -l
/tempZone/home/rods:
  rods             12 tier1_A     10485760 2018-11-07.15:54 & 10MfileA
  rods              5 tier2       10485760 2018-11-07.15:46 & 10MfileB
  rods              2 tier2       10485760 2018-11-07.15:28 & 10MfileC

Summary

  • We set up three storage tiering groups with three tiers for each group.
     
  • We assigned resources to the groups and used a single archive resource as the final tier for each group.
     
  • We demonstrated the flow of files through the various tiers.
     
  • All of this was done by setting metadata on the storage resources.

Configuring Storage Tiering

Let's now discuss all the various ways that the storage tiering framework can be configured and customized...

Data Object Access Time

The default policy for tiering is based on the last time of access for a given data object which is applied as metadata

pep_api_data_obj_close_post
pep_api_data_obj_put_post
pep_api_data_obj_get_post
pep_api_phy_path_reg_post
irods::access_time <unix timestamp>

Dynamic Policy Enforcement Points for RPC API are used to apply the metadata

Configuring a Tier Group

imeta set -R <resc0> irods::storage_tiering::group example_group 0
imeta set -R <resc1> irods::storage_tiering::group example_group 1
imeta set -R <resc2> irods::storage_tiering::group example_group 2

Tier groups are entirely driven by metadata

  • The attribute identifies the resource as a tiering group participant
  • The value defines the group name
  • The unit defines the position within the group
  • Tier position, or index, can be any value - order will be honored
  • Configuration must be performed at the root of a resource composition
  • A resource may belong to many tiering groups

Configuring Tiering Time Constraints

Tiering violation time is configured in seconds

imeta set -R <resc> irods::storage_tiering::time 2592000

The final tier in a group does not have a storage tiering time

  - it will hold data indefinitely

imeta set -R <resc> irods::storage_tiering::time 30

Configure a tier to hold data for 30 seconds

Configure a tier to hold data for 30 days

Verification of Data Migration

When data is found to be in violation:

  • Data object is replicated to the next tier
  • New replica integrity is verified (in one of three ways)
  • Source replica is trimmed

 

'catalog' is the default verification for all resources

imeta set -R <resc> irods::storage_tiering::verification catalog

Other verification settings:

  • filesystem - performs a stat of the file, more expensive
  • checksum - verifies by computing the checksum on the file at rest, most expensive

Configuring the restage resource

imeta add -R <resc> irods::storage_tiering::minimum_restage_tier true

When data is in a tier other than the lowest tier, upon access the data is restaged back to the lowest tier.

 

This flag identifies the tier for restage:

Users may not want data restaged back to the lowest tier, should that tier be very remote or not appropriate for analysis.

 

Consider a storage resource at the edge serving as a landing zone for instrument data.

Preserving Replicas

Some users may not wish to trim a replica from a tier when data is migrated, such as to allow data to be archived and also still available on fast storage.

 

 

To preserve a replica on any given tier, attach the following metadata flag to the root resource.

imeta set -R <resc> irods::storage_tiering::preserve_replicas true

Custom Violation Query

Admins may specify a custom query which identifies violating data objects

imeta set -R <resc> irods::storage_tiering::query "SELECT DATA_NAME, COLL_NAME, DATA_RESC_ID WHERE META_DATA_ATTR_NAME = 'irods::access_time' AND META_DATA_ATTR_VALUE < 'TIME_CHECK_STRING' AND DATA_RESC_ID IN ('10021', '10022')"

In this case 'TIME_CHECK_STRING' is a macro which is replaced by: now - irods::storage_tiering::time.

Any number of queries may be attached to a resource in order provide a range of criteria by which violating data may be identified

  • could include user applied metadata
  • could include externally harvested metadata

Storage Tiering Metadata Vocabulary

"plugin_specific_configuration": {
    "access_time_attribute" : "irods::access_time",
    "storage_tiering_group_attribute" : "irods::storage_tiering::group",
    "storage_tiering_time_attribute" : "irods::storage_tiering::time",
    "storage_tiering_query_attribute" : "irods::storage_tiering::query",
    "storage_tiering_verification_attribute" : "irods::storage_tiering::verification",
    "storage_tiering_restage_delay_attribute" : "irods::storage_tiering::restage_delay",
    "default_restage_delay_parameters" : "<PLUSET>1s</PLUSET><EF>1h DOUBLE UNTIL SUCCESS OR 6 TIMES</EF>",
    "time_check_string" : "TIME_CHECK_STRING"
}

All default metadata attributes are configurable

Should there be a preexisting vocabulary in your organization,

it can be leveraged by redefining the metadata attributes used by the storage tiering framework.

Custom violation queries

Let's say that instead of a time based violation policy, we only want to trigger violation of an object if it has the metadata of the form archive_object=true.  The following custom query could be assigned as the tiering query for the resource.

iadmin asq "select distinct R_DATA_MAIN.data_name, R_COLL_MAIN.coll_name, R_DATA_MAIN.resc_id from R_DATA_MAIN, R_COLL_MAIN, R_OBJT_METAMAP r_data_metamap, R_META_MAIN r_data_meta_main where R_DATA_MAIN.resc_id IN (10021, 10022) AND r_data_meta_main.meta_attr_name = 'archive_object' AND r_data_meta_main.meta_attr_value = 'true' AND R_COLL_MAIN.coll_id = R_DATA_MAIN.coll_id AND R_DATA_MAIN.data_id = r_data_metamap.object_id AND r_data_metamap.meta_id = r_data_meta_main.meta_id order by R_COLL_MAIN.coll_name, R_DATA_MAIN.data_name" archive_query
imeta set -R tier1_A irods::storage_tiering::query archive_query specific

Attach the query to the resource.

Questions?

SC18 - Storage Tiering

By iRODS Consortium

SC18 - Storage Tiering

  • 1,888