Installation d’une instance standalone MariaDB ColumnStore 1.2.3 sur Ubuntu

Logo

Introduction

Une instance standalone MariaDB ColumnStore 1.2.3 est installée et configurée sur Ubuntu 18 dans cet article.

  • L’installation est réalisée avec un compte non root (user mcs). MariaDB ColumnStore s’exécutera avec le user mcs.
  • Le stockage est interne.
  • La base de données frontale MySQL/MariaDB est installée dans le répertoire /sqlpac/mcs/mysql.
  • Un DBRoot ColumnStore avec un seul disque est créé (DBRoot1) et installé dans le répertoire /sqlpac/mcs/data1.
architecture MariaDB Columnstore Sandbox

Pré-requis

Préparation du user mcs

MariaDB ColumnStore sera installé et s’exécutera avec le user mcs (id: 10010, $HOME : /opt/mcs).

Pour une installation non root :

  • Le répertoire home ($HOME) doit être le répertoire d’installation racine de MariaDB ColumnStore.
  • Le nom du groupe doit avoir le même nom que le nom du user (mcs).
  • Lors de la préparation de l’installation de multiples instances, le user id et le group id doivent être les mêmes sur toutes les machines.
root@vps$ useradd -d /opt/mcs -m -u 10010 -s /bin/bash mcs

Configuration système requise

Augmenter les paramètres "number of opened files" dans le fichier de configuration /etc/security/limits.conf pour le user mcs.

/etc/security/limits.conf
mcs hard nofile 65536
mcs soft nofile 65536

Installation des dépendances de packages

Les packages suivants sont requis :

  • libboost
  • libjemalloc (memory allocator)
  • libsnappy (bibliothèque de compression)

Si ils ne sont pas installés, en tant que root :

root@vps$ apt-get install libboost-all-dev
          
root@vps$ apt-get install libjemalloc1
          
root@vps$ apt-get install libsnappy1v5

MariaDB ColumnStore - Téléchargement et installation

Télécharger MariaDB ColumnStore 1.2.3 depuis le site MariaDB : mariadb-columnstore-1.2.3-1-bionic.amd64.bin.tar.gz.

Avec l’utilisateur mcs, dézipper et extraire l’archive dans le répertoire $HOME.

mcs@vps$ cd $HOME
          
mcs@vps$ gunzip mariadb-columnstore-1.2.3-1-bionic.amd64.bin.tar.gz
          
mcs@vps$ tar xvf mariadb-columnstore-1.2.3-1-bionic.amd64.bin.tar

Ne pas changer la structure du répertoire lors de l’extraction, le répertoire d’installation doit absolument être $HOME/mariadb/columnstore, sinon le setup échoue.

Configuration et installation

Modification des localisations des bases de données

Avant de lancer le moindre script post installation et de construire le système, dans cet article la base de données frontale MySQL et le DBRoot ColumnStore ne sont pas installés dans leurs emplacements par défaut, respectivement $HOME/mariadb/columnstore/mysql/db et $HOME/mariadb/columnstore/data1. Dans un tel cas, des liens symboliques doivent être créés :

mcs@vps$ ln -s /sqlpac/mcs/mysql /opt/mcs/mariadb/columnstore/mysql/db
mcs@vps$ ln -s /sqlpac/mcs/data1 /opt/mcs/mariadb/columnstore/data1

Vérifier que le user mcs est le propriétaire de ces nouveaux emplacements.

post-install

Avec le user mcs, lancer le script post-install.

S’assurer que le script post-install est exécuté avec pour répertoire courant le répertoire $HOME.

mcs@vps$ ./mariadb/columnstore/bin/post-install --installdir=$HOME/mariadb/columnstore

Diverses configurations sont préparées par ce script (liens vers les librairies, répertoires…).

La sortie du script donne les prochaines étapes à réaliser en fonction du contexte.

NOTE: For non-root install, you will need to run the following commands as root user to
      setup the MariaDB ColumnStore System Logging

