40

Cassandra原理|深入理解Cassandra中用户指定的Compaction执行

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzU5OTQ1MDEzMA%3D%3D&%3Bmid=2247487148&%3Bidx=1&%3Bsn=7b9b0e40197de9598e62c93f54307560
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

原文链接: https://yq.aliyun.com/articles/725244?spm=a2c4e.11153959.0.0.4fd413788sF5s7

写在最后

为了营造一个开放的Cassandra技术交流环境,社区建立了微信公众号和钉钉群。为广大用户提供专业的技术分享及问答,定期开展专家技术直播,欢迎大家加入。另云Cassandra免费火爆公测中,欢迎试用:

https://www.aliyun.com/product/cds

微信群邀约

为了普惠更多的同学,Cassandra技术社区建立【 Cassandra微信交流群 】微信群由于有100人自由加入限制,欢迎大家加熊倩的微信,注明“C*群”,再将大家拉入群。

fEN3MbY.jpg!web

公众号邀约

32ui6ni.jpg!web

扫码关注


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK