All pages
Powered by GitBook
1 of 10

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Step 1: Prepare ColumnStore Nodes

Overview

This page details step 1 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step prepares systems to host MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Optimize Linux Kernel Parameters

MariaDB Enterprise ColumnStore performs best with Linux kernel optimizations.

On each server to host an Enterprise ColumnStore node, optimize the kernel:

  1. Set the relevant kernel parameters in a sysctl configuration file. To ensure proper change management, use an Enterprise ColumnStore-specific configuration file.

Create a /etc/sysctl.d/90-mariadb-enterprise-columnstore.conf file:

  1. Use the sysctl command to set the kernel parameters at runtime

Temporarily Configure Linux Security Modules (LSM)

The Linux Security Modules (LSM) should be temporarily disabled on each Enterprise ColumnStore node during installation.

The LSM will be configured and re-enabled later in this deployment procedure.

The steps to disable the LSM depend on the specific LSM used by the operating system.

CentOS / RHEL Stop SELinux

SELinux must be set to permissive mode before installing MariaDB Enterprise ColumnStore.

To set SELinux to permissive mode:

  1. Set SELinux to permissive mode:

  1. Set SELinux to permissive mode by setting SELINUX=permissive in /etc/selinux/config.

For example, the file will usually look like this after the change:

  1. Confirm that SELinux is in permissive mode:

SELinux will be configured and re-enabled later in this deployment procedure. This configuration is not persistent. If you restart the server before configuring and re-enabling SELinux later in the deployment procedure, you must reset the enforcement to permissive mode.

Debian / Ubuntu AppArmor

AppArmor must be disabled before installing MariaDB Enterprise ColumnStore.

  1. Disable AppArmor:

  1. Reboot the system.

  2. Confirm that no AppArmor profiles are loaded using aa-status:

AppArmor will be configured and re-enabled later in this deployment procedure.

Temporarily Configure Firewall for Installation

MariaDB Enterprise ColumnStore requires the following TCP ports:

TCP Ports
Description

The firewall should be temporarily disabled on each Enterprise ColumnStore node during installation.

The firewall will be configured and re-enabled later in this deployment procedure.

The steps to disable the firewall depend on the specific firewall used by the operating system.

CentOS / RHEL Stop firewalld

  1. Check if the firewalld service is running:

  1. If the firewalld service is running, stop it:

Firewalld will be configured and re-enabled later in this deployment procedure.

Ubuntu Stop UFW

  1. Check if the UFW service is running:

  1. If the UFW service is running, stop it:

UFW will be configured and re-enabled later in this deployment procedure.

Configure the AWS Security Group

To install Enterprise ColumnStore on Amazon Web Services (AWS), the security group must be modified prior to installation.

Enterprise ColumnStore requires all internal communications to be open between Enterprise ColumnStore nodes. Therefore, the security group should allow all protocols and all ports to be open between the Enterprise ColumnStore nodes and the MaxScale proxy.

Configure Character Encoding

When using MariaDB Enterprise ColumnStore, it is recommended to set the system's locale to UTF-8.

  1. On RHEL 8, install additional dependencies:

  1. Set the system's locale to en_US.UTF-8 by executing localedef:

Configure DNS

MariaDB Enterprise ColumnStore requires all nodes to have host names that are resolvable on all other nodes. If your infrastructure does not configure DNS centrally, you may need to configure static DNS entries in the /etc/hosts file of each server.

On each Enterprise ColumnStore node, edit the /etc/hosts file to map host names to the IP address of each Enterprise ColumnStore node:

Replace the IP addresses with the addresses in your own environment.

Create an S3 Bucket

With the ColumnStore Object Storage topology, it is important to create the S3 bucket before you start ColumnStore. All Enterprise ColumnStore nodes access data from the same bucket.

If you already have an S3 bucket, confirm that the bucket is empty.

S3 bucket configuration will be performed later in this procedure.

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 1 of 9.

Next: Step 2: Configure Shared Local Storage.

Step 3: Install MariaDB Enterprise Server

Overview

This page details step 3 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step installs MariaDB Enterprise Server, MariaDB Enterprise ColumnStore 23.10, CMAPI, and dependencies.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise Server and Enterprise ColumnStore

  1. On each Enterprise ColumnStore node, install additional dependencies:

Install on CentOS and RHEL (YUM):

Install on Debian 9 and Ubuntu 18.04 (APT)

Install on Debian 10 and Ubuntu 20.04 (APT):

  1. On each Enterprise ColumnStore node, install MariaDB Enterprise Server and MariaDB Enterprise ColumnStore:

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology".

This page was step 3 of 9.

Next: Step 4: Start and Configure MariaDB Enterprise Server.

Step 6: Install MariaDB MaxScale

Overview

This page details step 6 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step installs MariaDB MaxScale 22.08.

ColumnStore Object Storage requires 1 or more MaxScale nodes.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Customer Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On the MaxScale node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On the MaxScale node, configure package repositories and specify MariaDB MaxScale 22.08:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install MaxScale

On the MaxScale node, install MariaDB MaxScale.

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 6 of 9.

Next: Step 7: Start and Configure MariaDB MaxScale.

3306

Port used for MariaDB Client traffic

8600-8630

Port range used for inter-node communication

8640

Port used by CMAPI

8700

Port used for inter-node communication

8800

Port used for inter-node communication

https://customers.mariadb.com/downloads/token/
Versions
MariaDB Package Repository Setup and Usage
https://customers.mariadb.com/downloads/token/
Versions
MariaDB Package Repository Setup and Usage

Step 9: Import Data

Overview

This page details step 9 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step bulk imports data to Enterprise ColumnStore.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Import the Schema

Before data can be imported into the tables, create a matching schema.

On the primary server, create the schema:

  1. For each database that you are importing, create the database with the CREATE DATABASE statement:

  1. For each table that you are importing, create the table with the CREATE TABLE statement:

Import the Data

Enterprise ColumnStore supports multiple methods to import data into ColumnStore tables.

Interface
Method
Benefits

cpimport

MariaDB Enterprise ColumnStore includes , which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server run :

LOAD DATA INFILE

When data is loaded with the LOAD DATA INFILE statement, MariaDB Enterprise ColumnStore loads the data using , which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server use LOAD DATA INFILE statement:

Import from Remote Database

MariaDB Enterprise ColumnStore can also import data directly from a remote database. A simple method is to query the table using the SELECT statement, and then pipe the results into , which is a command-line utility that is designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a remote MariaDB database:

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 9 of 9.

This procedure is complete.

This page is: Copyright Β© 2025 MariaDB. All rights reserved.

Step 2: Configure Shared Local Storage

Overview

This page details step 2 of the 9-step procedure "".

This step configures shared local storage on systems hosting Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

# minimize swapping
vm.swappiness = 1

# Increase the TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# Increase the TCP buffer limits
# min, default, and max number of bytes to use
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# don't cache ssthresh from previous connection
net.ipv4.tcp_no_metrics_save = 1

# for 1 GigE, increase this to 2500
# for 10 GigE, increase this to 30000
net.core.netdev_max_backlog = 2500
$ sudo sysctl --load=/etc/sysctl.d/90-mariadb-enterprise-columnstore.conf
$ sudo setenforce permissive
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
$ sudo getenforce
Permissive
$ sudo systemctl disable apparmor
$ sudo aa-status
apparmor module is loaded.
0 profiles are loaded.
0 profiles are in enforce mode.
0 profiles are in complain mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
$ sudo systemctl status firewalld
$ sudo systemctl stop firewalld
$ sudo ufw status verbose
$ sudo ufw disable
$ sudo yum install glibc-locale-source glibc-langpack-en
$ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
192.0.2.1     mcs1
192.0.2.2     mcs2
192.0.2.3     mcs3
192.0.2.100   mxs1
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -
$ chmod +x mariadb_es_repo_setup
$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-maxscale \
      --skip-tools \
      --mariadb-server-version="11.4"
$ sudo yum install jemalloc jq curl
$ sudo apt install libjemalloc1 jq curl
$ sudo apt install libjemalloc2 jq curl
$ sudo yum install MariaDB-server \
   MariaDB-backup \
   MariaDB-shared \
   MariaDB-client \
   MariaDB-columnstore-engine \
   MariaDB-columnstore-cmapi
$ sudo apt install mariadb-server \
   mariadb-backup \
   libmariadb3 \
   mariadb-client \
   mariadb-plugin-columnstore \
   mariadb-columnstore-cmapi
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup

$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -

$ chmod +x mariadb_es_repo_setup

$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-server \
      --skip-tools \
      --mariadb-maxscale-version="22.08"
$ sudo yum install maxscale
$ sudo apt install maxscale
Directories for Shared Local Storage

In a ColumnStore Object Storage topology, MariaDB Enterprise ColumnStore requires the Storage Manager directory to be located on shared local storage.

The Storage Manager directory is at the following path:

  • /var/lib/columnstore/storagemanager

The Storage Manager directory must be mounted on every ColumnStore node.

Choose a Shared Local Storage Solution

Select a Shared Local Storage solution for the Storage Manager directory:

  • EBS (Elastic Block Store) Multi-Attach

  • EFS (Elastic File System)

  • Filestore

  • GlusterFS

For additional information, see "Shared Local Storage Options".

Configure EBS Multi-Attach

EBS is a high-performance block-storage service for AWS (Amazon Web Services). EBS Multi-Attach allows an EBS volume to be attached to multiple instances in AWS. Only clustered file systems, such as GFS2, are supported.

For Enterprise ColumnStore deployments in AWS:

  • EBS Multi-Attach is a recommended option for the Storage Manager directory.

  • Amazon S3 storage is the recommended option for data.

  • Consult the vendor documentation for details on how to configure EBS Multi-Attach.