export COLUMNSTORE_INSTALL_DIR=/opt/mcs/mariadb/columnstore
export LD_LIBRARY_PATH=:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib
/opt/mcs/mariadb/columnstore/bin/syslogSetup.sh --installdir=/opt/mcs/mariadb/columnstore --user=mcs install


The next steps are:

If installing on a pm1 node using non-distributed install

export COLUMNSTORE_INSTALL_DIR=/opt/mcs/mariadb/columnstore
export LD_LIBRARY_PATH=:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib
/opt/mcs/mariadb/columnstore/bin/postConfigure -i /opt/mcs/mariadb/columnstore

If installing on a pm1 node using distributed install

export COLUMNSTORE_INSTALL_DIR=/opt/mcs/mariadb/columnstore
export LD_LIBRARY_PATH=:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib
/opt/mcs/mariadb/columnstore/bin/postConfigure -i /opt/mcs/mariadb/columnstore -d

If installing on a non-pm1 using the non-distributed option:

export COLUMNSTORE_INSTALL_DIR=/opt/mcs/mariadb/columnstore
export LD_LIBRARY_PATH=:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib
/opt/mcs/mariadb/columnstore/bin/columnstore start

syslogSetup.sh

Un seul script doit être exécuté en tant que root : syslogSetup.sh. Ce script configure les fonctionnalités de journalisation dans le répertoire /var/log/mariadb/columnstore. Si ce n’est pas réalisé, les fichiers de log ne seront pas disponibles à des fins de diagnostic (crit.log, warn.log, info.log, debug.log, warn.log…).

root@vps$ export COLUMNSTORE_INSTALL_DIR=/opt/mcs/mariadb/columnstore
root@vps$ export LD_LIBRARY_PATH=:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib

root@vps$ /opt/mcs/mariadb/columnstore/bin/syslogSetup.sh --installdir=/opt/mcs/mariadb/columnstore --user=mcs install
System logging being used: rsyslog

postConfigure

Le système columnstore est alors construit avec le script postConfigure en tant que mcs. Un module de performance pm1 est généré en utilisant une installation non distribuée.

mcs@vps$ export COLUMNSTORE_INSTALL_DIR=/opt/mcs/mariadb/columnstore
mcs@vps$ export LD_LIBRARY_PATH=:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib

mcs@vps$ /opt/mcs/mariadb/columnstore/bin/postConfigure -i /opt/mcs/mariadb/columnstore

Un assistant démarre :

  • Type de serveur système : standalone/unique (single)
  • Nom du système (System name) : mcs1
  • Type de stockage de données : interne (internal)
  • DBRoot IDs assignés au module pm1 : 1
This is the MariaDB ColumnStore System Configuration and Installation tool.
It will Configure the MariaDB ColumnStore System and will perform a Package
Installation of all of the Servers within the System that is being configured.

IMPORTANT: This tool requires to run on the Performance Module #1

Prompting instructions:

        Press 'enter' to accept a value in (), if available or
        Enter one of the options within [], if available, or
        Enter a new value


===== Setup System Server Type Configuration =====

There are 2 options when configuring the System Server Type: single and multi

  'single'  - Single-Server install is used when there will only be 1 server configured
              on the system. It can also be used for production systems, if the plan is
              to stay single-server.

  'multi'   - Multi-Server install is used when you want to configure multiple servers now or
              in the future. With Multi-Server install, you can still configure just 1 server
              now and add on addition servers/modules in the future.

Select the type of System Server install [1=single, 2=multi] (2) > 1

Performing the Single Server Install.

Enter System Name (columnstore-1) > mcs1

===== Setup Storage Configuration =====


----- Setup Performance Module DBRoot Data Storage Mount Configuration -----

There are 2 options when configuring the storage: internal or external

  'internal' -    This is specified when a local disk is used for the DBRoot storage.
                  High Availability Server Failover is not Supported in this mode

  'external' -    This is specified when the DBRoot directories are mounted.
                  High Availability Server Failover is Supported in this mode.

