Skip to main content

Deep Dive into Multi Communal Storage Locations in OpenText Analytics Database (Vertica)

  • August 12, 2025
  • 0 replies
  • 5 views
SruthiA
Forum|alt.badge.img+1

Vertica's EON mode deployment offers seamless integration with leading communal storage platforms, including AWS S3, Google Cloud Storage (GCS), and Azure Blob Storage. It also supports on-premises S3-compatible solutions such as Pure Storage and MinIO.

Starting Vertica 25.1, users can now configure multiple communal storage locations within a single database. This powerful enhancement opens the door to a range of advanced use cases that improve scalability, flexibility, and data management across hybrid and multi-cloud environments.

Why Multiple Communal Storage Locations Matter

 1. Multi-Tenancy Isolation

In multi-tenant applications, it's often critical to isolate data by user or tenant group. With multiple communal storage locations, database administrators can assign distinct storage backends to different tenants thus enhancing data security, simplifying access control, and enabling more granular cost tracking.

 2. Dynamic Storage Expansion

As data volumes grow, existing prem storage buckets such as PureStorage Flash Blade may reach capacity. Administrators can now add new storage locations on demand. This allows seamless scaling without downtime or disruption.

 3. Data Archival and Tiering

Not all data needs to reside in high-performance storage. Cold or infrequently accessed data can be offloaded to slower, cost-effective storage such as on-prem archival systems. This helps reduce storage costs while keeping the data accessible when needed.

 4. Cluster Sandboxing and Isolation

Development and testing environments often require isolation from production data. With this feature, sandbox subclusters can be configured to use separate communal storage locations, allowing safe experimentation without impacting the production environment.

The ability to define multiple communal storage locations adds a new layer of flexibility to Vertica’s EON mode architecture. Whether you're managing multi-tenant workloads, scaling storage dynamically, this feature gives you the tools to do it efficiently and securely.

                                    

Storage Locations Overview

Storage locations in Vertica are file system paths on each cluster node where the database stores:

  • Data files
  • Temporary files
  • Catalog files (managed internally by Vertica)

                                   Diagram2

Vertica offers a variety of storage location types to support different architectural needs. As illustrated in the diagram, these include local, shared, user, depot, and communal storage locations. In this post, we’ll focus on communal storage locations, which play a key role in Vertica’s Eon Mode.

🔹 What Are Communal Storage Locations?

Communal storage locations are:

  • Exclusive to Eon Mode – Vertica’s cloud-native architecture designed for scalability and flexibility.
  • Shared across all nodes – They store data that is accessible by every node in the cluster, enabling efficient resource utilization.
  • Cloud-backed – Typically supported by cloud storage platforms such as Amazon S3 or Google Cloud Storage, allowing for elastic compute and persistent storage separation.

SQL Functions for Managing Vertica Storage Locations

Function Name

Description

Example Syntax

CREATE LOCATION

Create a new storage location

 

CREATE LOCATION 's3://bucket/s3' COMMUNAL USAGE 'DATA' LABEL 'cold-storage';

 

ALTER_LOCATION_LABEL

Changes the label of a storage location.

SELECT ALTER_LOCATION_LABEL('path','', 'label');

CLEAR_OBJECT_STORAGE_POLICY

Removes storage policy settings from an object.

SELECT CLEAR_OBJECT_STORAGE_POLICY('schema.table');

DROP_LOCATION

Removes a storage location from a node.

SELECT DROP_LOCATION('/path', ' ');

RETIRE_LOCATION

Marks a storage location as retired.

SELECT RETIRE_LOCATION('/path', ' ');

SET_OBJECT_STORAGE_POLICY

Assigns a storage policy to an object.

SELECT SET_OBJECT_STORAGE_POLICY('schema.table', 'label');

 

📊 System Tables for Monitoring Storage Policies in Vertica

System Table

Purpose

V_MONITOR.STORAGE_POLICIES

Displays current storage policies applied to database objects.

V_MONITOR.STORAGE_CONTAINERS

Shows which projections are stored in which storage locations.

V_MONITOR.STORAGE_LOCATIONS

Lists all storage locations and their usage types and labels.

V_MONITOR.PARTITIONS

Displays partitioned projections and their associated storage labels.

V_MONITOR.STORAGE_TIERS

Summarizes storage tiers by label, node count, and usage.

 

🔍 Deep Dive: A Practical Example

Let’s walk through a hands-on example to demonstrate how multiple communal storage locations work in practice.

