Description

Leveled Compaction Strategy (LCS) causes load increase, especially when running on Hard Disk Drive (HDD). This is the default compacting strategy on builds older than 2016-12-08.

Symptoms

With the increase of usage, Cassandra is no longer able to keep up with the compaction. As a result, you may be slowly running out of disk space for analytics.

Solution

Try the method described in Contrail Analytics DB data purge

If that does not help, and you are running a build older than 2016-12-08, change the compacting strategy manually, as you are affected by the performance limitation described in LP1648252 .

Use the following procedure to change the compaction strategy for the analytics tables in Cassandra. The procedure uses 2 files:
  • cql-truncate-table-analytics
  • cql-alter-compaction-strategy-analytics
  1. Run service supervisor-analytics stop on all nodes

  2. Truncate analytics table and alter compaction strategy

        a. cqlsh <1st-database-node-ip> -f cql-truncate-table-analytics
        b. nodetool status , should show truncate command has cleared the data - data in MB rather than GB
        c. cqlsh <1st-database-node-ip> -f cql-alter-compaction-strategy-analytics
        d. cqlsh <1st-database-node-ip> to verify that the compaction strategy is changed
           >>> describe keyspace "ContrailAnalyticsCql"
           should show new compaction strategy
Note: Steps 3 and 4 are required only if you are changing concurrent_compactors
  1. Change concurrent_compactors to 4 in /etc/cassandra/cassandra.yaml on all nodes

  2. Rolling restart of cassandra

    On each node serially:
        a. nodetool drain
        b. service contrail-database restart
        c. nodetool status to verify that it has joined the cluster
  3. service supervisor-analytics start on all nodes

Files used in fix

Create the following files to be used in the fix provided above.

cql-truncate-table-analytics:

truncate table "ContrailAnalyticsCql".flowrecordtable;
truncate table "ContrailAnalyticsCql".objectvaluetable;
truncate table "ContrailAnalyticsCql".messagetabletimestamp;
truncate table "ContrailAnalyticsCql".statstablebyu64tagv3;
truncate table "ContrailAnalyticsCql".systemobjecttable;
truncate table "ContrailAnalyticsCql".objecttable;
truncate table "ContrailAnalyticsCql".messagetable;
truncate table "ContrailAnalyticsCql".flowtablesvnsipver2;
truncate table "ContrailAnalyticsCql".flowtablevrouterver2;
truncate table "ContrailAnalyticsCql".messagetablemessagetype;
truncate table "ContrailAnalyticsCql".messagetablecategory;
truncate table "ContrailAnalyticsCql".messagetablesource;
truncate table "ContrailAnalyticsCql".flowtableprotdpver2;
truncate table "ContrailAnalyticsCql".statstablebyu64u64tagv3;
truncate table "ContrailAnalyticsCql".statstablebystrtagv3;
truncate table "ContrailAnalyticsCql".messagetablemoduleid;
truncate table "ContrailAnalyticsCql".statstablebydbltagv3;
truncate table "ContrailAnalyticsCql".messagetablekeyword;
truncate table "ContrailAnalyticsCql".statstablebyu64strtagv3;
truncate table "ContrailAnalyticsCql".statstablebystrstrtagv3;
truncate table "ContrailAnalyticsCql".statstablebystru64tagv3;
truncate table "ContrailAnalyticsCql".flowtabledvndipver2;
truncate table "ContrailAnalyticsCql".flowtableprotspver2;


cql-alter-compaction-strategy-analytics:

alter table "ContrailAnalyticsCql".flowrecordtable WITH compaction = {'class': 'org.apache.cassandra.db.compaction.DateTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".objectvaluetable WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".messagetabletimestamp WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".statstablebyu64tagv3 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".systemobjecttable WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".objecttable WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".messagetable WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".flowtablesvnsipver2 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.DateTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".flowtablevrouterver2 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.DateTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".messagetablemessagetype WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".messagetablecategory WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".messagetablesource WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".flowtableprotdpver2 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.DateTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".statstablebyu64u64tagv3 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".statstablebystrtagv3 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".messagetablemoduleid WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".statstablebydbltagv3 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".messagetablekeyword WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".statstablebyu64strtagv3 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".statstablebystrstrtagv3 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".statstablebystru64tagv3 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".flowtabledvndipver2 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.DateTieredCompactionStrategy'};
alter table "ContrailAnalyticsCql".flowtableprotspver2 WITH compaction = {'class': 'org.apache.cassandra.db.compaction.DateTieredCompactionStrategy'};

Finishing step & cleanup

According to the Cassandra documentation, you should set read repair to 0 when using DateTieredCompactionStrategy :

"The compaction strategy DateTieredCompactionStrategy precludes using read repair, because of the way timestamps are checked for DTCS compaction.
In this case, you must set read_repair_chance to zero. For other compaction strategies, read repair should be enabled with a read_repair_chance value of 0.2 being typical." So be sure to add the following:

alter table "ContrailAnalyticsCql".flowrecordtable WITH read_repair_chance = 0.0;
alter table "ContrailAnalyticsCql".flowtablesvnsipver2 WITH read_repair_chance = 0.0;
alter table "ContrailAnalyticsCql".flowtablevrouterver2 WITH read_repair_chance = 0.0;
alter table "ContrailAnalyticsCql".flowtableprotdpver2 WITH read_repair_chance = 0.0;
alter table "ContrailAnalyticsCql".flowtabledvndipver2 WITH read_repair_chance = 0.0;
alter table "ContrailAnalyticsCql".flowtableprotspver2 WITH read_repair_chance = 0.0;


Truncate command in the procedure will create snapshot directories. To clean that data, use " nodetool clearsnapshot"  on each node.