Select the type of Data Storage [1=internal, 2=external] (1) > 1

Enter the list (Nx,Ny,Nz) or range (Nx-Nz) of DBRoot IDs assigned to module 'pm1' (1) >1

Lorsque l’installation est terminée avec succès :

===== Performing Configuration Setup and MariaDB ColumnStore Startup =====

NOTE: Setting 'NumBlocksPct' to 50%
      Setting 'TotalUmMemory' to 25% of total memory.

Running the MariaDB ColumnStore setup scripts

post-mysqld-install Successfully Completed
post-mysql-install Successfully Completed

Starting MariaDB Columnstore Database Platform

Starting MariaDB ColumnStore Database Platform Starting, please wait ..... DONE

System Catalog Successfull Created

MariaDB ColumnStore Install Successfully Completed, System is Active

Enter the following command to define MariaDB ColumnStore Alias Commands

. /opt/mcs/.profile

Enter 'mcsmysql' to access the MariaDB ColumnStore SQL console
Enter 'mcsadmin' to access the MariaDB ColumnStore Admin console

NOTE: The MariaDB ColumnStore Alias Commands are in /etc/profile.d/columnstoreAlias.sh

Variables d’environnement post installation

Après l’installation, le fichier .profile pour le user mcs est mis à jour. Des alias et variables d’environnement très utiles sont définis.

$HOME/.profile
# MariaDB Columnstore Non-Root Environment Variables
export COLUMNSTORE_INSTALL_DIR=/opt/mcs/mariadb/columnstore
export LD_LIBRARY_PATH=:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib:/opt/mcs/mariadb/columnstore/lib:/opt/mcs/mariadb/columnstore/mysql/lib

# MariaDB Columnstore Non-Root Alias Variables
# MariaDB Columnstore Alias Commands
#
alias mcsmysql='/opt/mcs/mariadb/columnstore/mysql/bin/mysql --defaults-extra-file=/opt/mcs/mariadb/columnstore/mysql/my.cnf -u root'
alias ma=/opt/mcs/mariadb/columnstore/bin/mcsadmin
alias mcsadmin=/opt/mcs/mariadb/columnstore/bin/mcsadmin
alias cpimport=/opt/mcs/mariadb/columnstore/bin/cpimport
alias mcshome='cd /opt/mcs/mariadb/columnstore'
alias log='cd /var/log/mariadb/columnstore/'
alias core='cd /var/log/mariadb/columnstore/corefiles'
alias tmsg='tail -f /var/log/messages'
alias tdebug='tail -f /var/log/mariadb/columnstore/debug.log'
alias tinfo='tail -f /var/log/mariadb/columnstore/info.log'
alias terror='tail -f /var/log/mariadb/columnstore/err.log'
alias twarning='tail -f /var/log/mariadb/columnstore/warning.log'
alias tcrit='tail -f /var/log/mariadb/columnstore/crit.log'
alias dbrm='cd /opt/mcs/mariadb/columnstore/data1/systemFiles/dbrm'
alias mcsmodule='cat /opt/mcs/mariadb/columnstore/local/module'

Architecture des process Mariadb ColumnStore

11 process sont lancés dans un module de performance MariaDB ColumnStore, ProcMon (ProcessMonitor) est le processus parent de tous les autres process à l’exception de mysql :

mcs@vps$ ps -fauxwww  | grep 'mcs'

\_ /opt/mcs/mariadb/columnstore/bin/ProcMon
   \_ [ProcMgr]
   \_ /opt/mcs/mariadb/columnstore/bin/controllernode fg
   \_ /opt/mcs/mariadb/columnstore/bin/ServerMonitor
   \_ /opt/mcs/mariadb/columnstore/bin/workernode DBRM_Worker1 fg
   \_ [PrimProc]
   \_ [ExeMgr]
   \_ [WriteEngineServ]
   \_ [DDLProc]
   \_ [DMLProc]

