Thanks Aaron, I appreciate it.
It is my understanding, major compactions are not recommended because it
will essentially create one massive SSTable that will not compact with
any new SSTables for some time. I can see how this might be a
performance concern in the general case, because any read operation
would always require multiple disk reads across multiple SSTables. In
addition, information in the new table will not be purged due to
subsequent tombstones until that table can be compacted. This might
then require regular major compactions to be able to clear that data.
Are there other performance considerations that I need to keep in mind?
However, this might not be as much of an issue in our usecase.
It just so happens, the data in this column family is changed very
infrequently, except for deletes (as of recently, and will now occur
over time). In these case, I don't believe having data spread across
the SSTables will be an issue, as either the data will have a tombstone
(which causes cassandra to stop looking at other SSTables), or that data
will be in one SSTable. So I do not believe I/O will end up being an
issue here.
What may be an issue is cleaning out old data in the SSTable that will
exist after a major compaction. However, this might not require major
compactions to happen nearly as frequently as I've seen recommended
(once every gc_grace period), or at all. With the new design, data
will be deleted from this table after a number of days. Deletes again
the remaining data after a major compaction might not get processed
until the next major compaction, but any deletes against new data should
be deleted normally through minor compactions. In addition, the
remaining data after we are complete the migration should be fairly
small (about 500,000 skinny rows per node, including replicas).
Any other thoughts on this?
-Mike
On 1/6/2013 3:49 PM, aaron morton wrote:
When these rows are deleted, tombstones will be created and stored in more
recent sstables. Upon compaction of sstables, and after gc_grace_period, I
presume cassandra will have removed all traces of that row from disk.
Yes.
When using Size Tiered compaction (the default) tombstones are purged when all
fragments of a row are included in a compaction. So if you have rows which are
written to for A Very Long Time(™) it can take a while for everything to get
purged.
In the normal case though it's not a concern.
However, after deleting such a large amount of information, there is no
guarantee that Cassandra will compact these two tables together, causing the
data to be deleted (right?). Therefore, even after gc_grace_period, a large
amount of space may still be used.
In the normal case this is not really an issue.
In your case things sound a little non normal. If you will have only a few
hundred MB's, or a few GB's, of data level in the CF I would consider running a
major compaction on it.
Major compaction will work on all SSTables and create one big SSTable, this
will ensure all deleted data is deleted. We normally caution agains this as the
one new file is often very big and will not get compacted for a while. However
if you are deleting lots-o-data it may work. (There is also an anti compaction
script around that may be of use.)
Another alternative is to compact some of the older sstables with newer ones
via User Defined Compaction with JMX.
Is there a way, other than a major compaction, to clean up all this old data?
I assume a nodetool scrub will cleanup old tombstones only if that row is not
in another sstable?
I don't think scrub (or upgradesstables) remove tombstones.
Do tombstones take up bloomfilter space after gc_grace_period?
Any row, regardless of the liveness of the columns, takes up bloom filter space
(in -Filter.db).
Once the row is removed it will no longer take up space.
Cheers
-----------------
Aaron Morton
Freelance Cassandra Developer
New Zealand
@aaronmorton
http://www.thelastpickle.com
On 6/01/2013, at 6:44 AM, Mike <mthero...@yahoo.com> wrote:
A couple more questions.
When these rows are deleted, tombstones will be created and stored in more
recent sstables. Upon compaction of sstables, and after gc_grace_period, I
presume cassandra will have removed all traces of that row from disk.
However, after deleting such a large amount of information, there is no
guarantee that Cassandra will compact these two tables together, causing the
data to be deleted (right?). Therefore, even after gc_grace_period, a large
amount of space may still be used.
Is there a way, other than a major compaction, to clean up all this old data?
I assume a nodetool scrub will cleanup old tombstones only if that row is not
in another sstable?
Do tombstones take up bloomfilter space after gc_grace_period?
-Mike
On 1/2/2013 6:41 PM, aaron morton wrote:
1) As one can imagine, the index and bloom filter for this column family is
large. Am I correct to assume that bloom filter and index space will not be
reduced until after gc_grace_period?
Yes.
2) If I would manually run repair across a cluster, is there a process I can
use to safely remove these tombstones before gc_grace period to free this
memory sooner?
There is nothing to specifically purge tombstones.
You can temporarily reduce the gc_grace_seconds and then trigger compaction.
Either by reducing the min_compaction_threshold to 2 and doing a flush. Or by
kicking of a user defined compaction using the JMX interface.
3) Any words of warning when undergoing this?
Make sure you have a good breakfast.
(It's more general advice than Cassandra specific.)
Cheers
-----------------
Aaron Morton
Freelance Cassandra Developer
New Zealand
@aaronmorton
http://www.thelastpickle.com
On 30/12/2012, at 8:51 AM, Mike <mthero...@yahoo.com> wrote:
Hello,
We are undergoing a change to our internal datamodel that will result in the
eventual deletion of over a hundred million rows from a Cassandra column
family. From what I understand, this will result in the generation of
tombstones, which will be cleaned up during compaction, after gc_grace_period
time (default: 10 days).
A couple of questions:
1) As one can imagine, the index and bloom filter for this column family is
large. Am I correct to assume that bloom filter and index space will not be
reduced until after gc_grace_period?
2) If I would manually run repair across a cluster, is there a process I can
use to safely remove these tombstones before gc_grace period to free this
memory sooner?
3) Any words of warning when undergoing this?
We are running Cassandra 1.1.2 on a 6 node cluster and a Replication Factor of
3. We use LOCAL_QUORM consistency for all operations.
Thanks!
-Mike