Configure Elastic File System (EFS)

EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services)

For deployments in AWS:

  • EFS is a recommended option for the Storage Manager directory.

  • Amazon S3 storage is the recommended option for data.

  • Consult the vendor documentation for details on how to configure EFS.

Configure Filestore

Filestore is high-performance, fully managed storage for GCP (Google Cloud Platform).

For Enterprise ColumnStore deployments in GCP:

  • Filestore is the recommended option for the Storage Manager directory.

  • Google Object Storage (S3-compatible) is the recommended option for data.

  • Consult the vendor documentation for details on how to configure Filestore.

Configure GlusterFS

GlusterFS is a distributed file system.

GlusterFS is a shared local storage option, but it is not one of the recommended options.

For more information, see "".

Install GlusterFS

On each Enterprise ColumnStore node, install GlusterFS.

Install on CentOS / RHEL 8 (YUM):

Install on CentOS / RHEL 7 (YUM):

Install on Debian (APT):

Install on Ubuntu (APT):

Start the GlusterFS Daemon

Start the GlusterFS daemon:

Probe the GlusterFS Peers

Before you can create a volume with GlusterFS, you must probe each node from a peer node.

  1. On the primary node, probe all of the other cluster nodes:

  1. On one of the replica nodes, probe the primary node to confirm that it is connected:

  1. On the primary node, check the peer status:

Configure and Mount GlusterFS Volumes

Create the GlusterFS volumes for MariaDB Enterprise ColumnStore. Each volume must have the same number of replicas as the number of Enterprise ColumnStore nodes.

  1. On each Enterprise ColumnStore node, create the directory for each brick in the /brick directory:

  1. On the primary node, create the GlusterFS volumes:

  1. On the primary node, start the volume:

  1. On each Enterprise ColumnStore node, create mount points for the volumes:

  1. On each Enterprise ColumnStore node, add the mount points to /etc/fstab:

  1. On each Enterprise ColumnStore node, mount the volumes:

Configure Network File System (NFS)

NFS is a distributed file system. NFS is available in most Linux distributions. If NFS is used for an Enterprise ColumnStore deployment, the storage must be mounted with the sync option to ensure that each node flushes its changes immediately.

For on-premises deployments:

  • NFS is the recommended option for the Storage Manager directory.

  • Any S3-compatible storage is the recommended option for data.

Consult the documentation for your NFS implementation for details on how to configure NFS.

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 2 of 9.

Next: Step 3: Install MariaDB Enterprise Server.

This page is: Copyright Β© 2025 MariaDB. All rights reserved.

Deploy ColumnStore Object Storage Topology

Shell

cpimport

  • SQL access is not required

SQL

LOAD DATA INFILE

  • Shell access is not required

Remote Database

Remote Database Import

  • Use normal database client

  • Avoid dumping data to intermediate filed

cpimport
cpimport
cpimport
cpimport

Step 7: Start and Configure MariaDB MaxScale

Overview

This page details step 7 of the 9-step procedure "".

This step starts and configures MariaDB MaxScale 22.08.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

$ sudo yum install --enablerepo=PowerTools glusterfs-server
$ sudo yum install centos-release-gluster
$ sudo yum install glusterfs-server
$ wget -O - https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub | apt-key add -

$ DEBID=$(grep 'VERSION_ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"')
$ DEBVER=$(grep 'VERSION=' /etc/os-release | grep -Eo '[a-z]+')
$ DEBARCH=$(dpkg --print-architecture)
$ echo deb https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/${DEBID}/${DEBARCH}/apt ${DEBVER} main > /etc/apt/sources.list.d/gluster.list
$ sudo apt update
$ sudo apt install glusterfs-server
$ sudo apt update
$ sudo apt install glusterfs-server
$ sudo systemctl start glusterd
$ sudo systemctl enable glusterd
$ sudo gluster peer probe mcs2
$ sudo gluster peer probe mcs3
$ sudo gluster peer probe mcs1
peer probe: Host mcs1 port 24007 already in peer list
$ sudo gluster peer status
Number of Peers: 2

Hostname: mcs2
Uuid: 3c8a5c79-22de-45df-9034-8ae624b7b23e
State: Peer in Cluster (Connected)

Hostname: mcs3
Uuid: 862af7b2-bb5e-4b1c-8311-630fa32ed451
State: Peer in Cluster (Connected)
$ sudo mkdir -p /brick/storagemanager
$ sudo gluster volume create storagemanager \
      replica 3 \
      mcs1:/brick/storagemanager \
      mcs2:/brick/storagemanager \
      mcs3:/brick/storagemanager \
      force
$ sudo gluster volume start storagemanager
$ sudo mkdir -p /var/lib/columnstore/storagemanager
127.0.0.1:storagemanager /var/lib/columnstore/storagemanager glusterfs defaults,_netdev 0 0
$ sudo mount -a
CREATE DATABASE inventory;
CREATE TABLE inventory.products (
   product_name VARCHAR(11) NOT NULL DEFAULT '',
   supplier VARCHAR(128) NOT NULL DEFAULT '',
   quantity VARCHAR(128) NOT NULL DEFAULT '',
   unit_cost VARCHAR(128) NOT NULL DEFAULT ''
) ENGINE=Columnstore DEFAULT CHARSET=utf8;
$ sudo cpimport -s '\t' inventory products /tmp/inventory-products.tsv
LOAD DATA INFILE '/tmp/inventory-products.tsv'
INTO TABLE inventory.products;
$ mariadb --quick \
   --skip-column-names \
   --execute="SELECT * FROM inventory.products" \
   | cpimport -s '\t' inventory products

This page is: Copyright Β© 2025 MariaDB. All rights reserved.

This page is: Copyright Β© 2025 MariaDB. All rights reserved.

This page is: Copyright Β© 2025 MariaDB. All rights reserved.

Replace the Default Configuration File

MariaDB MaxScale installations include a configuration file with some example objects. This configuration file should be replaced.

On the MaxScale node, replace the default /etc/maxscale.cnf with the following configuration:

For additional information, see "Global Parameters".

Restart MaxScale

On the MaxScale node, restart the MaxScale service to ensure that MaxScale picks up the new configuration:

For additional information, see "Start and Stop Services".

Configure Server Objects

On the MaxScale node, use maxctrl create to create a server object for each Enterprise ColumnStore node:

Configure MariaDB Monitor

MaxScale uses monitors to retrieve additional information from the servers. This information is used by other services in filtering and routing connections based on the current state of the node. For MariaDB Enterprise ColumnStore, use the MariaDB Monitor (mariadbmon).

On the MaxScale node, use maxctrl create monitor to create a MariaDB Monitor:

In this example:

  • columnstore_monitor is an arbitrary name that is used to identify the new monitor.

  • mariadbmon is the name of the module that implements the MariaDB Monitor.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to monitor the ColumnStore nodes.

  • password='MAXSCALE_USER_PASSWORD' sets the password parameter to the password used by the database user account that MaxScale uses to monitor the ColumnStore nodes.

  • replication_user=REPLICATION_USER sets the replication_user parameter to the database user account that MaxScale uses to setup replication.

  • replication_password='REPLICATION_USER_PASSWORD' sets the replication_password parameter to the password used by the database user account that MaxScale uses to setup replication.

  • --servers sets the servers parameter to the set of nodes that MaxScale should monitor. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by mariadbmon in MaxScale 22.08 can also be specified.

Choose a MaxScale Router

Routers control how MaxScale balances the load between Enterprise ColumnStore nodes. Each router uses a different approach to routing queries. Consider the specific use case of your application and database load and select the router that best suits your needs.

Router
Configuration Procedure
Description

Connection-based load balancing

  • Routes connections to Enterprise ColumnStore nodes designated as replica servers for a read-only pool

  • Routes connections to an Enterprise ColumnStore node designated as the primary server for a read-write pool.|

Query-based load balancing

  • Routes write queries to an Enterprise ColumnStore node designated as the primary server

  • Routes read queries to Enterprise ColumnStore node designated as replica servers

  • Automatically reconnects after node failures

  • Automatically replays transactions after node failures

Configure Read Connection Router

Use MaxScale Read Connection Router (readconnroute) to route connections to replica servers for a read-only pool.

On the MaxScale node, use maxctrl create service to create a router:

In this example:

  • connection_router_service is an arbitrary name that is used to identify the new service.

  • readconnroute is the name of the module that implements the Read Connection Router.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ColumnStore nodes.

  • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ColumnStore nodes.

  • router_options=slave sets the router_options parameter to slave, so that MaxScale only routes connections to the replica nodes.

  • --servers sets the servers parameter to the set of nodes to which MaxScale should route connections. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by readconnroute in MaxScale 22.08 can also be specified.

Configure Listener for the Read Connection Router

These instructions reference TCP port 3308. You can use a different TCP port. The TCP port used must not be bound by any other listener.

On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read Connection Router (readconnroute):

In this example:

  • connection_router_service is the name of the readconnroute service that was previously created.

  • connection_router_listener is an arbitrary name that is used to identify the new listener.

  • 3308 is the TCP port.

  • protocol=MariaDBClient sets the protocol parameter.

  • Other Module Parameters supported by listeners in MaxScale 22.08 can also be specified.

Configure Read/Write Split Router for Queries

MaxScale Read/Write Split Router (readwritesplit) performs query-based load balancing. The router routes write queries to the primary and read queries to the replicas.

On the MaxScale node, use the maxctrl create service command to configure MaxScale to use the Read/Write Split Router (readwritesplit):