\_ /opt/mcs/mariadb/columnstore/mysql//bin/mysqld --basedir=/opt/mcs/mariadb/columnstore/mysql/ \
            --datadir=/opt/mcs/mariadb/columnstore/mysql/db \
            --plugin-dir=/opt/mcs/mariadb/columnstore/mysql/lib/plugin \
            --log-error=/opt/mcs/mariadb/columnstore/mysql/db/vps.err \
            --pid-file=/opt/mcs/mariadb/columnstore/mysql/db/vps.pid \
            --socket=/opt/mcs/mariadb/columnstore/mysql/lib/mysql/mysql.sock \
            --port=3306

Les process écoutent sur différents ports, ports définis dans le fichier de configuration $HOME/mariadb/columnstore/etc/Columnstore.xml :

mcs@vps$ lsof -i -P -n | grep LISTEN | grep 'mcs'

mysqld    16684  mcs   28u  IPv6 182203      0t0  TCP *:3306 (LISTEN)
controlle 16789  mcs    5u  IPv4 183378      0t0  TCP *:8616 (LISTEN)
ServerMon 16810  mcs    3u  IPv4 183939      0t0  TCP *:8622 (LISTEN)
workernod 16836  mcs    9u  IPv4 183420      0t0  TCP *:8700 (LISTEN)
PrimProc  16895  mcs   10u  IPv4 183479      0t0  TCP *:8620 (LISTEN)
ExeMgr    16979  mcs   11u  IPv4 183577      0t0  TCP *:8601 (LISTEN)
WriteEngi 17039  mcs    9u  IPv4 183653      0t0  TCP *:8630 (LISTEN)
DDLProc   17079  mcs   10u  IPv4 183747      0t0  TCP *:8612 (LISTEN)
DMLProc   17138  mcs   10u  IPv4 183871      0t0  TCP *:8614 (LISTEN)
ProcMon   24558  mcs    4u  IPv4 150911      0t0  TCP *:8800 (LISTEN)
ProcMon   24558  mcs   11u  IPv4 150920      0t0  TCP *:8604 (LISTEN)
ProcMgr   24680  mcs    9u  IPv4 151557      0t0  TCP *:8603 (LISTEN)
ProcMgr   24680  mcs   10u  IPv4 151555      0t0  TCP *:8606 (LISTEN)

Un schéma est plus explicite :

Processes architecture

Utiliser la console mcsadmin pour gérer MariaDB Columnstore.

Lister les process - getProcessStatus

mcs@vps$ mcsadmin getProcessStatus
getprocessstatus   Thu Dec 12 13:50:04 2019

MariaDB ColumnStore Process statuses

Process             Module    Status            Last Status Change        Process ID
------------------  ------    ---------------   ------------------------  ----------
ProcessMonitor      pm1       ACTIVE            Fri Nov 15 13:37:48 2019       22045
ProcessManager      pm1       ACTIVE            Fri Nov 15 13:37:54 2019       22171
DBRMControllerNode  pm1       ACTIVE            Fri Nov 15 13:38:00 2019       22581
ServerMonitor       pm1       ACTIVE            Fri Nov 15 13:38:02 2019       22604
DBRMWorkerNode      pm1       ACTIVE            Fri Nov 15 13:38:03 2019       22656
PrimProc            pm1       ACTIVE            Fri Nov 15 13:38:06 2019       22694
ExeMgr              pm1       ACTIVE            Fri Nov 15 13:38:10 2019       22771
WriteEngineServer   pm1       ACTIVE            Fri Nov 15 13:38:14 2019       22853
DDLProc             pm1       ACTIVE            Fri Nov 15 13:38:19 2019       22916
DMLProc             pm1       ACTIVE            Fri Nov 15 13:38:23 2019       22981
mysqld              pm1       ACTIVE            Fri Nov 15 13:38:00 2019       22470

Démarrer / Stopper le système ColumnStore

