从Stage角度看cassandra write,stagecassandra
声明
文章发布于CSDN
cassandra concurrent 具体实现
cassandra并发技术文中介绍了java的concurrent实现,这里介绍cassandra如何基于java实现cassandra并发包。
Figure1——cassandra并发实现
cassandra write
cassandra写操作涉及到MutationStage,FlushWriter,MemtablePostFlusher,ReplicateOnWriteStage
MutationStage
- Single
Coordinator:将request同时发给所有replicate节点
Replicate:
1.写数据到commitlog
2. 写数据到MemTable
3. 如果写操作是个delete操作,在commitlog和MemTable中添加墓碑tombstone
4. 如果使用了row caching,需要失效这行的缓存
5. 发送应答request到coordinator
Mutation Stage
Thread1
Thread2:写commit log 和memtable
View/Batch
Figure2 cassandra mutation change(coordinator)
cassandra mutation时序图如上图所示。前面几个都是线程调用和request的”翻译”重点是最后一个类的执行StorageProxy.在#comment1处,cassandra对batch change 和涉及到view更新 与单条的insert操作进行了区分。View是和Table绑定在一起的,所以要确保两者是一起更新的。cassandra通过batch log 来实现。无论write consistency level 是多少,batch log 要确保change写入到了quorum份replicate.
Coordinator:创建batch log,确保quorum份replicate node写入change,客户端的响应仍然是按照write consistency level;将request同时发给所有replicate 节点。
Replicate:完整调用栈见Figure3
FlushWriter&&MemtablePostFlusher
FlushWriter Stage 就是将数据从MemTable flush到SSTable中。有三种事件会导致发生
1. memtable 超过了设定的大小
2. nodetool flush
3. commit log 超过了设定的大小
ColumnFamilyStore.switchMemtable方法将Memtable flush到SSTable中.
public ListenableFuture<CommitLogPosition> switchMemtable()
{
synchronized (data)
{
logFlush();
Flush flush = new Flush(false);
flushExecutor.execute(flush);
ListenableFutureTask<CommitLogPosition> task = ListenableFutureTask.create(flush.postFlush);
postFlushExecutor.submit(task);
return task;
}
}
flushExecutor,postFlushExecutor都JMX相关的ThreadPool,因为需要将相关的metrics通过JMX暴露出去
flushExecutor = new JMXEnabledThreadPoolExecutor(1,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(),new NamedThreadFactory("MemtableFlushWriter"),"internal");
postFlushExecutor = new JMXEnabledThreadPoolExecutor(1,StageManager.KEEPALIVE,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(),new NamedThreadFactory("MemtablePostFlush"),"internal");
参考
https://wiki.apache.org/cassandra/WritePathForUsers
http://www.mikeperham.com/2010/03/13/cassandra-internals-writing/
号外
打算翻译cassandra官方文档,有兴趣的小伙伴可以一起加入
cassandra官方文档翻译
加入cassandra学习群,一起学习