In this example:

  • query_router_service is an arbitrary name that is used to identify the new service.

  • readwritesplit is the name of the module that implements the Read/Write Split Router.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ColumnStore nodes.

  • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ColumnStore nodes.

  • --servers sets the servers parameter to the set of nodes to which MaxScale should route queries. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by readwritesplit in MaxScale 22.08 can also be specified.

Configure a Listener for the Read/Write Split Router

These instructions reference TCP port 3307. You can use a different TCP port. The TCP port used must not be bound by any other listener.

On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read/Write Split Router (readwritesplit):

In this example:

  • query_router_service is the name of the readwritesplit service that was previously created.

  • query_router_listener is an arbitrary name that is used to identify the new listener.

  • 3307 is the TCP port.

  • protocol=MariaDBClient sets the protocol parameter.

  • Other Module Parameters supported by listeners in MaxScale 22.08 can also be specified.

Start Services

To start the services and monitors, on the MaxScale node use maxctrl start services:

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 7 of 9.

Next: Step 8: Test MariaDB MaxScale

This page is: Copyright Β© 2025 MariaDB. All rights reserved.

Deploy ColumnStore Object Storage Topology
NFS (Network File System)

Step 5: Test MariaDB Enterprise Server

Overview

This page details step 5 of the 9-step procedure "".

This step tests MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

[maxscale]
threads          = auto
admin_host       = 0.0.0.0
admin_secure_gui = false
$ sudo systemctl restart maxscale
$ maxctrl create server mcs1 192.0.2.101
$ maxctrl create server mcs2 192.0.2.102
$ maxctrl create server mcs3 192.0.2.103
$ maxctrl create monitor columnstore_monitor mariadbmon \
     user=mxs \
     password='MAXSCALE_USER_PASSWORD' \
     replication_user=repl \
     replication_password='REPLICATION_USER_PASSWORD' \
     --servers mcs1 mcs2 mcs3
$ maxctrl create service connection_router_service readconnroute \
     user=mxs \
     password='MAXSCALE_USER_PASSWORD' \
     router_options=slave \
     --servers mcs1 mcs2 mcs3
$ maxctrl create listener connection_router_service connection_router_listener 3308 \
     protocol=MariaDBClient
$ maxctrl create service query_router_service readwritesplit  \
     user=mxs \
     password='MAXSCALE_USER_PASSWORD' \
     --servers mcs1 mcs2 mcs3
$ maxctrl create listener query_router_service query_router_listener 3307 \
     protocol=MariaDBClient
$ maxctrl start services
  • Optionally enforces causal reads|

  • Read Connection (readconnroute)
    Configure Read Connection Router
    Read/Write Split (readwritesplit)
    Configure Read/Write Split
    Test S3 Connection

    MariaDB Enterprise ColumnStore 23.10 includes a testS3Connection command to test the S3 configuration, permissions, and connectivity.

    This action is performed on each Enterprise ColumnStore node.

    Test the S3 configuration by executing the following:

    If the testS3Connection command does not return OK, investigate the S3 configuration.

    Test Enterprise Server Service

    Use Systemd to test whether the MariaDB Enterprise Server service is running.

    This action is performed on each Enterprise ColumnStore node.

    Check if the MariaDB Enterprise Server service is running by executing the following:

    If the service is not running on any node, start the service by executing the following on that node:

    Test Local Client Connections

    Use MariaDB Client to test the local connection to the Enterprise Server node.

    This action is performed on each Enterprise ColumnStore node:

    The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

    Test ColumnStore Storage Engine Plugin

    Query the information_schema.PLUGINS table to confirm that the ColumnStore storage engine is loaded.

    This action is performed on each Enterprise ColumnStore node.

    Execute the following query:

    The PLUGIN_STATUS column for each ColumnStore-related plugin should contain ACTIVE.

    Test CMAPI Service

    Use Systemd to test whether the CMAPI service is running.

    This action is performed on each Enterprise ColumnStore node.

    Check if the CMAPI service is running by executing the following:

    If the service is not running on any node, start the service by executing the following on that node:

    Test ColumnStore Status

    Use CMAPI to request the ColumnStore status. The API key needs to be provided as part of the X-API-key HTML header.

    This action is performed with the CMAPI service on the primary server.

    Check the ColumnStore status using curl by executing the following:

    Test DDL

    Use MariaDB Client to test DDL.

    1. On the primary server, use the MariaDB Client to connect to the node:

    1. Create a test database and ColumnStore table:

    1. On each replica server, use the MariaDB Client to connect to the node:

    1. Confirm that the database and table exist:

    If the database or table do not exist on any node, then check the replication configuration.

    Test DML

    Use MariaDB Client to test DML.

    1. On the primary server, use the MariaDB Client to connect to the node:

    1. Insert sample data into the table created in the DDL test:

    1. On each replica server, use the MariaDB Client to connect to the node:

    1. Execute a SELECT query to retrieve the data:

    If the data is not returned on any node, check the ColumnStore status and the storage configuration.

    Next Step

    Navigation in the procedure 'Deploy ColumnStore Object Storage Topology".

    This page was step 5 of 9.

    Next: Step 6: Install MariaDB MaxScale.

    This page is: Copyright Β© 2025 MariaDB. All rights reserved.

    Deploy ColumnStore Object Storage Topology
    $ sudo testS3Connection
    StorageManager[26887]: Using the config file found at /etc/columnstore/storagemanager.cnf
    StorageManager[26887]: S3Storage: S3 connectivity & permissions are OK
    S3 Storage Manager Configuration OK
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_columnstore%';
    
    +---------------------+---------------+
    | PLUGIN_NAME         | PLUGIN_STATUS |
    +---------------------+---------------+
    | Columnstore         | ACTIVE        |
    | COLUMNSTORE_COLUMNS | ACTIVE        |
    | COLUMNSTORE_TABLES  | ACTIVE        |
    | COLUMNSTORE_FILES   | ACTIVE        |
    | COLUMNSTORE_EXTENTS | ACTIVE        |
    +---------------------+---------------+
    $ systemctl status mariadb-columnstore-cmapi
    $ sudo systemctl start mariadb-columnstore-cmapi
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      },
      "192.0.2.2": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "192.0.2.3": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "num_nodes": 3
    }
    $ sudo mariadb
    CREATE DATABASE IF NOT EXISTS test;
    
    CREATE TABLE IF NOT EXISTS test.contacts (
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    ) ENGINE = ColumnStore;
    $ sudo mariadb
    SHOW CREATE TABLE test.contacts\G;
    $ sudo mariadb
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    $ sudo mariadb
    SELECT * FROM test.contacts;
    
    +------------+-----------+----------------------+
    | first_name | last_name | email                |
    +------------+-----------+----------------------+
    | Kai        | Devi      | kai.devi@example.com |
    | Lee        | Wang      | lee.wang@example.com |
    +------------+-----------+----------------------+

    Columnstore Object Storage

    Overview

    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    Columnar storage engine with S3-compatible object storage

    • Highly available

    • Automatic failover via MaxScale and CMAPI

    • Scales reads via MaxScale

    • Bulk data import

    This procedure describes the deployment of the ColumnStore Object Storage topology with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5.

    MariaDB Enterprise ColumnStore 5 is a columnar storage engine for MariaDB Enterprise Server 10.5. Enterprise ColumnStore is suitable for Online Analytical Processing (OLAP) workloads.

    This procedure has 9 steps, which are executed in sequence.

    This procedure represents basic product capability and deploys 3 Enterprise ColumnStore nodes and 1 MaxScale node.

    This page provides an overview of the topology, requirements, and deployment procedures.

    Please read and understand this procedure before executing.

    Procedure Steps

    Step
    Description

    Support

    Customers can obtain support by submitting a support case.

    Components

    The following components are deployed during this procedure:

    Component
    Function

    MariaDB Enterprise Server Components

    Component
    Description

    MariaDB MaxScale Components

    Component
    Description

    Topology

    The MariaDB Enterprise ColumnStore topology with Object Storage delivers production analytics with high availability, fault tolerance, and limitless data storage by leveraging S3-compatible storage.

    The topology consists of:

    • One or more MaxScale nodes

    • An odd number of ColumnStore nodes (minimum of 3) running ES, Enterprise ColumnStore, and CMAPI

    The MaxScale nodes:

    • Monitor the health and availability of each ColumnStore node using the MariaDB Monitor (mariadbmon)

    • Accept client and application connections

    • Route queries to ColumnStore nodes using the Read/Write Split Router (readwritesplit)

    The ColumnStore nodes:

    • Receive queries from MaxScale

    • Execute queries

    • Use for data

    • Use shared local storage for the Storage Manager directory

    Requirements

    These requirements are for the ColumnStore Object Storage topology when deployed with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5.

    • Node Count

    • Operating System

    • Minimum Hardware Requirements

    • Recommended Hardware Requirements

    Node Count

    • MaxScale nodes, 1 or more are required.

    • Enterprise ColumnStore nodes, 3 or more are required for high availability. You should always have an odd number of nodes in a multi-node ColumnStore deployment to avoid split brain scenarios.

    Operating System

    In alignment to the , the ColumnStore Object Storage topology with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5 is provided for:

    • CentOS Linux 7 (x86_64)

    • Debian 10 (x86_64)

    • Red Hat Enterprise Linux 7 (x86_64)

    • Red Hat Enterprise Linux 8 (x86_64)

    Minimum Hardware Requirements

    MariaDB Enterprise ColumnStore's minimum hardware requirements are not intended for production environments, but the minimum hardware requirements can be appropriate for development and test environments. For production environments, see the instead.

    The minimum hardware requirements are:

    Component
    CPU
    Memory

    MariaDB Enterprise ColumnStore will refuse to start if the system has less than 3 GB of memory.

    If Enterprise ColumnStore is started on a system with less memory, the following error message will be written to the ColumnStore system log called crit.log:

    And the following error message will be raised to the client:

    Recommended Hardware Requirements

    MariaDB Enterprise ColumnStore's recommended hardware requirements are intended for production analytics.

    The recommended hardware requirements are:

    Component
    CPU
    Memory

    Storage Requirements

    The ColumnStore Object Storage topology requires the following storage types:

    Storage Type
    Description

    S3-Compatible Object Storage Requirements

    The ColumnStore Object Storage topology uses S3-compatible object storage to store data.

    Many S3-compatible object storage services exist. MariaDB Corporation cannot make guarantees about all S3-compatible object storage services, because different services provide different functionality.

    For the preferred S3-compatible object storage providers that provide cloud and hardware solutions, see the following sections:

    The use of non-cloud and non-hardware providers is at your own risk.

    If you have any questions about using specific S3-compatible object storage with MariaDB Enterprise ColumnStore, contact us.

    Preferred Object Storage Providers: Cloud

    • Amazon Web Services (AWS) S3

    • Google Cloud Storage

    • Azure Storage

    • Alibaba Cloud Object Storage Service

    Preferred Object Storage Providers: Hardware

    • Cloudian HyperStore

    • Cohesity S3

    • Dell EMC

    • IBM Cloud Object Storage

    Shared Local Storage Directories

    The ColumnStore Object Storage topology uses shared local storage for the to store metadata.

    The Storage Manager directory is located at the following path by default:

    • /var/lib/columnstore/storagemanager

    Shared Local Storage Options

    The most common shared local storage options for the ColumnStore Object Storage topology are:

    Shared Local Storage
    Common Usage
    Description

    Recommended Storage Options

    For best results, MariaDB Corporation would recommend the following storage options:

    Environment
    Object Storage For Data
    Shared Local Storage For Storage Manager

    Enterprise ColumnStore Management with CMAPI

    Enterprise ColumnStore's CMAPI (Cluster Management API) is a REST API that can be used to manage a multi-node Enterprise ColumnStore cluster.

    Many tools are capable of interacting with REST APIs. For example, the curl utility could be used to make REST API calls from the command-line.

    Many programming languages also have libraries for interacting with REST APIs.

    The examples below show how to use the CMAPI with curl.

    URL Endpoint Format for REST API

    For example:

    • https://mcs1:8640/cmapi/0.4.0/cluster/shutdown

    • https://mcs1:8640/cmapi/0.4.0/cluster/start

    • https://mcs1:8640/cmapi/0.4.0/cluster/status

    With CMAPI 1.4 and later:

    • https://mcs1:8640/cmapi/0.4.0/cluster/node

    With CMAPI 1.3 and earlier:

    • https://mcs1:8640/cmapi/0.4.0/cluster/add-node

    • https://mcs1:8640/cmapi/0.4.0/cluster/remove-node

    Required Request Headers

    • 'x-api-key': '93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd'

    • 'Content-Type': 'application/json'

    x-api-key can be set to any value of your choice during the first call to the server. Subsequent connections will require this same key.

    Get Status

    curl examples remain valid but are now considered legacy.

    $ mcs cluster status

    Start Cluster

    $ mcs cluster start --timeout 20

    Stop Cluster

    $ mcs cluster shutdown --timeout 20

    Add Node

    • With CMAPI 1.4 and later:

    • With CMAPI 1.3 and earlier:

    Remove Node

    • With CMAPI 1.4 and later:

    • With CMAPI 1.3 and earlier:

    Quick Reference

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service.

    Operation
    Command

    For additional information, see "".

    MariaDB Enterprise Server Logs

    MariaDB Enterprise Server produces log data that can be helpful in problem diagnosis.

    Log filenames and locations may be overridden in the server configuration. The default location of logs is the data directory. The data directory is specified by the datadir system variable.

    Log
    System Variable/Option
    Default Filename

    Enterprise ColumnStore Service Management

    The systemctl command is used to start and stop the ColumnStore service.

    Operation
    Command

    In the ColumnStore Object Storage topology, the mariadb-columnstore service should not be enabled. The CMAPI service restarts Enterprise ColumnStore as needed, so it does not need to start automatically upon reboot.

    Enterprise ColumnStore CMAPI Service Management

    The systemctl command is used to start and stop the CMAPI service.

    Operation
    Command

    For additional information on endpoints, see "CMAPI".

    MaxScale Configuration Management

    MaxScale can be configured using several methods. These methods make use of MaxScale's .

    Method
    Benefits

    The procedure on these pages configures MaxScale using MaxCtrl.

    MaxScale Service Management

    The systemctl command is used to start and stop the MaxScale service.

    Operation
    Command

    For additional information, see "".

    Next Step

    Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

    Next: Step 1: Prepare ColumnStore Nodes.

    This page is: Copyright Β© 2025 MariaDB. All rights reserved.

    Start and Configure MariaDB MaxScale

    Test MariaDB MaxScale

    Import Data

    Storage Requirements
  • S3-Compatible Object Storage Requirements

  • Preferred Object Storage Providers: Cloud

  • Preferred Object Storage Providers: Hardware

  • Shared Local Storage Directories

  • Shared Local Storage Options

  • Ubuntu 18.04 LTS (x86_64)
  • Ubuntu 20.04 LTS (x86_64)

  • Seagate Lyve Rack
  • Quantum ActiveScale

  • NFS (Network File System)

    On-premises

    • NFS is a distributed file system.

    • If NFS is used, the storage should be mounted with the sync option to ensure that each node flushes its changes immediately.

    • For on-premises deployments, NFS is the recommended option for the Storage Manager directory, and any S3-compatible storage is the recommended option for data.

    <hostname>-bin

    Enterprise Server 10.5, Enterprise ColumnStore 5, MaxScale 2.5

  • Enterprise Server 10.6, Enterprise ColumnStore 23.02, MaxScale 22.08

  • Step 1

    Prepare ColumnStore Nodes

    Step 2

    Configure Shared Local Storage

    Step 3

    Install MariaDB Enterprise Server

    Step 4

    Start and Configure MariaDB Enterprise Server

    Step 5

    Test MariaDB Enterprise Server

    Step 6

    Install MariaDB MaxScale

    MariaDB Enterprise Server

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    MariaDB MaxScale

    Database proxy that extends the availability, scalability, and security of MariaDB Enterprise Servers

    MariaDB Enterprise ColumnStore

    • Columnar storage engine

    • Highly available

    • Optimized for Online Analytical Processing (OLAP) workloads

    • Scalable query execution

    • provides a REST API for multi-node administration

    Listener

    Listens for client connections to MaxScale then passes them to the router service

    MariaDB Monitor

    Tracks changes in the state of MariaDB Enterprise Servers.

    Read Connection Router

    Routes connections from the listener to any available Enterprise ColumnStore node

    Read/Write Split Router

    Routes read operations from the listener to any available Enterprise ColumnStore node, and routes write operations from the listener to a specific server that MaxScale uses as the primary server

    Server Module

    Connection configuration in MaxScale to an Enterprise ColumnStore node

    MaxScale node

    4+ cores

    4+ GB

    Enterprise ColumnStore node

    4+ cores

    4+ GB

    MaxScale node

    8+ cores

    16+ GB

    Enterprise ColumnStore node

    64+ cores

    128+ GB

    S3-Compatible Object Storage

    The ColumnStore Object Storage topology uses S3-compatible object storage to store data.

    Shared Local Storage

    The ColumnStore Object Storage topology uses shared local storage for the Storage Manager directory to store metadata.

    EBS (Elastic Block Store) Multi-Attach

    AWS

    • EBS is a high-performance block-storage service for AWS (Amazon Web Services).

    • EBS Multi-Attach allows an EBS volume to be attached to multiple instances in AWS. Only clustered file systems, such as GFS2, are supported.

    • For deployments in AWS, EBS Multi-Attach is a recommended option for the Storage Manager directory, and Amazon S3 storage is the recommended option for data.

    EFS (Elastic File System)

    AWS

    • EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services).

    • For deployments in AWS, EFS is a recommended option for the Storage Manager directory, and Amazon S3 storage is the recommended option for data. EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services).

    Filestore

    GCP

    • Filestore is high-performance, fully managed storage for GCP (Google Cloud Platform).

    • For deployments in GCP, Filestore is the recommended option for the Storage Manager directory, and Google Object Storage (S3-compatible) is the recommended option for data.

    GlusterFS

    On-premises

    AWS

    Amazon S3 storage

    EBS Multi-Attach or EFS

    GCP

    Google Object Storage (S3-compatible)

    Filestore

    On-premises

    Any S3-compatible object storage

    NFS

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set system-variables and options. The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set system-variables and options.

    SQL

    Users can set system-variables that support dynamic changes on-the-fly using the SET statement.

    Distribution

    Example Configuration File Path

    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    MariaDB Error Log

    log_error

    <hostname>.err

    MariaDB Enterprise Audit Log

    server_audit_file_path

    server_audit.log

    Slow Query Log

    slow_query_log_file

    <hostname>-slow.log

    General Query Log

    general_log_file

    Start

    sudo systemctl start mariadb-columnstore

    Stop

    sudo systemctl stop mariadb-columnstore

    Restart

    sudo systemctl restart mariadb-columnstore

    Enable during startup

    sudo systemctl enable mariadb-columnstore

    Disable during startup

    sudo systemctl disable mariadb-columnstore

    Status

    sudo systemctl status mariadb-columnstore

    Start

    sudo systemctl start mariadb-columnstore-cmapi

    Stop

    sudo systemctl stop mariadb-columnstore-cmapi

    Restart

    sudo systemctl restart mariadb-columnstore-cmapi

    Enable during startup

    sudo systemctl enable mariadb-columnstore-cmapi

    Disable during startup

    sudo systemctl disable mariadb-columnstore-cmapi

    Status

    sudo systemctl status mariadb-columnstore-cmapi

    MaxCtrl

    Command-line utility to perform administrative tasks through the REST API. See MaxCtrl Commands.

    MaxGUI

    MaxGUI is a graphical utility that can perform administrative tasks through the REST API.

    REST API

    The REST API can be used directly. For example, the curl utility could be used to make REST API calls from the command-line. Many programming languages also have libraries to interact with REST APIs.

    Start

    sudo systemctl start maxscale

    Stop

    sudo systemctl stop maxscale

    Restart

    sudo systemctl restart maxscale

    Enable during startup

    sudo systemctl enable maxscale

    Disable during startup

    sudo systemctl disable maxscale

    Status

    sudo systemctl status maxscale

    S3-compatible object storage
    recommended hardware requirements
    Cloud
    Hardware
    Starting and Stopping MariaDB
    REST API
    Starting and Stopping MariaDB
    • GlusterFS is a distributed file system.

    • GlusterFS supports replication and failover.

    <hostname>.log

    Apr 30 21:54:35 a1ebc96a2519 PrimProc[1004]: 35.668435 |0|0|0| C 28 CAL0000: Error total memory available is less than 3GB.
    ERROR 1815 (HY000): Internal error: System is not ready yet. Please try again.
    https://{server}:{port}/cmapi/{version}/{route}/{command}
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/start \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/shutdown \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/add-node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ curl -k -s -X DELETE https://mcs1:8640/cmapi/0.4.0/cluster/node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/remove-node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    Step 7
    Step 8
    Step 9
    Binary Log
    log_bin

    Step 4: Start and Configure MariaDB Enterprise Server

    Overview

    This page details step 4 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

    This step starts and configures MariaDB Enterprise Server, and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Stop the Enterprise ColumnStore Services

    The installation process might have started some of the ColumnStore services. The services should be stopped prior to making configuration changes.

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise Server service:

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise ColumnStore service:

    1. On each Enterprise ColumnStore node, stop the CMAPI service:

    Configure Enterprise ColumnStore

    On each Enterprise ColumnStore node, configure Enterprise Server.

    Connector
    MariaDB Connector/R2DBC

    Mandatory system variables and options for ColumnStore Object Storage include:

    Example Configuration

    Configure the S3 Storage Manager

    On each Enterprise ColumnStore node, configure S3 Storage Manager to use S3-compatible storage by editing the /etc/columnstore/storagemanager.cnf configuration file:

    The S3-compatible object storage options are configured under [S3]:

    • The bucket option must be set to the name of the bucket that you created in "Create an S3 Bucket".

    • The endpoint option must be set to the endpoint for the S3-compatible object storage.

    • The aws_access_key_id and aws_secret_access_key options must be set to the access key ID and secret access key for the S3-compatible object storage.

    • To use a specific IAM role, you must uncomment and set

    The local cache options are configured under [Cache]:

    • The cache_size option is set to 2 GB by default.

    • The path option is set to /var/lib/columnstore/storagemanager/cache by default.

    Ensure that the specified path has sufficient storage space for the specified cache size.

    Start the Enterprise ColumnStore Services

    1. On each Enterprise ColumnStore node, start and enable the MariaDB Enterprise Server service, so that it starts automatically upon reboot:

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise ColumnStore service:

    After the CMAPI service is installed in the next step, CMAPI will start the Enterprise ColumnStore service as-needed on each node. CMAPI disables the Enterprise ColumnStore service to prevent systemd from automatically starting Enterprise ColumnStore upon reboot.

    1. On each Enterprise ColumnStore node, start and enable the CMAPI service, so that it starts automatically upon reboot:

    For additional information, see "".

    Create User Accounts

    The ColumnStore Object Storage topology requires several user accounts. Each user account should be created on the primary server, so that it is replicated to the replica servers.

    Create the Utility User

    Enterprise ColumnStore requires a mandatory utility user account to perform cross-engine joins and similar operations.

    1. On the primary server, create the user account with the CREATE USER statement:

    1. On the primary server, grant the user account SELECT privileges on all databases with the GRANT statement:

    1. On each Enterprise ColumnStore node, configure the ColumnStore utility user:

    1. On each Enterprise ColumnStore node, set the password:

    For details about how to encrypt the password, see "".

    Passwords should meet your organization's password policies. If your MariaDB Enterprise Server instance has a password validation plugin installed, then the password should also meet the configured requirements.

    Create the Replication User

    ColumnStore Object Storage uses MariaDB Replication to replicate writes between the primary and replica servers. As MaxScale can promote a replica server to become a new primary in the event of node failure, all nodes must have a replication user.

    The action is performed on the primary server.

    Create the replication user and grant it the required privileges:

    1. Use the CREATE USER statement to create replication user.

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect to the primary server from each replica.

    1. Grant the user account the required privileges with the GRANT statement.

    Create MaxScale User

    ColumnStore Object Storage 23.10 uses MariaDB MaxScale 22.08 to load balance between the nodes.

    This action is performed on the primary server.

    1. Use the statement to create the MaxScale user:

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect from the IP address of the MaxScale instance.

    1. Use the statement to grant the privileges required by the router:

    1. Use the statement to grant privileges required by the MariaDB Monitor.

    Configure MariaDB Replication

    On each replica server, configure MariaDB Replication:

    1. Use the CHANGE MASTER TO statement to configure the connection to the primary server:

    1. Start replication using the START REPLICA statement:

    1. Confirm that replication is working using the SHOW REPLICA STATUS statement:

    Ensure that the replica server cannot accept local writes by setting the read_only system variable to ON using the SET GLOBAL statement:

    Initiate the Primary Server with CMAPI

    Initiate the primary server using CMAPI.

    1. Create an API key for the cluster. This API key should be stored securely and kept confidential, because it can be used to add cluster nodes to the multi-node Enterprise ColumnStore deployment.

    For example, to create a random 256-bit API key using openssl rand:

    This document will use the following API key in further examples, but users should create their own:

    1. Use CMAPI to add the primary server to the cluster and set the API key. The new API key needs to be provided as part of the X-API-key HTML header.

    For example, if the primary server's host name is mcs1 and its IP address is 192.0.2.1, use the following node command:

    1. Use CMAPI to check the status of the cluster node:

    Add Replica Servers with CMAPI

    Add the replica servers with CMAPI:

    1. For each replica server, use to add the replica server to the cluster. The previously set API key needs to be provided as part of the X-API-key HTML header.

    For example, if the primary server's host name is mcs1 and the replica server's IP address is 192.0.2.2, use the following node command:

    1. After all replica servers have been added, use CMAPI to confirm that all cluster nodes have been successfully added:

    Configure Linux Security Modules (LSM)

    The specific steps to configure the security module depend on the operating system.

    Configure SELinux (CentOS, RHEL)

    Configure SELinux for Enterprise ColumnStore:

    1. To configure SELinux, you have to install the packages required for audit2allow. On CentOS 7 and RHEL 7, install the following:

    On RHEL 8, install the following:

    1. Allow the system to run under load for a while to generate SELinux audit events.

    2. After the system has taken some load, generate an SELinux policy from the audit events using audit2allow:

    If no audit events were found, this will print the following:

    1. If audit events were found, the new SELinux policy can be loaded using semodule:

    1. Set SELinux to enforcing mode:

    1. Set SELinux to enforcing mode by setting SELINUX=enforcing in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Confirm that SELinux is in enforcing mode:

    Configure AppArmor (Ubuntu)

    For information on how to create a profile, see on Ubuntu.com.

    Configure Firewalls

    The specific steps to configure the firewall service depend on the platform.

    Configure firewalld (CentOS, RHEL)

    Configure firewalld for Enterprise Cluster on CentOS and RHEL:

    1. Check if the firewalld service is running:

    1. If the firewalld service was stopped to perform the installation, start it now:

    For example, if your cluster nodes are in the 192.0.2.0/24 subnet:

    1. Open up the relevant ports using firewall-cmd:

    1. Reload the runtime configuration:

    Configure UFW (Ubuntu)

    Configure UFW for Enterprise ColumnStore on Ubuntu:

    1. Check if the UFW service is running:

    1. If the UFW service was stopped to perform the installation, start it now:

    1. Open up the relevant ports using ufw.

    For example, if your cluster nodes are in the 192.0.2.0/24 subnet in the range 192.0.2.1 - 192.0.2.3:

    1. Reload the runtime configuration:

    Next Step

    Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

    This page was step 4 of 9.

    Next: Step 5: Test MariaDB Enterprise Server.

    This page is: Copyright Β© 2025 MariaDB. All rights reserved.

    Set this system variable to ON.

    Set this option to the file you want to use for the Relay Logs. Setting this option enables relay logging.

    Set this option to the file you want to use to index Relay Log filenames.

    Sets the numeric Server ID for this MariaDB Enterprise Server. The value set on this option must be unique to each node.

    iam_role_name, sts_region, and sts_endpoint
    .
  • To use the IAM role assigned to an EC2 instance, you must uncomment ec2_iam_mode=enabled.

  • character_set_server

    Set this system variable to utf8

    collation_server

    Set this system variable to utf8_general_ci

    columnstore_use_import_for_batchinsert

    Set this system variable to ALWAYS to always use cpimport for LOAD DATA INFILE and INSERT...SELECT statements.

    gtid_strict_mode

    Set this system variable to ON.

    log_bin

    Set this option to the file you want to use for the Binary Log. Setting this option enables binary logging.

    log_bin_index

    Set this option to the file you want to use to track binlog filenames.

    Starting and Stopping MariaDB
    Credentials Management for MariaDB Enterprise ColumnStore
    CREATE USER
    GRANT
    GRANT
    How to create an AppArmor Profile
    $ sudo systemctl stop mariadb
    $ sudo systemctl stop mariadb-columnstore
    $ sudo systemctl stop mariadb-columnstore-cmapi
    [mariadb]
    bind_address                           = 0.0.0.0
    log_error                              = mariadbd.err
    character_set_server                   = utf8
    collation_server                       = utf8_general_ci
    log_bin                                = mariadb-bin
    log_bin_index                          = mariadb-bin.index
    relay_log                              = mariadb-relay
    relay_log_index                        = mariadb-relay.index
    log_slave_updates                      = ON
    gtid_strict_mode                       = ON
    
    # This must be unique on each Enterprise ColumnStore node
    server_id                              = 1
    [ObjectStorage]
    …
    service = S3
    …
    [S3]
    bucket                = your_columnstore_bucket_name
    endpoint              = your_s3_endpoint
    aws_access_key_id     = your_s3_access_key_id
    aws_secret_access_key = your_s3_secret_key
    # iam_role_name       = your_iam_role
    # sts_region          = your_sts_region
    # sts_endpoint        = your_sts_endpoint
    # ec2_iam_mode        = enabled
    
    [Cache]
    cache_size = your_local_cache_size
    path       = your_local_cache_path
    $ sudo systemctl start mariadb
    $ sudo systemctl enable mariadb
    $ sudo systemctl stop mariadb-columnstore
    $ sudo systemctl start mariadb-columnstore-cmapi
    $ sudo systemctl enable mariadb-columnstore-cmapi
    CREATE USER 'util_user'@'127.0.0.1'
    IDENTIFIED BY 'util_user_passwd';
    GRANT SELECT, PROCESS ON *.*
    TO 'util_user'@'127.0.0.1';
    $ sudo mcsSetConfig CrossEngineSupport Host 127.0.0.1
    $ sudo mcsSetConfig CrossEngineSupport Port 3306
    $ sudo mcsSetConfig CrossEngineSupport User util_user
    $ sudo mcsSetConfig CrossEngineSupport Password util_user_passwd
    CREATE USER 'repl'@'192.0.2.%' IDENTIFIED BY 'repl_passwd';
    GRANT REPLICA MONITOR,
       REPLICATION REPLICA,
       REPLICATION REPLICA ADMIN,
       REPLICATION MASTER ADMIN
    ON *.* TO 'repl'@'192.0.2.%';
    CREATE USER 'mxs'@'192.0.2.%'
    IDENTIFIED BY 'mxs_passwd';
    GRANT SHOW DATABASES ON *.* TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.columns_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.db TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.procs_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.proxies_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.roles_mapping TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.tables_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.user TO 'mxs'@'192.0.2.%';
    GRANT BINLOG ADMIN,
       READ_ONLY ADMIN,
       RELOAD,
       REPLICA MONITOR,
       REPLICATION MASTER ADMIN,
       REPLICATION REPLICA ADMIN,
       REPLICATION REPLICA,
       SHOW DATABASES,
       SELECT
    ON *.* TO 'mxs'@'192.0.2.%';
    CHANGE MASTER TO
       MASTER_HOST='192.0.2.1',
       MASTER_USER='repl',
       MASTER_PASSWORD='repl_passwd',
       MASTER_USE_GTID=slave_pos;
    START REPLICA;
    SHOW REPLICA STATUS;
    SET GLOBAL read_only=ON;
    $ openssl rand -hex 32
    
    93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       --data '{"timeout":120, "node": "192.0.2.1"}' \
       | jq .
    {
      "timestamp": "2020-10-28 00:39:14.672142",
      "node_id": "192.0.2.1"
    }
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      }
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       --data '{"timeout":120, "node": "192.0.2.2"}' \
       | jq .
    {
      "timestamp": "2020-10-28 00:42:42.796050",
      "node_id": "192.0.2.2"
    }
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      },
      "192.0.2.2": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "192.0.2.3": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "num_nodes": 3
    }
    $ sudo yum install policycoreutils policycoreutils-python
    $ sudo yum install policycoreutils python3-policycoreutils policycoreutils-python-utils
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    
    Nothing to do
    $ sudo semodule -i mariadb_local.pp
    $ sudo setenforce enforcing
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    Enforcing
    $ sudo systemctl status firewalld
    $ sudo systemctl start firewalld
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="3306" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8600-8630" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8640" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8700" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8800" protocol="tcp"
       accept'
    $ sudo firewall-cmd --reload
    $ sudo ufw status verbose
    $ sudo ufw enable
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 3306 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8600:8630 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8640 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8700 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8800 proto tcp
    $ sudo ufw reload
    log_slave_updates
    relay_log
    relay_log_index
    server_id
    Recommended Storage Options
    CMAPI
    Storage Manager directory
    Recommended Storage Options

    Step 8: Test MariaDB MaxScale

    Overview

    This page details step 8 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

    This step tests MariaDB MaxScale 22.08.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Check Global Configuration

    Use command to view the global MaxScale configuration.

    This action is performed on the MaxScale node:

    Output should align to the global MaxScale configuration in the new configuration file you created.

    Check Server Configuration Use the and commands to view the configured server objects.

    This action is performed on the MaxScale node:

    1. Obtain the full list of servers objects:

    For each server object, view the configuration:

    Output should align to the Server Object configuration you performed.

    Check Monitor Configuration

    Use the and commands to view the configured monitors.

    This action is performed on the MaxScale node:

    1. Obtain the full list of monitors:

    1. For each monitor, view the monitor configuration:

    Output should align to the MariaDB Monitor (mariadbmon) configuration you performed.

    Check Service Configuration

    Use the and commands to view the configured routing services.

    This action is performed on the MaxScale node:

    1. Obtain the full list of routing services:

    1. For each service, view the service configuration:

    Output should align to the or configuration you performed.

    Test Application User

    Applications should use a dedicated user account. The user account must be created on the primary server.

    When users connect to MaxScale, MaxScale authenticates the user connection before routing it to an Enterprise Server node. Enterprise Server authenticates the connection as originating from the IP address of the MaxScale node.

    The application users must have one user account with the host IP address of the application server and a second user account with the host IP address of the MaxScale node.

    The requirement of a duplicate user account can be avoided by enabling the proxy_protocol parameter for MaxScale and the proxy_protocol_networks for Enterprise Server.

    Create a User to Connect from MaxScale

    This action is performed on the primary Enterprise ColumnStore node:

    1. Connect to the primary Enterprise ColumnStore node:

    1. Create the database user account for your MaxScale node:

    Replace 192.0.2.10 with the relevant IP address specification for your MaxScale node.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the database user account for your MaxScale node:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Create a User to Connect from the Application Server

    This action is performed on the primary Enterprise ColumnStore node:

    1. Create the database user account for your application server:

    Replace 192.0.2.11 with the relevant IP address specification for your application server.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the d database user account for your application server:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Test Connection with Application User

    To test the connection, use the MariaDB Client from your application server to connect to an Enterprise ColumnStore node through MaxScale.

    This action is performed on a client connected to the MaxScale node:

    Test Connection with Read Connection Router

    If you configured the Read Connection Router, confirm that MaxScale routes connections to the replica servers.

    On the MaxScale node, use the command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each, use MariaDB Client to connect to the listener port for the Read Connection Router (in the example, 3308):

    Use the application user credentials you created for the --user and --password options.

    1. In each terminal, query the hostname and server_id system variable and option to identify to which you're connected:

    Different terminals should return different values since MaxScale routes the connections to different nodes.

    Since the router was configured with the slave router option, the Read Connection Router only routes connections to replica servers.

    Test Write Queries with Read/Write Split Router

    If you configured the Read/Write Split Router, confirm that MaxScale routes write queries on this router to the primary Enterprise ColumnStore node.

    on the MaxScale node, use the command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each, use MariaDB Client to connect to the listener port for the Read/Write Split Router (in the example, 3307):

    Use the application user credentials you created for the --user and --password options.

    1. In one terminal, create the test table:

    1. In each terminal, issue an insert.md statement to add a row to the example table with the values of the hostname and server_id system variable and option:

    1. In one terminal, issue a SELECT statement to query the results:

    While MaxScale is handling multiple connections from different terminals, it routed all connections to the current primary Enterprise ColumnStore node, which in the example is mcs1#.

    Test Read Queries with Read/Write Split Router

    If you configured the , confirm that MaxScale routes read queries on this router to replica servers.

    1. On the MaxScale node, use the command to view the available listeners and ports:

    1. In a terminal connected to your application server, use MariaDB Client to connect to the listener port for the (in the example, 3307):

    Use the application user credentials you created for the --user and --password options.

    1. Query the hostname and server_id to identify which server MaxScale routed you to.

    1. Resend the query:

    Confirm that MaxScale routes the SELECT statements to different replica servers.

    For more information on different routing criteria, see slave_selection_criteria

    Next Step

    Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

    This page was step 8 of 9.

    Next: Step 9: Import Data

    This page is: Copyright Β© 2025 MariaDB. All rights reserved.

    maxctrl show maxscale
    maxctrl list servers
    maxctrl show server
    maxctrl list monitors
    maxctrl show monitor
    maxctrl list services
    maxctrl show service
    Read Connection Router (readconnroute)
    Read/Write Split Router (readwritesplit)
    maxctrl list listeners
    maxctrl list listeners
    Read/Write Split Router (readwritesplit)
    maxctrl list listeners
    Read/Write Split Router (readwritesplit)
    $ maxctrl show maxscale
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Version      β”‚ 22.08.15                                              β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Commit       β”‚ 3761fa7a52046bc58faad8b5a139116f9e33364c              β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Started At   β”‚ Thu, 05 Aug 2021 20:21:20 GMT                         β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Activated At β”‚ Thu, 05 Aug 2021 20:21:20 GMT                         β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Uptime       β”‚ 868                                                   β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Config Sync  β”‚ null                                                  β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Parameters   β”‚ {                                                     β”‚
    β”‚              β”‚     "admin_auth": true,                               β”‚
    β”‚              β”‚     "admin_enabled": true,                            β”‚
    β”‚              β”‚     "admin_gui": true,                                β”‚
    β”‚              β”‚     "admin_host": "0.0.0.0",                          β”‚
    β”‚              β”‚     "admin_log_auth_failures": true,                  β”‚
    β”‚              β”‚     "admin_pam_readonly_service": null,               β”‚
    β”‚              β”‚     "admin_pam_readwrite_service": null,              β”‚
    β”‚              β”‚     "admin_port": 8989,                               β”‚
    β”‚              β”‚     "admin_secure_gui": false,                        β”‚
    β”‚              β”‚     "admin_ssl_ca_cert": null,                        β”‚
    β”‚              β”‚     "admin_ssl_cert": null,                           β”‚
    β”‚              β”‚     "admin_ssl_key": null,                            β”‚
    β”‚              β”‚     "admin_ssl_version": "MAX",                       β”‚
    β”‚              β”‚     "auth_connect_timeout": "10000ms",                β”‚
    β”‚              β”‚     "auth_read_timeout": "10000ms",                   β”‚
    β”‚              β”‚     "auth_write_timeout": "10000ms",                  β”‚
    β”‚              β”‚     "cachedir": "/var/cache/maxscale",                β”‚
    β”‚              β”‚     "config_sync_cluster": null,                      β”‚
    β”‚              β”‚     "config_sync_interval": "5000ms",                 β”‚
    β”‚              β”‚     "config_sync_password": "*****",                  β”‚
    β”‚              β”‚     "config_sync_timeout": "10000ms",                 β”‚
    β”‚              β”‚     "config_sync_user": null,                         β”‚
    β”‚              β”‚     "connector_plugindir": "/usr/lib64/mysql/plugin", β”‚
    β”‚              β”‚     "datadir": "/var/lib/maxscale",                   β”‚
    β”‚              β”‚     "debug": null,                                    β”‚
    β”‚              β”‚     "dump_last_statements": "never",                  β”‚
    β”‚              β”‚     "execdir": "/usr/bin",                            β”‚
    β”‚              β”‚     "language": "/var/lib/maxscale",                  β”‚
    β”‚              β”‚     "libdir": "/usr/lib64/maxscale",                  β”‚
    β”‚              β”‚     "load_persisted_configs": true,                   β”‚
    β”‚              β”‚     "local_address": null,                            β”‚
    β”‚              β”‚     "log_debug": false,                               β”‚
    β”‚              β”‚     "log_info": false,                                β”‚
    β”‚              β”‚     "log_notice": true,                               β”‚
    β”‚              β”‚     "log_throttling": {                               β”‚
    β”‚              β”‚         "count": 10,                                  β”‚
    β”‚              β”‚         "suppress": 10000,                            β”‚
    β”‚              β”‚         "window": 1000                                β”‚
    β”‚              β”‚     },                                                β”‚
    β”‚              β”‚     "log_warn_super_user": false,                     β”‚
    β”‚              β”‚     "log_warning": true,                              β”‚
    β”‚              β”‚     "logdir": "/var/log/maxscale",                    β”‚
    β”‚              β”‚     "max_auth_errors_until_block": 10,                β”‚
    β”‚              β”‚     "maxlog": true,                                   β”‚
    β”‚              β”‚     "module_configdir": "/etc/maxscale.modules.d",    β”‚
    β”‚              β”‚     "ms_timestamp": false,                            β”‚
    β”‚              β”‚     "passive": false,                                 β”‚
    β”‚              β”‚     "persistdir": "/var/lib/maxscale/maxscale.cnf.d", β”‚
    β”‚              β”‚     "piddir": "/var/run/maxscale",                    β”‚
    β”‚              β”‚     "query_classifier": "qc_sqlite",                  β”‚
    β”‚              β”‚     "query_classifier_args": null,                    β”‚
    β”‚              β”‚     "query_classifier_cache_size": 289073971,         β”‚
    β”‚              β”‚     "query_retries": 1,                               β”‚
    β”‚              β”‚     "query_retry_timeout": "5000ms",                  β”‚
    β”‚              β”‚     "rebalance_period": "0ms",                        β”‚
    β”‚              β”‚     "rebalance_threshold": 20,                        β”‚
    β”‚              β”‚     "rebalance_window": 10,                           β”‚
    β”‚              β”‚     "retain_last_statements": 0,                      β”‚
    β”‚              β”‚     "session_trace": 0,                               β”‚
    β”‚              β”‚     "skip_permission_checks": false,                  β”‚
    β”‚              β”‚     "sql_mode": "default",                            β”‚
    β”‚              β”‚     "syslog": true,                                   β”‚
    β”‚              β”‚     "threads": 1,                                     β”‚
    β”‚              β”‚     "users_refresh_interval": "0ms",                  β”‚
    β”‚              β”‚     "users_refresh_time": "30000ms",                  β”‚
    β”‚              β”‚     "writeq_high_water": 16777216,                    β”‚
    β”‚              β”‚     "writeq_low_water": 8192                          β”‚
    β”‚              β”‚ }                                                     β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ maxctrl list servers
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Server β”‚ Address        β”‚ Port β”‚ Connections β”‚ State           β”‚ GTID   β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ mcs1   β”‚ 192.0.2.1      β”‚ 3306 β”‚ 1           β”‚ Master, Running β”‚ 0-1-25 β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ mcs2   β”‚ 192.0.2.2      β”‚ 3306 β”‚ 1           β”‚ Slave, Running  β”‚ 0-1-25 β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ mcs3   β”‚ 192.0.2.3      β”‚ 3306 β”‚ 1           β”‚ Slave, Running  β”‚ 0-1-25 β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ maxctrl show server mcs1
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Server              β”‚ mcs1                                      β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Address             β”‚ 192.0.2.1                                 β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Port                β”‚ 3306                                      β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ State               β”‚ Master, Running                           β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Version             β”‚ 11.4.5-3-MariaDB-enterprise-log           β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Last Event          β”‚ master_up                                 β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Triggered At        β”‚ Thu, 05 Aug 2021 20:22:26 GMT             β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Services            β”‚ connection_router_service                 β”‚
    β”‚                     β”‚ query_router_service                      β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Monitors            β”‚ columnstore_monitor                       β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Master ID           β”‚ -1                                        β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Node ID             β”‚ 1                                         β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Slave Server IDs    β”‚                                           β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Current Connections β”‚ 1                                         β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Total Connections   β”‚ 1                                         β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Max Connections     β”‚ 1                                         β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Statistics          β”‚ {                                         β”‚
    β”‚                     β”‚     "active_operations": 0,               β”‚
    β”‚                     β”‚     "adaptive_avg_select_time": "0ns",    β”‚
    β”‚                     β”‚     "connection_pool_empty": 0,           β”‚
    β”‚                     β”‚     "connections": 1,                     β”‚
    β”‚                     β”‚     "max_connections": 1,                 β”‚
    β”‚                     β”‚     "max_pool_size": 0,                   β”‚
    β”‚                     β”‚     "persistent_connections": 0,          β”‚
    β”‚                     β”‚     "reused_connections": 0,              β”‚
    β”‚                     β”‚     "routed_packets": 0,                  β”‚
    β”‚                     β”‚     "total_connections": 1                β”‚
    β”‚                     β”‚ }                                         β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Parameters          β”‚ {                                         β”‚
    β”‚                     β”‚     "address": "192.0.2.1",               β”‚
    β”‚                     β”‚     "disk_space_threshold": null,         β”‚
    β”‚                     β”‚     "extra_port": 0,                      β”‚
    β”‚                     β”‚     "monitorpw": null,                    β”‚
    β”‚                     β”‚     "monitoruser": null,                  β”‚
    β”‚                     β”‚     "persistmaxtime": "0ms",              β”‚
    β”‚                     β”‚     "persistpoolmax": 0,                  β”‚
    β”‚                     β”‚     "port": 3306,                         β”‚
    β”‚                     β”‚     "priority": 0,                        β”‚
    β”‚                     β”‚     "proxy_protocol": false,              β”‚
    β”‚                     β”‚     "rank": "primary",                    β”‚
    β”‚                     β”‚     "socket": null,                       β”‚
    β”‚                     β”‚     "ssl": false,                         β”‚
    β”‚                     β”‚     "ssl_ca_cert": null,                  β”‚
    β”‚                     β”‚     "ssl_cert": null,                     β”‚
    β”‚                     β”‚     "ssl_cert_verify_depth": 9,           β”‚
    β”‚                     β”‚     "ssl_cipher": null,                   β”‚
    β”‚                     β”‚     "ssl_key": null,                      β”‚
    β”‚                     β”‚     "ssl_verify_peer_certificate": false, β”‚
    β”‚                     β”‚     "ssl_verify_peer_host": false,        β”‚
    β”‚                     β”‚     "ssl_version": "MAX"                  β”‚
    β”‚                     β”‚ }                                         β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ maxctrl list monitors
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Monitor             β”‚ State   β”‚ Servers          β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ columnstore_monitor β”‚ Running β”‚ mcs1, mcs2, mcs3 β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ maxctrl show monitor columnstore_monitor
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Monitor             β”‚ columnstore_monitor                 β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Module              β”‚ mariadbmon                          β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ State               β”‚ Running                             β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Servers             β”‚ mcs1                                β”‚
    β”‚                     β”‚ mcs2                                β”‚
    β”‚                     β”‚ mcs3                                β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Parameters          β”‚ {                                   β”‚
    β”‚                     β”‚     "backend_connect_attempts": 1,  β”‚
    β”‚                     β”‚     "backend_connect_timeout": 3,   β”‚
    β”‚                     β”‚     "backend_read_timeout": 3,      β”‚
    β”‚                     β”‚     "backend_write_timeout": 3,     β”‚
    β”‚                     β”‚     "disk_space_check_interval": 0, β”‚
    β”‚                     β”‚     "disk_space_threshold": null,   β”‚
    β”‚                     β”‚     "events": "all",                β”‚
    β”‚                     β”‚     "journal_max_age": 28800,       β”‚
    β”‚                     β”‚     "module": "mariadbmon",         β”‚
    β”‚                     β”‚     "monitor_interval": 2000,       β”‚
    β”‚                     β”‚     "password": "*****",            β”‚
    β”‚                     β”‚     "script": null,                 β”‚
    β”‚                     β”‚     "script_timeout": 90,           β”‚
    β”‚                     β”‚     "user": "mxs"                   β”‚
    β”‚                     β”‚ }                                   β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Monitor Diagnostics β”‚ {}                                  β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ maxctrl list services
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Service                   β”‚ Router         β”‚ Connections β”‚ Total Connections β”‚ Servers          β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ connection_router_Service β”‚ readconnroute  β”‚ 0           β”‚ 0                 β”‚ mcs1, mcs2, mcs3 β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ query_router_service      β”‚ readwritesplit β”‚ 0           β”‚ 0                 β”‚ mcs1, mcs2, mcs3 β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ maxctrl show service query_router_service
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Service             β”‚ query_router_service                                        β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Router              β”‚ readwritesplit                                              β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ State               β”‚ Started                                                     β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Started At          β”‚ Sat Aug 28 21:41:16 2021                                    β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Current Connections β”‚ 0                                                           β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Total Connections   β”‚ 0                                                           β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Max Connections     β”‚ 0                                                           β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Cluster             β”‚                                                             β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Servers             β”‚ mcs1                                                        β”‚
    β”‚                     β”‚ mcs2                                                        β”‚
    β”‚                     β”‚ mcs3                                                        β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Services            β”‚                                                             β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Filters             β”‚                                                             β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Parameters          β”‚ {                                                           β”‚
    β”‚                     β”‚     "auth_all_servers": false,                              β”‚
    β”‚                     β”‚     "causal_reads": "false",                                β”‚
    β”‚                     β”‚     "causal_reads_timeout": "10000ms",                      β”‚
    β”‚                     β”‚     "connection_keepalive": "300000ms",                     β”‚
    β”‚                     β”‚     "connection_timeout": "0ms",                            β”‚
    β”‚                     β”‚     "delayed_retry": false,                                 β”‚
    β”‚                     β”‚     "delayed_retry_timeout": "10000ms",                     β”‚
    β”‚                     β”‚     "disable_sescmd_history": false,                        β”‚
    β”‚                     β”‚     "enable_root_user": false,                              β”‚
    β”‚                     β”‚     "idle_session_pool_time": "-1000ms",                    β”‚
    β”‚                     β”‚     "lazy_connect": false,                                  β”‚
    β”‚                     β”‚     "localhost_match_wildcard_host": true,                  β”‚
    β”‚                     β”‚     "log_auth_warnings": true,                              β”‚
    β”‚                     β”‚     "master_accept_reads": false,                           β”‚
    β”‚                     β”‚     "master_failure_mode": "fail_instantly",                β”‚
    β”‚                     β”‚     "master_reconnection": false,                           β”‚
    β”‚                     β”‚     "max_connections": 0,                                   β”‚
    β”‚                     β”‚     "max_sescmd_history": 50,                               β”‚
    β”‚                     β”‚     "max_slave_connections": 255,                           β”‚
    β”‚                     β”‚     "max_slave_replication_lag": "0ms",                     β”‚
    β”‚                     β”‚     "net_write_timeout": "0ms",                             β”‚
    β”‚                     β”‚     "optimistic_trx": false,                                β”‚
    β”‚                     β”‚     "password": "*****",                                    β”‚
    β”‚                     β”‚     "prune_sescmd_history": true,                           β”‚
    β”‚                     β”‚     "rank": "primary",                                      β”‚
    β”‚                     β”‚     "retain_last_statements": -1,                           β”‚
    β”‚                     β”‚     "retry_failed_reads": true,                             β”‚
    β”‚                     β”‚     "reuse_prepared_statements": false,                     β”‚
    β”‚                     β”‚     "router": "readwritesplit",                             β”‚
    β”‚                     β”‚     "session_trace": false,                                 β”‚
    β”‚                     β”‚     "session_track_trx_state": false,                       β”‚
    β”‚                     β”‚     "slave_connections": 255,                               β”‚
    β”‚                     β”‚     "slave_selection_criteria": "LEAST_CURRENT_OPERATIONS", β”‚
    β”‚                     β”‚     "strict_multi_stmt": false,                             β”‚
    β”‚                     β”‚     "strict_sp_calls": false,                               β”‚
    β”‚                     β”‚     "strip_db_esc": true,                                   β”‚
    β”‚                     β”‚     "transaction_replay": false,                            β”‚
    β”‚                     β”‚     "transaction_replay_attempts": 5,                       β”‚
    β”‚                     β”‚     "transaction_replay_max_size": 1073741824,              β”‚
    β”‚                     β”‚     "transaction_replay_retry_on_deadlock": false,          β”‚
    β”‚                     β”‚     "type": "service",                                      β”‚
    β”‚                     β”‚     "use_sql_variables_in": "all",                          β”‚
    β”‚                     β”‚     "user": "mxs",                                          β”‚
    β”‚                     β”‚     "version_string": null                                  β”‚
    β”‚                     β”‚ }                                                           β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ Router Diagnostics  β”‚ {                                                           β”‚
    β”‚                     β”‚     "avg_sescmd_history_length": 0,                         β”‚
    β”‚                     β”‚     "max_sescmd_history_length": 0,                         β”‚
    β”‚                     β”‚     "queries": 0,                                           β”‚
    β”‚                     β”‚     "replayed_transactions": 0,                             β”‚
    β”‚                     β”‚     "ro_transactions": 0,                                   β”‚
    β”‚                     β”‚     "route_all": 0,                                         β”‚
    β”‚                     β”‚     "route_master": 0,                                      β”‚
    β”‚                     β”‚     "route_slave": 0,                                       β”‚
    β”‚                     β”‚     "rw_transactions": 0,                                   β”‚
    β”‚                     β”‚     "server_query_statistics": []                           β”‚
    β”‚                     β”‚ }                                                           β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ sudo mariadb
    CREATE USER 'app_user'@'192.0.2.10' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.10';
    CREATE USER 'app_user'@'192.0.2.11' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.11';
    $ mariadb --host 192.0.2.10 --port 3307
          --user app_user --password
    $ maxctrl list listeners
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Name                       β”‚ Port β”‚ Host β”‚ State   β”‚ Service                   β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ connection_router_listener β”‚ 3308 β”‚ ::   β”‚ Running β”‚ connection_router_service β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ query_router_listener      β”‚ 3307 β”‚ ::   β”‚ Running β”‚ query_router_service      β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ mariadb --host 192.0.2.10 --port 3308 \
          --user app_user --password
    SELECT @@global.hostname, @@global.server_id;
    
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs2 |                  2 |
    +-------------------+--------------------+
    $ maxctrl list listeners
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Name                       β”‚ Port β”‚ Host β”‚ State   β”‚ Service                   β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ connection_router_listener β”‚ 3308 β”‚ ::   β”‚ Running β”‚ connection_router_service β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ query_router_listener      β”‚ 3307 β”‚ ::   β”‚ Running β”‚ query_router_service      β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ mariadb --host 192.0.2.10 --port 3307 \
          --user app_user --password
    CREATE TABLE test.load_balancing_test (
       id INT PRIMARY KEY AUTO_INCREMENT,
       hostname VARCHAR(256),
       server_id INT
    );
    INSERT INTO test.load_balancing_test (hostname, server_id)
    VALUES (@@global.hostname, @@global.server_id);
    SELECT * FROM test.load_balancing_test;
    +----+----------+-----------+
    | id | hostname | server_id |
    +----+----------+-----------+
    |  1 | mcs1     |         1 |
    |  2 | mcs1     |         1 |
    |  3 | mcs1     |         1 |
    +----+----------+-----------+
    $ maxctrl list listeners
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Name                       β”‚ Port β”‚ Host β”‚ State   β”‚ Service                   β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ connection_router_listener β”‚ 3308 β”‚ ::   β”‚ Running β”‚ connection_router_service β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ query_router_listener      β”‚ 3307 β”‚ ::   β”‚ Running β”‚ query_router_service      β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    $ mariadb --host 192.0.2.10 --port 3307 \
          --user app_user --password
    SELECT @@global.hostname, @@global.server_id;
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs2 |                  2 |
    +-------------------+--------------------+
    SELECT @@global.hostname, @@global.server_id;
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs3 |                  3 |
    +-------------------+--------------------+
    enterprise lifecycle
    Cluster Management API (CMAPI)