在Cassandra中,streaming指的是從遠端節點拷貝sstable中的一段資料的過程。通常用于資料修複或移動的過程。例如如下場景中通常都會有streaming的過程:
- repair
- bootstrap過程
- gossip收到和本節點有關的REMOVED_TOKEN狀态變化
- nodetool裡面會觸發資料移動或修複的指令,例如repair,rebuild,removenode,move
Streaming過程中兩個節點的網絡互動如下圖所示:

這個過程大緻可以分為如下四個階段:
- 建立連接配接
- streaming準備階段
- streaming階段
- 完成
1 建立連接配接
stream的發起節點建立一個StreamSession對象,初始化并調用start()方法。在start裡面會建立一個ConnectionHandler對象,其中包含兩個到遠端節點的連接配接,一個用于後續的發送消息, 一個用于接收消息。之後會通過這兩個連接配接向遠端發送StreamInit消息,通知遠端節點開啟一次streaming,并标明每個連接配接的用途。
遠端收到StreamInit消息後,也會建立自己的StreamSession對象,并将收到StreamInit消息的兩個連接配接和StreamSession關聯起來。連接配接建立完成後,調用onInitializationComplete方法,進入準備階段。
2 準備階段
在準備階段,發起節點首先發送一個PrepareMessage,其中包含目前節點會向遠端節點發送哪些檔案或片段,以及需要對方提供哪些表的哪些range的資料。
遠端節點收到請求後,會根據請求的range查找對應的sstable,然後向發起節點傳回一個PrepareMessage,其中包含要發送哪些sstable的哪些片段,之後遠端節點進入streaming階段。
發起節點收到PrepareMessage後,記錄要接收的sstable片段,然後進入streaming階段。
3 streaming階段
進入streaming階段時,需要發送檔案的節點會調用startStreamingFiles,這個方法裡面會針對要進行streaming的檔案,按順序發送FileMessage。FileMessage由消息頭FileMessageHeader和檔案内容的流組成。當所有檔案發送完成後,StreamTransferTask标記為完成。
接收端将收到的檔案内容寫入sstable。當一個StreamReceiveTask中的所有檔案都接收完成後,将sstable加入到ColumnFamilyStore中。
如果接收過程中發生錯誤,接收端會發送一個SessionFailedMessage給發送端,并關閉StreamSession。
當所有發送和接收任務都完成後,進入完成階段。
4 完成階段
當一個節點完成所有的發送和接收任務後,如果該節點已經收到了CompleteMessage,則會向對方發送CompleteMessage并關閉session;如果還沒有收到CompleteMessage,則會向對方發送CompleteMessage并等待對方傳回。
入群邀約
為了營造一個開放的 Cassandra 技術交流環境,社群建立了微信群公衆号和釘釘群,為廣大使用者提供專業的技術分享及問答,定期開展專家技術直播,歡迎大家加入。
另外阿裡雲提供商業化Cassandra使用,中國站和國際站都支援:
https://www.aliyun.com/product/cds