Using Cassandra as a metrics store¶
To start using a CQL store you just have to specify CQL hosts in axon-server.yml:
cql_hosts :
- 192.168.0.1:9042
- 192.168.0.2:9042
...
By default, the AxonOps server automatically creates the necessary keyspace and tables. You can override this behavior by specifying the following field in axon-server.yml:
cql_autocreate_tables : false
cql_keyspace : "axonops"
cql_keyspace_replication : "{ 'class' : 'SimpleStrategy', 'replication_factor' : 1 }"
We recommend setting up at least a 3 nodes cluster with NetworkTopologyStrategy and a replication_factor of 3.
Connecting to encrypted Cassandra metrics store¶
We recommend setting up a Secured Socket Layer connection to Cassandra with the following fields in axon-server.yml:
cql_ssl: true
cql_skip_verify: false
cql_ca_file: '/path/to/ca_cert'
cql_cert_file: '/path/to/cert_file'
cql_key_file: '/path/to/key_file'
Metrics cache recommendations¶
When using Cassandra as a metrics store the AxonOps server can cache metrics data in memory to further improve
performance. This is configured using the cql_metrics_cache_max_items
and cql_metrics_cache_max_size_mb
options
in axon-server.yml. The default values are shown here:
cql_metrics_cache_max_items: 5000000
cql_metrics_cache_max_size_mb: 400
The recommended settings for these options are as follows:
Cassandra Nodes | cql_metrics_cache_max_items | cql_metrics_cache_max_size_mb |
---|---|---|
<10 | 5000000 | 1000 |
<50 | 5000000 | 4000 |
100 | 10000000 | 10000 |
200 | 10000000 | 20000 |
These sizes can be tuned to balance memory use in AxonOps against the read workload on Cassandra.
When tuning these parameters it is recommended to set cql_metrics_cache_max_items
to a high value and limit the
cache size with cql_metrics_cache_max_size_mb
.
Other CQL fields¶
You can also specify the following fields:
cql_proto_version int
cql_batch_size int
cql_page_size int
cql_local_dc string
cql_username string
cql_password string
cql_max_concurrent_reads int
cql_retrypolicy_numretries int
cql_retrypolicy_min string "1s"
cql_retrypolicy_max string "10s"
cql_reconnectionpolicy_maxretries int
cql_reconnectionpolicy_initialinterval string "1s"
cql_reconnectionpolicy_maxinterval string "10s"
cql_metrics_cache_max_size_mb int64 in MB
cql_metrics_cache_max_items int64 in MB
cql_read_consistency string (controls the consistency of read operations, defaults to LOCAL_ONE)
cql_write_consistency string (controls the consistency of write operations, defaults to LOCAL_ONE)
cql_lvl1_compaction_window_size int (used for the table named 'metrics5' when you let axonserver managing the tables automatically)
cql_lvl2_compaction_window_size int (used for the table named 'metrics60' when you let axonserver managing the tables automatically)
cql_lvl3_compaction_window_size int (used for the table named 'metrics720' when you let axonserver managing the tables automatically)
cql_lvl4_compaction_window_size int (used for the table named 'metrics7200' when you let axonserver managing the tables automatically)
cql_lvl5_compaction_window_size int (used for the table named 'metrics86400' when you let axonserver managing the tables automatically)
The CQL for the default tables are the following:
CREATE TABLE IF NOT EXISTS axonops.metrics5 (
orgid text,
metricid int,
time int,
value float,
PRIMARY KEY ((orgid, metricid), time)
) WITH CLUSTERING ORDER BY (time DESC)
AND caching = {'keys': 'ALL', 'rows_per_partition': '256'}
AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'DAYS', 'max_threshold': '32', 'min_threshold': '4'}
AND default_time_to_live = 604800
AND comment = '7 days retention for 5 seconds resolution metrics';
CREATE TABLE IF NOT EXISTS axonops.metrics60 (
orgid text,
metricid int,
time int,
value float,
PRIMARY KEY ((orgid, metricid), time)
) WITH CLUSTERING ORDER BY (time DESC)
AND caching = {'keys': 'ALL', 'rows_per_partition': '256'}
AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'DAYS', 'max_threshold': '32', 'min_threshold': '4'}
AND default_time_to_live = 2592000
AND comment = '30 days retention for 60 seconds resolution metrics';
CREATE TABLE IF NOT EXISTS axonops.metrics720 (
orgid text,
metricid int,
time int,
value float,
PRIMARY KEY ((orgid, metricid), time)
) WITH CLUSTERING ORDER BY (time DESC)
AND caching = {'keys': 'ALL', 'rows_per_partition': '256'}
AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '4', 'compaction_window_unit': 'DAYS', 'max_threshold': '32', 'min_threshold': '4'}
AND default_time_to_live = 5184000
AND comment = '60 days retention for 720 seconds resolution metrics';
CREATE TABLE IF NOT EXISTS axonops.metrics7200 (
orgid text,
metricid int,
time int,
value float,
PRIMARY KEY ((orgid, metricid), time)
) WITH CLUSTERING ORDER BY (time DESC)
AND caching = {'keys': 'ALL', 'rows_per_partition': '256'}
AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '30', 'compaction_window_unit': 'DAYS', 'max_threshold': '32', 'min_threshold': '4'}
AND default_time_to_live = 15552000
AND comment = '180 days retention for 7200 seconds resolution metrics';
CREATE TABLE IF NOT EXISTS axonops.metrics86400 (
orgid text,
metricid int,
time int,
value float,
PRIMARY KEY ((orgid, metricid), time)
) WITH CLUSTERING ORDER BY (time DESC)
AND caching = {'keys': 'ALL', 'rows_per_partition': '365'}
AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '60', 'compaction_window_unit': 'DAYS', 'max_threshold': '32', 'min_threshold': '4'}
AND default_time_to_live = 31536000
AND comment = '365 days retention for 86400 seconds resolution metrics';