In this scenario, we use Vertica 25.2 running on on-premises deployment with MinIO as the primary communal storage backend.

Step 1: Create the database with Primary Communal Storage Location (MinIO)

We begin by verifying the communal storage configuration:

multicommunal=> select location_id,location_path,location_usage,sharing_type from storage_locations where sharing_type = 'COMMUNAL';

-[ RECORD 1 ]--+------------------------------

location_id    | 45035996273705034

location_path  | s3://sanumula/multicommunal

location_usage | DATA

sharing_type   | COMMUNAL

 

multicommunal=> select version();

-[ RECORD 1 ]--------------------------------

version | Vertica Analytic Database v25.2.0-0

 Step 2: Load the data

We use the VMart dataset throughout this blog. The customer_dimension table has been created and populated. For more details, refer to the VMart Documentation.

multicommunal=> \dt public.*

                     List of tables

 Schema |        Name        | Kind  |  Owner  | Comment

--------+--------------------+-------+---------+---------

 public | customer_dimension | table | dbadmin |

(1 row)

 

Step 3: Verify location of table

  To confirm where the table data is stored, please run the below query

multicommunal=> SELECT projection_name, location_path, count(*) from STORAGE_CONTAINERS sc, storage_locations s where schema_name = 'public' and sc.location_label = s.location_label and sharing_type = 'COMMUNAL' group by 1,2 ;
     projection_name      |         location_path         | count
--------------------------+-------------------------------+-------
customer_dimension_super | s3://sanumula/multicommunal   |    6

 

Scenario 1: Add a Secondary Communal Storage Location on MinIO

Now that our database is set up with primary communal, we configure and add a MinIO S3 bucket as a secondary communal storage location for our on-premises Vertica Eon Mode deployment.

 Diagram4

 

We assign it a location label (secondary-storage) to help identify which objects are associated with this specific storage backend.

Tip: Using a location label is highly recommended for clarity and manageability, especially when working with multiple communal storage locations.

multicommunal=> CREATE LOCATION 's3://sanumula/secondcommunal' COMMUNAL USAGE 'DATA' LABEL 'secondary-storage';

CREATE LOCATION

Step 1: Assign Tables to Secondary Communal Storage

We’ve successfully created and loaded the product_dimension table. Next, we assign it to the newly configured secondary communal storage location using the SET_OBJECT_STORAGE_POLICY function.

The third parameter of the SET_OBJECT_STORAGE_POLICY function—enforce-storage-move—governs the timing of storage container movement relative to Tuple Mover operations. By default, this flag is set to false, which defers container movement until all pending mergeout tasks have completed. When set to true we instruct Vertica to trigger the Tuple Mover immediately, initiating the background task named “Move Storages” that migrates the table data to the specified storage location without delay.

This ensures that the data is physically relocated to the secondary communal backend (secondary-storage) as soon as the policy is applied

multicommunal=> SELECT SET_OBJECT_STORAGE_POLICY('public.product_dimension', 'secondary-storage','true');

                                                                      SET_OBJECT_STORAGE_POLICY

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

 Object storage policy set.

Task: moving storages

(Table: default_namespace.public.product_dimension) (Projection: default_namespace.public.product_dimension_super)

 

(1 row)

 

Step 2: Verify Storage Assignment

To confirm which communal storage location a table is using:

multicommunal=> SELECT node_name,  location_label,projection_name FROM STORAGE_CONTAINERS where schema_name = 'public' and location_label   = 'secondary-storage';

        node_name         |  location_label   |     projection_name

--------------------------+-------------------+--------------------------

 v_multicommunal_node0001 | secondary-storage | product_dimension_super

 v_multicommunal_node0001 | secondary-storage | product_dimension_super

 v_multicommunal_node0002 | secondary-storage | product_dimension_super

 v_multicommunal_node0002 | secondary-storage | product_dimension_super

 v_multicommunal_node0003 | secondary-storage | product_dimension_super

 v_multicommunal_node0003 | secondary-storage | product_dimension_super 

If location_label shows 'secondary-storage', the table is now associated with the secondary communal storage.

 

Step 3: Validate ROS containers files on MinIO

Let’s fetch the list of ROS containers files associated with product dimension table. 

multicommunal=> select projection_name,sal_storage_id,location_label from storage_containers where location_label = 'secondary-storage' order by 1 desc;

     projection_name     |                  sal_storage_id                  |  location_label

