在本文中,我將向您介紹Apache Cassandra中的一個高級選項,稱爲用戶自定義compaction。顧名思義,這是一個告訴Cassandra顯式地爲一個或多個表建立compaction任務,而後這個任務被移交給Cassandra運行時,像其餘任何compaction同樣執行。html
這不是你天天都須要作的操做。可是,當您但願當即回收磁盤空間,而不但願等待正常compaction啓動時,它很是有用。java
除非您運行的是Cassandra 3.4版(請參閱CASSANDRA-10660),不然須要使用JMX來發布用戶定義的Compact.若是您之前沒有使用過jmx命令,那麼一開始可能會以爲很難接受。若是您來自非java背景,那麼它極可能是一個徹底陌生的概念。別讓那嚇跑你!在本文結束時,您將可以使用名爲jmxterm的實用程序執行用戶定義的compact。node
爲了演示這個過程,咱們將使用本地安裝的Cassandra 3.0.9,它加載了movielens數據(請參閱Movielens項目),使用CDM實用程序並強制刷新到磁盤(要了解更多關於CDM的信息,請參閱此TLP博客文章):git
cdm install movielens nodetool flush
須要調用nodetool flush以確保memtables已寫入磁盤,若是咱們不這樣作,咱們的數據將被放在內存中,Compaction是須要數據存在磁盤上。github
我注意到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。咱們稍後須要完整的路徑。apache
既然磁盤上有SSTables,那麼讓咱們使用JMX來調用compact,所以咱們首先須要獲取jmxterm,這多是整個過程當中最棘手的部分,由於原始jmxterm頁面上的下載連接已斷開。從下載jmxterm的目錄中使用如下命令啓動它:微信
java -jar jmxterm-1.0-alpha-4-uber.jar
要查看全部可用的命令,請使用help命令(輸出被截斷):session
$>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命令:oracle
$>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試用:https://www.aliyun.com/product/cds
》》阿里雲雙11領億元補貼,拼手氣抽iPhone 11 Pro、衛衣等好禮,點此參與:http://t.cn/Ai1hLLJT
閱讀原文 本文爲雲棲社區原創內容,未經容許不得轉載。