elasticsearch/docs/internal/GeneralArchitectureGuide.md
2024-05-09 16:58:26 -04:00

6.3 KiB

General Architecture

Transport Actions

Serializations

Settings

Elasticsearch supports cluster-level settings and index-level settings, configurable via node-level file settings (e.g. elasticsearch.yml file), command line arguments and REST APIs.

Declaring a Setting

The Setting class is the building block for Elasticsearch server settings. Each Setting can take multiple Property declarations to define setting characteristics. All setting values first come from the node-local elasticsearch.yml file, if they are set therein, before falling back to the default specified in their Setting declaration. A setting with Property.Dynamic can be updated during runtime, but must be paired with a local volatile variable like this one and registered in the ClusterSettings via a utility like ClusterSettings#initializeAndWatch() to catch and immediately apply dynamic changes. NB that a common dynamic Setting bug is always reading the value directly from Metadata#settings(), which holds the default and dynamically updated values, but not the node-local elasticsearch.yml value. The scope of a Setting must also be declared, such as Property.IndexScope for a setting that applies to indexes, or Property.NodeScope for a cluster-level setting.

ClusterSettings tracks the core Elasticsearch settings. Ultimately the ClusterSettings get loaded via the SettingsModule. Additional settings from the various plugins are collected during node construction and passed into the SettingsModule constructor. The Plugin interface has a getSettings() method via which each plugin can declare additional settings.

Dynamically updating a Setting

Externally, TransportClusterUpdateSettingsAction and TransportUpdateSettingsAction (and the corresponding REST endpoints) allow users to dynamically change cluster and index settings, respectively. Internally, AbstractScopedSettings (parent class of ClusterSettings) has various helper methods to track dynamic changes: it keeps a registry of SettingUpdater consumer lambdas to run updates when settings are changed in the cluster state. The ClusterApplierService sends setting updates through to the AbstractScopedSettings, invoking the consumers registered therein for each updated setting.

Index settings are always persisted. They can only be modified on an existing index, and setting values are persisted as part of the IndexMetadata. Cluster settings, however, can be either persisted or transient depending on how they are tied to Metadata (applied here). Changes to persisted cluster settings will survive a full cluster restart; whereas changes made to transient cluster settings will reset to their default values, or the elasticsearch.yml values, if the cluster state must ever be reloaded from persisted state.

Deprecations

Plugins

(what warrants a plugin?)

(what plugins do we have?)

Testing

(Overview of our testing frameworks. Discuss base test classes.)

Unit Testing

REST Testing

Integration Testing