Trove Datastore Configuration Templates

In order to support the injecting of dynamic configuration into database configuration files Trove uses the Jinja2 templating engine.

A general guide to writing Jinja2 templates can be found at https://jinja.palletsprojects.com/en/stable/templates/

Location and Searching

The templates used to configure database instances are located under trove/templates with a directory for each database support by Trove.

The Datastore Version is used to determine which set of templates are used. A set of locations are search in a priority order with the most specific location that exists used. The locations search are based upon the Datastore Version name, version and manager as well as the Datastore name.

For example consider the following layout under trove/templates:

mysql/
    mysql-test/
        config.template
    5.5/
        config.template
    config.template

If the Datastore Version for mysql has the name mysql-test then the template file mysql/mysql-test/config.template will be used.

If the Datastore Version for mysql has the name 5.5.62 then Trove will look for mysql/5.5.62, then mysql/5.5, mysql/5 and finally mysql/. Based on the above layout Trove will use mysql/5.5/config.template.

Variables available in the templates

The following variables are exposed to the templates and may be useful in making the template adapt to different database sizes or versions.

datastore

Contains details of the Datastore and Datastore Version and has the following attributes:

name

The Datastore name, for example “mysql”, “postgresql” or “MySQL”. It is used in locating the template to used as described above. The value is set by the operators so may be difficult to rely on in a template.

manager

The Datastore Version manager - this is the type of the datastore and corresponds to the name used in the Trove code for example “mysql” or “postgresql”. See trove/common/constants.py for a list of managers. Like name it is used in locating templates files.

version

This variable is the value of the Datastore Version name. Usually it will be the release version of the database such as “5.7.30”, but can be a string like “mysql-test”. The value is configured by the operator.

semantic_version

A parsed version from the Datastore Version version or name. Trove will first attempt to parse the Datastore Version version, then the Datastore Version name. The datastore.semantic_version makes the components of a version string available as attributes major, minor, patch.

In the following example the major version of a PostgreSQL database is used to select between different configuration options for retaining the binary logs

{% if datastore.semantic_version.major >= 13 %}
wal_keep_size = 80 # in MB = wal_keep_segments x wal_keep_size
{% else %}
wal_keep_segments = 5 # in logfile segments; 0 disables
{% endif %}

flavor

The flavor variable is a dictionary of the resource sizes of the compute server that will be hosting the database. It includes details on the number of VCPUs and the maximum amount of RAM.

The following example configures the thread cache size for a mysql database based on the maximum RAM of the server:

thread_cache_size = {{ (4 * flavor['ram']/512)|int }}

server_id

A unique ID based on a hash of the instance ID and it is useful to use in the configuration of a replication set to distinguish between the primary and secondary instance.

The following example is from a MySQL configuration template:

server_id = {{server_id}}