Utiliser mcsadmin pour démarrer et arrêter le système de base de données ColumnStore :

mcs@vps$ mcsadmin startSystem
startsystem   Thu Dec 12 14:32:13 2019

startSystem command, 'columnstore' service is down, sending command to
start the 'columnstore' service on all modules

   System being started, please wait...........
   Successful start of System
mcs@vps$ mcsadmin shutdownSystem y
shutdownsystem   Thu Dec 12 14:38:02 2019

This command stops the processing of applications on all Modules within the MariaDB ColumnStore System

   Checking for active transactions
   Stopping System...
   Successful stop of System

   Shutting Down System...
   Successful shutdown of System

L’option shutdownSystem arrête l’intégralité du système. Avec l’option stopSystem, tous les process sont arrêtés sauf ProcessMonitor et ProcessManager.

Configuration, utilisation des ressources

mcsadmin donne des informations utiles sur la configuration (DBRoot…), l’utilisation des ressources (CPU, mémoire…) :

mcs@vps$ mcsadmin getStorageConfig
getstorageconfig   Thu Dec 12 15:17:49 2019

System Storage Configuration

Performance Module (DBRoot) Storage Type = internal
System Assigned DBRoot Count = 1
DBRoot IDs assigned to 'pm1' = 1
mcs@vps$ mcsadmin getResourceUsage
getsystemresourceusage   Thu Dec 12 15:18:23 2019

System Resource Usage per Module

Module 'pm1' Resource Usage

CPU: 3% Usage
Mem:  7973380k total, 657728k used, 584824k cache, 8% Usage
Swap: 0 k total, 0k used, 0% Usage
Top CPU Process Users: f2b/server 6%
Top Memory Process Users: mysqld 2%, systemd-journald 1%, mono 1%, DMLProc 1%, workernode 1%
Disk Usage: / 78%
mcs@vps$ mcsadmin getModuleMemory pm1
getmodulememory   Thu Dec 12 15:19:32 2019

Module Memory Usage (in K bytes)

Module  Mem Total  Mem Used cache    Mem Usage % Swap Total Swap Used Swap Usage %
------  ---------  -------  -------  ----------  ---------- --------- -----------
pm1     7973380    658000    584840       8        0           0               0

Pour la liste complète des options disponibles avec la console mcsadmin : utiliser mcsadmin help.

La base de données frontale MySQL/MariaDB (Front End)

mcsmysql

Localement, utiliser l’alias mcsmysql pour se connecter à la base de données. MariaDB 10.3.13 est embarqué avec MariaDB ColumnStore 1.2.3.

mcs@vps$ mcsmysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.3.13-MariaDB-log Columnstore 1.2.3-1

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)]>

Moteurs de stockage (Storage engines), plugins, variables

Le moteur de stockage ColumnStore est installé et InnoDB est le moteur de stockage par défaut :

MariaDB [(none)]> show storage engines;
+--------------------+---------+----------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------+--------------+------+------------+
| Columnstore        | YES     | Columnstore storage engine             | YES          | NO   | NO         |
| ...                |         |                                        |              |      |            |
| MyISAM             | YES     | Non-transactional engine with good     | NO           | NO   | NO         |
|                    |         | performance and small data footprint   |              |      |            |
| ...                |         |                                        |              |      |            |
| InnoDB             | DEFAULT | Supports transactions,                 | YES          | YES  | YES        |
|                    |         | row-level locking, foreign keys        |              |      |            |
|                    |         | and encryption for tables              |              |      |            |
| ...                |         |                                        |              |      |            |
| Aria               | YES     | Crash-safe tables with MyISAM          | NO           | NO   | NO         |
|                    |         | heritage                               |              |      |            |
| ...                |         |                                        |              |      |            |
+--------------------+---------+----------------------------------------+--------------+------+------------+

Plusieurs plugins relatifs au moteur de stockage ColumnStore sont activés :