-------------------------+--------------------------------------------------+-------------------

 product_dimension_super | 0218b88103294c19ef37a5132d3d2c9000b000000002458f | secondary-storage

 product_dimension_super | 0218b88103294c19ef37a5132d3d2c9000b0000000024591 | secondary-storage

 product_dimension_super | 02d04a689f2537e28b181ec0f3f2134300c000000002458f | secondary-storage

 product_dimension_super | 02d04a689f2537e28b181ec0f3f2134300c0000000024591 | secondary-storage

 product_dimension_super | 02f7e09e28bd50a3be96fa656136608500a0000000024593 | secondary-storage

 product_dimension_super | 02f7e09e28bd50a3be96fa656136608500a0000000024591 | secondary-storage

 

Next, use the aws s3 ls command to verify the physical presence of these container files in the MinIO bucket. Replace the sal_storage_id in the command below with one from the query result:

[dbadmin@sanumula01 VMart_Schema]$ aws s3 ls --recursive s3://sanumula/secondcommunal/ --endpoint=http://10.xx.yy.zzz:9000|grep 0218b88103294c19ef37a5132d3d2c9000b000000002458f

2025-07-25 18:18:19     397190 secondcommunal/79e/0218b88103294c19ef37a5132d3d2c9000b000000002458f_0.gt

This confirms that the ROS container file (.gt) is present in the second communal storage location.

Scenario 2: Creating third communal storage location on AWS

 We'll configure an additional communal storage location using Amazon S3. As part of this setup, we'll create a new table named date_dimension. Once the data is loaded, we will assign it to AWS communal.

Step 1: Configure S3 bucket Config

Since this deployment is running on-premises, we need to explicitly configure AWS S3 credentials to enable access to communal storage. This typically involves setting the following database parameters:

  • S3BucketConfig: Defines the bucket, region, and endpoint.
  • S3BucketCredentials: Provides access and secret keys for authentication.

Note: In cloud-hosted Eon deployments, authentication is usually handled via IAM roles, so manual credential setup is often unnecessary. However, if you're using MinIO or Pure Storage as an additional communal storage backend, credentials must be configured manually—regardless of the deployment environment. Ensure that the credentials provided have the necessary permissions to read from and write to the specified S3 buckets or compatible storage endpoints.

 ALTER DATABASE DEFAULT SET S3BucketConfig='

[

    {

        "bucket": "veritca-fleeting-multi",

        "region": "us-east-1",

        "endpoint": "s3.amazonaws.com"

    }

]';

 

ALTER DATABASE DEFAULT SET S3BucketCredentials='

[

    {

        "bucket": "veritca-fleeting-multi",

        "accessKey": "AK0",

        "secretAccessKey": "SAK0"

    }

]';

 

Step 2: Create a secondary communal storage location.

Now that the credentials are configured, we can create a third communal storage location. We assign it a location label (AWS-storage) to help identify which objects are associated with this specific storage backend.

Tip: Using a location label is highly recommended for clarity and manageability, especially when working with multiple communal storage locations.

multicommunal=> CREATE LOCATION 's3://veritca-fleeting-multi/AWScommunal' COMMUNAL USAGE 'DATA' LABEL 'AWS-storage';

CREATE LOCATION

 

Step 3: Assign Tables to AWS Communal Storage

I have created date_dimension table and loaded it to the database. Now, let us assign to AWS Communal Storage.

multicommunal=>  SELECT SET_OBJECT_STORAGE_POLICY('public.date_dimension', 'AWS-storage','true');

                                                                   SET_OBJECT_STORAGE_POLICY

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 Object storage policy set.

Task: moving storages

(Table: default_namespace.public.date_dimension) (Projection: default_namespace.public.date_dimension_super)

 

(1 row)

Step 4: Verify Storage Assignment

To confirm which communal storage location a table is using: 

multicommunal=> SELECT node_name,  location_label,projection_name FROM STORAGE_CONTAINERS where schema_name = 'public' and location_label   = 'AWS-storage';;

        node_name         |  location_label   |     projection_name

--------------------------+-------------------+--------------------------

 v_multicommunal_node0003 | AWS-storage       | date_dimension_super

 v_multicommunal_node0003 | AWS-storage       | date_dimension_super

 v_multicommunal_node0002 | AWS-storage       | date_dimension_super

 v_multicommunal_node0002 | AWS-storage       | date_dimension_super

 v_multicommunal_node0001 | AWS-storage       | date_dimension_super

 v_multicommunal_node0001 | AWS-storage       | date_dimension_super

 

