在本文中,我将向您介紹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