MariaDB [(none)]> show plugins;
+-------------------------------+----------+--------------------+---------------------------+---------+
| Name                          | Status   | Type               | Library                   | License |
+-------------------------------+----------+--------------------+---------------------------+---------+
| Columnstore                   | ACTIVE   | STORAGE ENGINE     | libcalmysql.so            | GPL     |
| InfiniDB                      | ACTIVE   | STORAGE ENGINE     | libcalmysql.so            | GPL     |
| COLUMNSTORE_TABLES            | ACTIVE   | INFORMATION SCHEMA | is_columnstore_tables.so  | GPL     |
| COLUMNSTORE_COLUMNS           | ACTIVE   | INFORMATION SCHEMA | is_columnstore_columns.so | GPL     |
| COLUMNSTORE_EXTENTS           | ACTIVE   | INFORMATION SCHEMA | is_columnstore_extents.so | GPL     |
| COLUMNSTORE_FILES             | ACTIVE   | INFORMATION SCHEMA | is_columnstore_files.so   | GPL     |

Historiquement, le moteur de stockage ColumnStore a d’abord été développé par la société Calpont, société qui n’existe plus, et il s’appelait InfiniDB. MariaDB ColumnStore est un "fork" de Calpont/InfiniDB. C’est pourquoi des librairies s’appellent par exemple libcalmysql.so, cal pour Calpont.

Les variables relatives au moteur de stockage ColumnStore sont nommées infinidb% :

MariaDB [(none)]> show variables like 'infinidb%';
+---------------------------------------------+-------+
| Variable_name                               | Value |
+---------------------------------------------+-------+
| infinidb_compression_type                   | 2     |
| infinidb_decimal_scale                      | 8     |
| infinidb_diskjoin_bucketsize                | 100   |
| infinidb_diskjoin_largesidelimit            | 0     |
| infinidb_diskjoin_smallsidelimit            | 0     |
| infinidb_double_for_decimal_math            | OFF   |
| infinidb_import_for_batchinsert_delimiter   | 7     |
| infinidb_import_for_batchinsert_enclosed_by | 17    |
| infinidb_local_query                        | 0     |
| infinidb_ordered_only                       | OFF   |
| infinidb_string_scan_threshold              | 10    |
| infinidb_stringtable_threshold              | 20    |
| infinidb_um_mem_limit                       | 0     |
| infinidb_use_decimal_scale                  | OFF   |
| infinidb_use_import_for_batchinsert         | ON    |
| infinidb_varbin_always_hex                  | OFF   |
| infinidb_vtable_mode                        | 1     |
+---------------------------------------------+-------+

Par défaut, la compression est définie à 2 (infinidb_compression_type : 2), compression active.

Configuration cliente

ColumnStore utilise une base de données dédiée appelée infinidb_vtable pour la création de toutes les tables temporaires utilisées dans le traitement des requêtes impliquant des tables ColumnStore. La permission "CREATE TEMPORARY TABLES" doit être donnée à tous les comptes utilisateurs dans la base infinidb_vtable.

MariaDB [(none)]> create user flightsdbo@'%' identified by '************';

MariaDB [(none)]> grant create temporary tables on infinidb_vtable.* to flightsdbo;

MariaDB [(none)]> flush privileges;

Lorsque la permission n’est pas donnée, une erreur se produit lors du traitement des requêtes :

ERROR 1044 (42000): Access denied for user 'flightsdbo'@'%' to database 'infinidb_vtable'

Création d’une table ColumnStore

Pour créér une table ColumnStore, utiliser simplement l’option engine=columnstore dans la commande CREATE TABLE.

MariaDB [(none)]> use flights;

MariaDB [(flights)]>

create table airlines (
    iata_code char(2),
    airline varchar(30)
) engine=columnstore default character set=utf8;

Chargement des données avec cpimport

cpimport est l’utilitaire pour le chargement en masse de données à partir de fichiers plats.

Exemple : chargement des aéroports dans la table airports (base de données flights) à partir du fichier airports.csv.