Step 5: Verify ROS container files on AWS

The screenshot below demonstrates that ROS containers are on S3.

🗃️ Decommissioning Communal Storage

As part of our recent deep dive, we introduced two additional communal storage locations to support scalability and flexibility. While these additions can be beneficial, there are scenarios where removing them becomes necessary such as

  • Reducing complexity in your storage architecture
  • Once testing of the new Vertica version is completed using the sandbox subcluster.

We’ll walk through the process of decommissioning one communal storage location. For this example, we focus on retiring an AWS-based communal storage in a Vertica environment.

Step 1: Verify Current Storage Policies

Before proceeding, it’s important to review the storage policies currently defined in the database. Storage policies in Vertica determine how data is tiered across different storage locations. To inspect existing policies and their configurations, please run the below SQL query.

multicommunal=> select * from storage_policies;

  namespace_name   | schema_name |     object_name      | policy_details |  location_label

-------------------+-------------+----------------------+----------------+-------------------

 default_namespace | public      | product_dimension    | Table          | secondary-storage

 default_namespace | public      | date_dimension       | Table          | AWS-storage

 default_namespace | public      | date_dimension_super | Projection     | AWS-storage

(3 rows)

Step 2: we’re changing the object storage policy of date_dimension to secondary storage on MinIO.

multicommunal=>  SELECT SET_OBJECT_STORAGE_POLICY('public.date_dimension', 'secondary-storage','true');

                                                                   SET_OBJECT_STORAGE_POLICY

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 Object storage policy set.

Task: moving storages

(Table: default_namespace.public.date_dimension) (Projection: default_namespace.public.date_dimension_super)

 

(1 row)

  

multicommunal=> SELECT node_name,  location_label,projection_name FROM STORAGE_CONTAINERS where schema_name = 'public' and location_label   = 'secondary-storage';

        node_name         |  location_label   |     projection_name

--------------------------+-------------------+--------------------------

 v_multicommunal_node0003 | secondary-storage | date_dimension_super

 v_multicommunal_node0003 | secondary-storage | date_dimension_super

 v_multicommunal_node0003 | secondary-storage | product_dimension_super

 v_multicommunal_node0003 | secondary-storage | product_dimension_super

 v_multicommunal_node0002 | secondary-storage | date_dimension_super

 v_multicommunal_node0002 | secondary-storage | date_dimension_super

 v_multicommunal_node0002 | secondary-storage | product_dimension_super

 v_multicommunal_node0002 | secondary-storage | product_dimension_super

 v_multicommunal_node0001 | secondary-storage | date_dimension_super

 v_multicommunal_node0001 | secondary-storage | date_dimension_super

 v_multicommunal_node0001 | secondary-storage | product_dimension_super

 v_multicommunal_node0001 | secondary-storage | product_dimension_super

 

Step 3: Wait for Tuple Mover to Complete

The Tuple Mover background process will handle moving the ROS containers. Monitor its progress with:

select * from tuple_mover_operations where operation_name = 'Move Storages' and is_executing;

Once the Tuple Mover has successfully moved the ROS container files, the query should return zero rows

 

Step 4: Confirm Storage Assignment

multicommunal=> select projection_name,sal_storage_id,location_label from storage_containers where projection_name = 'date_dimension_super';

   projection_name    |                  sal_storage_id                  |  location_label

----------------------+--------------------------------------------------+-------------------

 date_dimension_super | 02d04a689f2537e28b181ec0f3f2134300c0000000001f55 | secondary-storage

 date_dimension_super | 02d04a689f2537e28b181ec0f3f2134300c0000000001f59 | secondary-storage

 date_dimension_super | 02ae95125c5f5d6eacdde3d06c3adefd00a0000000001f55 | secondary-storage

 date_dimension_super | 02ae95125c5f5d6eacdde3d06c3adefd00a0000000001f59 | secondary-storage

 date_dimension_super | 0218b88103294c19ef37a5132d3d2c9000b0000000001f55 | secondary-storage

 date_dimension_super | 0218b88103294c19ef37a5132d3d2c9000b0000000001f5b | secondary-storage

(6 rows)

 

Step 5: Retire the Communal Location

Once data has been moved, retire the AWS communal location:

multicommunal=> SELECT RETIRE_LOCATION('s3://veritca-fleeting-multi/AWScommunal/' , '');

                   RETIRE_LOCATION

------------------------------------------------------

 s3://veritca-fleeting-multi/AWScommunal/ retired.

(1 row)

 

