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