mcs@vps$ cpimport  -m 2 -s ',' -E '"' flights airports -l $SCHEMA_DIR/airports.csv

2019-11-18 12:36:14 (25992) INFO : Running distributed import (mode 2) on all PMs...
2019-11-18 12:36:16 (25992) INFO : For table flights.airports: 342 rows processed and 342 rows inserted.
2019-11-18 12:36:16 (25992) INFO : Bulk load completed, total run time : 2.11828 seconds

La base de données flights

Une base de données de démo est disponible : Mariadb ColumnStore Flights Demo Database.

Dans cette base de données de démo, 3 tables : airlines, airports et flights. Tous les vols intérieurs des États Unis pour l’année 2018 y sont stockés.

/opt/mcs/flights/data/2018-03.csv
2019-11-18 12:01:07 (2547) INFO : Running distributed import (mode 2) on all PMs...
2019-11-18 12:01:10 (2547) INFO : For table flights.flights: 665810 rows processed and 665810 rows inserted.
2019-11-18 12:01:10 (2547) INFO : Bulk load completed, total run time : 3.24067 seconds
/opt/mcs/flights/data/2018-04.csv
2019-11-18 12:01:11 (2674) INFO : Running distributed import (mode 2) on all PMs...
2019-11-18 12:01:15 (2674) INFO : For table flights.flights: 649023 rows processed and 649023 rows inserted.
2019-11-18 12:01:15 (2674) INFO : Bulk load completed, total run time : 4.22641 seconds

La variable infinidb_vtable_mode

Une variable importante : infinidb_vtable_mode. Ce paramètre peut être défini au niveau serveur ou au niveau de la session.

MariaDB [(none)]> show variables like 'infinidb_vtable_mode%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| infinidb_vtable_mode | 1     |
+----------------------+-------+
ValeurComportement
0 Des clauses WHERE peuvent être traitées par ColumnStore, mais les jointures sont traitées dans leur intégralité par mysqld avec le mécanisme de jointure boucles imriquées (nested-loop).
1 Par défaut : la syntaxe de la requête est évaluée par ColumnStore pour compatibilité lors d’une exécution distribuée et les requêtes incompatibles sont rejetées.
2 Mode Auto-switch : ColumnStore essaie de traiter la requête en interne, si il ne peut pas la requête bascule automatiquement en mode ligne à ligne.

La valeur nécessaire va dépendre du mode de requêtage de l’application cible.

Informations méta-données ColumnStore

Consommation en espace

Dans la base de données columnstore_info, la procédure stockée total_usage renvoie l’espace utilisé dans le système ColumnStore :

MariaDB [(none)]> call columnstore_info.total_usage();

+-----------------+------------------+
| TOTAL_DATA_SIZE | TOTAL_DISK_USAGE |
+-----------------+------------------+
| 701.76 MB       | 764.35 MB        |
+-----------------+------------------+

Utiliser la procédure stockée columnstore_info.table_usage() pour afficher l’espace utilisé par les tables ColumnStore.

MariaDB [(none)]> call columnstore_info.table_usage(null,null);
+--------------+------------+-----------------+-----------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | DATA_DISK_USAGE | DICT_DATA_USAGE | TOTAL_USAGE |
+--------------+------------+-----------------+-----------------+-------------+
| flights      | airlines   | 2.52 MB         | 2.01 MB         | 4.52 MB     |
| flights      | airports   | 9.55 MB         | 6.02 MB         | 15.58 MB    |
| flights      | flights    | 744.25 MB       | 0.00 Bytes      | 744.25 MB   |
+--------------+------------+-----------------+-----------------+-------------+

MariaDB [(none)]> call columnstore_info.table_usage('flights','flights');
+--------------+------------+-----------------+-----------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | DATA_DISK_USAGE | DICT_DATA_USAGE | TOTAL_USAGE |
+--------------+------------+-----------------+-----------------+-------------+
| flights      | flights    | 744.25 MB       | 0.00 Bytes      | 744.25 MB   |
+--------------+------------+-----------------+-----------------+-------------+