Step 6: Drop the Communal Location

Now, drop the retired location:

multicommunal=> SELECT DROP_LOCATION('s3://veritca-fleeting-multi/AWScommunal/' , '');

                    DROP_LOCATION

------------------------------------------------------

 s3://veritca-fleeting-multi/AWScommunal/ dropped.

(1 row)

 

Step 7: Clear the S3 per bucket Configuration Parameters

Remove any lingering S3 configuration from the database:

multicommunal=> ALTER DATABASE DEFAULT CLEAR S3BucketCredentials,S3BucketConfig;

ALTER DATABASE

multicommunal=>

 

Step 8: Manually Clean Up AWS Storage

Vertica does not automatically delete the contents of the communal storage. You must manually clean up the S3 bucket to complete the decommissioning process.

This step-by-step guide ensures a clean and safe removal of unused communal storage, helping you maintain an optimized and secure Vertica environment.

 

❓ Frequently Asked Questions (FAQ)

🔹 What is a communal storage location in Vertica Eon Mode?

A communal storage location is a shared object store (e.g., AWS S3, GCS, Azure blog storage, PureStorage, MinIO) where Vertica stores database data in Eon Mode. All nodes in the cluster access this shared storage for reading and writing data.

🔹 Which version of Vertica supports Multiple communal storage locations Feature?

It is supported starting Vertica 25.1.

🔹 Can I use different cloud providers for communal storage locations within a single EON database?

No. You cannot use different cloud providers for a single EON Mode database.

🔹 How do I assign specific tables or schemas to a particular storage location?

You can use the SET_OBJECT_STORAGE_POLICY function to assign individual database objects (such as tables or schemas) to a specific communal storage location by its label

SELECT SET_OBJECT_STORAGE_POLICY('public.my_table', 'cold_archive');

🔹 What happens if one of the storage locations becomes unavailable?

Vertica will continue to operate using the available storage locations. However, any data stored exclusively in an unavailable location may be temporarily inaccessible. It’s recommended to design your storage strategy with redundancy and availability in mind.

🔹 Is there a limit to how many communal storage locations I can define?

There is no hard-coded limit, but practical limits may depend on your infrastructure, network performance, and operational complexity. Vertica recommends keeping the number of locations manageable and aligned with your data architecture strategy.

🔹 Can I remove a communal storage location after it's been added?

Yes, but only if no database objects are currently assigned to it. You must first reassign using SET_OBJECT_STORAGE_POLICY or drop those objects before removing the location using DROP LOCATION.

🔹 Can I prioritize one storage location over another?

Vertica does not currently support prioritization or weighing communal storage locations. However, you can control where data is stored by explicitly assigning objects to specific locations using  SET_OBJECT_STORAGE_POLICY.

🔹 Are there performance implications when using multiple storage locations?

Yes, performance can vary depending on the latency, throughput, and reliability of each storage backend. For optimal performance, ensure that storage endpoints are geographically close to your compute nodes and that network bandwidth is sufficient.

🔹 How does Vertica handle metadata across multiple storage locations?

Vertica maintains a unified metadata catalog regardless of how many communal storage locations are configured. This ensures consistent query planning and execution across all storage backends.

🔹 Can I use different authentication methods for each storage location?

Yes. Each communal storage location can be configured with its own authentication method, such as IAM roles for AWS S3, service account keys for GCS, or access/secret keys for MinIO. This allows secure integration with diverse storage systems.

🔹 Is data automatically rebalanced across storage locations?

No. Vertica does not automatically redistribute data between communal storage locations. You must explicitly assign or migrate data using object storage policies or manual ETL processes.

🔹 Can I monitor usage or performance of each storage location?

While Vertica does not provide per-location performance dashboards out of the box, you can monitor I/O patterns using system tables, logs, and external tools like cloud provider metrics (e.g., AWS CloudWatch, MinIO Console).

🔹 Can I use this feature in Vertica on Kubernetes?

No. Vertica Eon Mode on Kubernetes doesn’t support multiple communal storage locations.

🔹 Where does the data get loaded by default for multi-communal database?

Data is always loaded in primary communal storage location by default.

🔹 How to monitor the data movement to another communal?

Use the following query to monitor it

select * from tuple_mover_operations where operation_name = 'Move Storages' and is_executing;

 

Additional Information

Adding Communal Locations

CREATE LOCATION

SET_OBJECT_STORAGE_POLICY

Clearing storage policies

Retiring storage locations

Dropping storage locations