天天看點

深入了解Cassandra中使用者指定的Compaction執行

在本文中,我将向您介紹Apache Cassandra中的一個進階選項,稱為使用者自定義compaction。顧名思義,這是一個告訴Cassandra顯式地為一個或多個表建立compaction任務,然後這個任務被移交給Cassandra運作時,像其他任何compaction一樣執行。

這不是你每天都需要做的操作。但是,當您希望立即回收磁盤空間,而不希望等待正常compaction啟動時,它非常有用。

除非您運作的是Cassandra 3.4版(請參閱

CASSANDRA-10660

),否則需要使用JMX來釋出使用者定義的Compact.如果您以前沒有使用過jmx指令,那麼一開始可能會覺得很難接受。如果您來自非java背景,那麼它很可能是一個完全陌生的概念。别讓那吓跑你!在本文結束時,您将能夠使用名為jmxterm的實用程式執行使用者定義的compact。

為了示範這個過程,我們将使用本地安裝的Cassandra 3.0.9,它加載了movielens資料(請參閱

Movielens項目 ),使用 CDM 實用程式并強制重新整理到磁盤(要了解更多關于CDM的資訊,請參閱此 TLP部落格文章 ):

cdm install movielens
nodetool flush           

需要調用nodetool flush以確定memtables已寫入磁盤,如果我們不這樣做,我們的資料将被放在記憶體中,Compaction是需要資料存在磁盤上。

我注意到movielens keyspace的使用者目錄中的資料檔案:

jhaddad@rustyrazorblade ~/dev/cassandra$ find data/data/movielens/  -name '*Data.db'
data/data/movielens//movies-6728183094d311e68b105dbb96ed2de2/mc-1-big-Data.db
data/data/movielens//ratings_by_movie-6c2408d094d311e68b105dbb96ed2de2/mc-1-big-Data.db
data/data/movielens//ratings_by_user-69a85a7094d311e68b105dbb96ed2de2/mc-1-big-Data.db
data/data/movielens//users-68668ba094d311e68b105dbb96ed2de2/mc-1-big-Data.db           

你可以在上面的輸出中看到,我們有一個“users”目錄,其中有一個資料檔案mc-1-big-data.db。我們稍後需要完整的路徑。

既然磁盤上有SSTables,那麼讓我們使用JMX來調用compact,是以我們首先需要擷取

jmxterm

,這可能是整個過程中最棘手的部分,因為原始jmxterm頁面上的下載下傳連結已斷開。從下載下傳jmxterm的目錄中使用以下指令啟動它:

java -jar jmxterm-1.0-alpha-4-uber.jar           

要檢視所有可用的指令,請使用help指令(輸出被截斷):

$>help
#following commands are available to use:
about    - Display about page
bean     - Display or set current selected MBean.
beans    - List available beans under a domain or all domains
...
open     - Open JMX session or display current connection
option   - Set options for command session
quit     - Terminate console and exit
run      - Invoke an MBean operation
set      - Set value of an MBean attribute           

不過,我們要做的第一件事實際上是連結上Cassandra。标準的jmx端口是7199,你可以将其與主機一起傳遞給open指令:

$>open localhost:7199
#Connection to localhost:7199 is opened           

在連接配接打開的情況下,我們可以在這裡鍵入bean以擷取可以通路的mbean清單。mbean隻是通過jmx控制資料庫的一種方式。我簡化了輸出,以便更容易找到我們要找的東西,CompactionManager:

$>beans -d org.apache.cassandra.db
#domain = org.apache.cassandra.db:
org.apache.cassandra.db:columnfamily=IndexInfo,keyspace=system,type=ColumnFamilies
org.apache.cassandra.db:columnfamily=aggregates,keyspace=system_schema,type=ColumnFamilies
...
org.apache.cassandra.db:type=CompactionManager
...           

現在我們知道了mbean的名稱,可以調用run指令,将mbean方法名forceuserdefinedcompaction和一個或多個檔案路徑作為參數傳遞:

$>run -b org.apache.cassandra.db:type=CompactionManager forceUserDefinedCompaction data/data/movielens//users-68668ba094d311e68b105dbb96ed2de2/mc-1-big-Data.db
#calling operation forceUserDefinedCompaction of mbean org.apache.cassandra.db:type=CompactionManager
#operation returns:
null           

不幸的是,不是很令人高興的輸出。隻有在檢視目錄後,我們才能看到檔案号已從mc-1更改為mc-2:

jhaddad@rustyrazorblade ~/dev/cassandra$ ls data/data/movielens/users-68668ba094d311e68b105dbb96ed2de2/*Data.db
data/data/movielens/users-68668ba094d311e68b105dbb96ed2de2/mc-2-big-Data.db           

Compact多個檔案隻是将它們傳遞給MBean,用逗号分隔。

此時,您應該熟悉使用jmxterm通過JMX啟動使用者定義的compact的過程我建議您在筆記本電腦上嘗試一下,以适應這個過程,并探索其他可用的MBean。如果您更喜歡使用可視化工具而不是指令行工具,請檢視jconsole,它随oracle jdk一起提供,但通常在生産中不太有用。

本文翻譯自:

https://thelastpickle.com/blog/2016/10/18/user-defined-compaction.html

入群邀約

為了營造一個開放的 Cassandra 技術交流環境,社群建立了微信群公衆号和釘釘群,為廣大使用者提供專業的技術分享及問答,定期開展專家技術直播,歡迎大家加入。

阿裡雲為廣大開發者提供雲上Cassandra資源,可用于動手實踐:9.9元可使用三月(限首購)。

直達連結:

https://www.aliyun.com/product/cds
深入了解Cassandra中使用者指定的Compaction執行