Taux de compression

Le taux de compression moyen est calculé avec la procédure stockée columnstore_info.compression_ratio.

MariaDB [(none)]> call columnstore_info.compression_ratio();
+-------------------+
| COMPRESSION_RATIO |
+-------------------+
| 2.7716:1          |
+-------------------+

INFORMATION_SCHEMA

MariaDB ColumnStore implémente quatre tables "Information Schema" qui exposent les informations sur les tables, colonnes et leur stockage :

  • COLUMNSTORE_TABLES
  • COLUMNSTORE_COLUMNS
  • COLUMNSTORE_EXTENTS
  • COLUMNSTORE_FILES

Les procédures stockées columnstore_info.total_usage(), columnstore_info.table_usage(), columnstore_info.compression_ratio() reposent sur ces tables d’information.

MariaDB [information_schema]> select * from columnstore_tables;
+--------------+------------+-----------+---------------+--------------+---------------+
| TABLE_SCHEMA | TABLE_NAME | OBJECT_ID | CREATION_DATE | COLUMN_COUNT | AUTOINCREMENT |
+--------------+------------+-----------+---------------+--------------+---------------+
| flights      | airlines   |      3000 | 2019-11-18    |            2 |          NULL |
| flights      | airports   |      3004 | 2019-11-18    |            7 |          NULL |
| flights      | flights    |      3015 | 2019-11-18    |           32 |          NULL |
+--------------+------------+-----------+---------------+--------------+---------------+

Pour trouver où est stockée une colonne, ses propriétés et sa taille, par exemple la colonne year dans la table flights :

MariaDB [information_schema]>
SELECT 
       b.table_name as "Table",
       b.column_name as "Column",
       a.filename,
       a.file_size,
       a.compressed_data_size,
       c.min_value as "Min",
       c.max_value as "Max"
FROM COLUMNSTORE_FILES a, 
     COLUMNSTORE_COLUMNS b,
     COLUMNSTORE_EXTENTS c
WHERE a.object_id = b.object_id
  AND b.object_id = c.object_id
  AND b.COLUMN_NAME='year'
  AND b.table_name='flights'

+-----------+--------+----------------------------------------------------------------------------------------+
| Table     | Column | filename                                                                               |
+-----------+--------+----------------------------------------------------------------------------------------+
| flights   | year   | /opt/mcs/mariadb/columnstore/data1/000.dir/000.dir/012.dir/136.dir/000.dir/FILE001.cdf | 
+-----------+--------+----------------------------------------------------------------------------------------+
| file_size | compressed_data_size | Min     | Max    |
+-----------+----------------------+---------+--------+
|  16785408 |               860160 |  2015   |  2017  |
+-----------+----------------------+---------+--------+

Les valeurs min et max sont des informations importantes lorsque le moteur ColumnStore exécute les requêtes, ces valeurs gouvernent l’élimination des partitions.

Conclusion

L’installation d’un systèmes MariaDB ColumnStore standalone est assez simple et adéquate pour démarrer et tester avant de planifier des architectures avec de multiples modules de performance.

Premiers tests réalisés avec des requêtes analytiques : les performances sont très bonnes. Mais il y a un gros inconvénient : impossible de créér des contraintes d’unicité pour renforcer la qualité des données. Si des lignes en doubles sont insérées par erreur, les tuples en double doivent être supprimés manuellement.

Un autre inconvénient (pour l’heure actuelle), l’alimentation n’est vraiment efficace qu’en utilisant cpimport. Comme la plupart des systèmes stockage en colonnes, les mises à jour atomiques au fil de l’eau (INSERT, UPDATE, DELETE) ne sont pas optimales avec MariaDB ColumnStore en performances et en stockage. C’est probablement la raison pour laquelle la réplication n’est pas (encore) implémentée et supportée.