你好,朋友,很高兴能向你介绍Cassandra集群快速入门的内容,这是一篇偏向实战类型的博客。相信阅读完以后将会对你在实际业务中操作NoSQL有所帮助。在博文中我将向你展示Cassandra安装配置,启动服务,动态增删机器节点,CQL使用,常用运维工具以及如何设置 Cassandra 访问密码等内容。假如你对Cassandra还不是非常了解,我非常欢迎,也非常建议你阅读我写的第一篇博客《Cassandra源码解析》,跳转地址如下:
http://blog.csdn.net/hellohellohhhhh/article/details/78410379
这篇博客写的非常得精彩,内容也非常详实,相信你阅读完以后将会在短时间内掌握Cassandra项目架构最精华的内容,对Cassandra有一个很深层次的了解。在这篇博客结束以后,我将推出我关于Cassandra系列的第三篇博客《Cassandra CQL基于官方文档的实战》,我将带你了解Cassandra使用过程中最核心的内容CQL,内容也很精彩,敬请期待。好,接下来我们就直接进入正题吧。
在开始实验之前,我这里准备了两台机器,第一台机器ip地址是192.168.30.101;第二台机器ip地址是192.168.30.170;我将101的这台设置为种子节点,170的这台设置为非种子节点。我当前使用的Cassandra是官网最新apache-cassandra-3.11.1版本。
第一步:安装JDK8.0以上的JDK版本,配置好相关的环境变量。8.0以下的JDK将无法正常启动Cassandra服务,造成不必要的麻烦。
第二步:安装python2.7版本用于启动cqlsh的shell命令
第三步 : 在Cassandra官网上下载最新的Cassandra版本,本文使用的是apache-cassandra-3.11.1,解压到你想要的目录。在环境变量中设置CASSANDRA_HOME为你的Cassandra安装目录。
第四步:修改cassandra.yaml文件中的配置参数。
首先我将根据官方文档,向你介绍conf目录下cassandra.yaml这个配置文件中几个重要的参数,无论是搭建集群环境,还是未来使用cqlsh的shell命令,这些参数都显得十分重要:
cluster_name:集群名称,通常用于防止一个逻辑集群中的机器加入其他的集群,具有唯一标识性。 默认值:Test Cluster。
我的建议:在生产环境不要使用默认的集群名,以免未来在扩展多数据中心,多集群时引起命名冲突,造成不必要的麻烦。此外,在启动服务前提前修改好此参数,否则服务一旦启动,将围绕此集群名建立一系列的系统表,到时想更换集群名字只能删除所有系统表,很麻烦。seed_provider:-parameters:-seeds:集群中的种子节点,被视为联系不同节点的主机地址。节点通过该列表的主机来找到对方,并学习集群环中的拓扑结构,通过Gossip相互沟通。
我的建议:种子实际上是一个逗号分隔的地址列表。如果你想要设置多个种子节点,你应该遵循这样的格式:Ex: “ip1,ip2,ip3”,在此处我填写 seeds:192.168.30.101。我仅设置一台主机。listen_address: 通常用于通知其他节点通过此ip地址连接到你这台机器节点。
我的建议:不要将监听地址设置为0.0.0.0,这样做通常是错误,而是设置成具体的本机ip,如此处我设置为 listen_address: 192.168.30.101。rpc_address: 此ip地址将绑定 Thrift RPC 服务,本地的传输服务也将使用此ip。
我的建议: 不要将监听地址设置为0.0.0.0或者localhost,这样做通常是错误,而是设置成具体的本机ip,如此处我设置为 rpc_address: 192.168.30.101。data_file_directories: Cassandra通常在该磁盘目录下存储数据,进行均匀地分布数据, 这取决于你配置的压缩策略。
我的建议: 你可以设置成你想要的任何目录地址,但是我建议你采用默认的方式,Cassandra将自动加载到如下目录$CASSANDRA_HOME/data/data,方便管理。commitlog_directory: 日志存放目录,通常用于记录写入数据的日志,当发生意外无法写入到SSTable时,可以使用commitlog恢复数据,防止丢失。
我的建议:你可以设置成你想要的任何目录地址,但是我建议你采用默认的方式,Cassandra将自动加载到如下目录$CASSANDRA_HOME/data/commitlog,方便管理。saved_caches_directory: 缓存地址
我的建议: 你可以设置成你想要的任何目录地址,但是我建议你采用默认的方式,Cassandra将自动加载到如下目录$CASSANDRA_HOME/data/saved_caches,方便管理。logback.xml: 通常用于系统日志输出的地址配置。
我的建议: 你可以设置成你想要的任何目录地址,但是我建议你采用默认的方式,Cassandra将自动加载到如下目录$CASSANDRA_HOME/logs目录下,方便管理。
第一步:与windows类似安装jdk8.0以上版本,python则是linux自带不必安装。
第二步:从http://cassandra.apache.org/download/下载,使用命令:
wget http://mirrors.hust.edu.cn/apache/cassandra/3.11.1/apache-cassandra-3.11.1-bin.tar.gz
解压最新的Cassandra版本,使用命令
tar zxvf apache-cassandra-3.11.1-bin.tar.gz
第三步:与windows类似,编辑CASSANDRA_HOME环境变量,使用命令
vim /etc/profile
export CASSANDRA_HOME=(你解压后的路径)
export CLASSPATH=.: CASSANDRAHOME/lib: CLASSPATH
:wq
source /etc/profile
第四步:类似windows,修改cassandra.yaml中的配置参数,在此不做演示。
在安装配置完成以后,我们就可以开始启动服务,通过cmd命令进入Cassandra的bin目录,直接输入cassandra,即可启动Cassandra服务了。
在启动过程中你可能会遇到如下问题 :
此时右键标记复制红色框框内的语句,如下:
powershell Set-ExecutionPolicy Unrestricted
再次输入,你将会遇到如下问题:
此时根据提示,我们使用管理员身份启动cassandra服务即可启动成功了。如下所示:我的192.168.30.101已经成功假如了集群ring中了,并且等待gossip通信。
进入cassandra的bin目录,使用以下命令启动cassandra服务
sh cassandra
使用 sh -x cassandra
命令可以详细查看cassandra启动中的每一步的执行过程。启动后使用如下命令查看日志输出:
tail -f /opt/cassandra/logs/system.log
第一步:找一台新的机器节点,重复安装配置,和启动服务的操作。这里我找的是ip地址是192.168.30.170的机器,需要注意的是此时seeds节点列表,就不能填写本机的ip地址,必须是主节点的ip地址,比如此时子节点上的seeds为192.168.30.101。启动子节点的服务。
第二步:主节点上输入nodetool status 发现如下图所示,表示子节点加入成功:
第一步:关闭子节点,使用命令nodetool decommission,该命令表示关闭节点并且将数据迁移到邻近的下一个节点上,主节点上使用nodetool status命令查看发现先,集群由原先的两台变成了一台表示已经子节点已经关闭成功,这里说明 UN(表示up,节点正常运行),DN(表示down,节点宕机),UJ(表示数据正在迁移中,请稍候),如下图所示:
第二步:然后此时,我们再启动170的子节点,希望它重新加入集群,我们会发现Decommissioned nodes will not rejoin the cluster (CASSANDRA-8801)
的错误,如下图所示:
这是Cassandra项目存在的主要bug,我也是折腾了一个多小时才解决。首先我们来翻看一下Cassandra的源代码,我们发现在org.apache.cassandra.service.StorageService的类中的prepareToJoin方法有一段如下的判断:
if (SystemKeyspace.wasDecommissioned())
{
if (Boolean.getBoolean("cassandra.override_decommission"))
{
logger.warn("This node was decommissioned, but overriding by operator request.");
SystemKeyspace.setBootstrapState(SystemKeyspace.BootstrapState.COMPLETED);
}
else
throw new ConfigurationException("This node was decommissioned and will not rejoin the ring unless cassandra.override_decommission=true has been set, or all existing data is removed and the node is bootstrapped again");
}
很显然假如Boolean.getBoolean(“cassandra.override_decommission”)一直是false,子节点加入集群将会一直报错,而在整个cassandra的项目源码中我们没有发现类似 System.setProperty("cassandra.override_decommission", "true");
的语句将已关闭的节点重新恢复的语句,换句话说,一旦你关闭了某个机器节点,那么其他的机器节点将会记住,该节点已经不再是集群中的一部分,而你做任何操作都改变不了这个事实,这个就是整个问题的根源。找到问题以后,我们就来解决问题,首先我们来查看一下在stackoverflow上一些外国网友的解决办法 :
显然他是删除了commitlog,data_file_derectories,saved_caches_directory和log目录,然后重新启动该子节点,我的办法和他一样,直接删除了cassandra安装目录下的data目录,然后重启。节点便可以重新加入集群中了。
我的建议:鉴于关闭节点重新启动无法加入集群,是一个cassandra的主要bug。因此除非你十分清楚你在做什么,否则请谨慎在生产环境中使用nodetool decommission的命令,因为目前想让关闭节点加入集群,你必须手动删除data目录,这必然会造成数据的丢失和错误。
第一步:手动停止子节点上的cassandra服务,使其宕机。
第二步:在主节点上使用nodetool status,如下图所示,原先192.168.30.170是UN的状态,后来192.168.170是DN,表示已经宕机了:
第三步:使用nodetool removenode HostID
命令删除已经宕机的节点。再次查看只剩下主节点了。
Cassandra CQL的使用是Cassandra的核心内容之一,我将会在下一篇博客《Cassandra CQL基于官方文档的实战》中向你专门展示CQL的重要用法,敬请期待。此处仅仅是为了演示,为了后文nodetool等运维工具的使用做一个铺垫展示一些简单应用。
第一步:进入bin目录,使用cqlsh +ip命令打开cqlsh终端
cqlsh 192.168.30.101
第二步:建立键空间,语句如下:
CREATE KEYSPACE firstks1
WITH replication = {‘class’: ‘SimpleStrategy’, ‘replication_factor’ : 3};CREATE KEYSPACE firstks1
WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘DC1’ : 1, ‘DC2’ : 3}
AND durable_writes = false;
此处为了演示方便选择备份策略SimpleStrategy,机器备份节点个数为3,在实际生产环境中推荐使用备份策略NetworkTopologyStrategy,并且设置好每个数据中心的返回节点数,具体使用详情和内部原理请查看我的第一篇博客《Cassandra源码解析》,其中有非常详细的内容,帮助你快速了解Cassandra。执行后使用如下命令进行查看:
desc keyspace firstks1;
第三步:建立table表,也可以理解成建立列族,使用如下建表语句
use firstks1;
CREATE TABLE student IF NOT EXISTS (
name text PRIMARY KEY,
age int,
address text,
primary key(name)
) WITH comment=’Important biological records’
AND read_repair_chance = 1.0;
使用desc table student
确认建表成功,如下图所示:
第四步:插入数据,使用如下插入语句:
INSERT INTO student (name, age, address)
VALUES ('Tom', 17, 'fuzhou')
1.nodetool version :查看nodetool版本
2.nodetool status : 查看节点状态
3.nodetool upgradesstables :当进行Cassandra版本升级时,需要运行这个命令更新SSTable
由于我的cassandra是最新的apache-cassandra-3.11.1版本,就不演示这个命令。
4.nodetool snapshot :用于创建keyspace或table的快照信息,即数据备份,可用于数据的恢复
5.nodetool clearsnapshot : 当创建了新的快照后,旧的快照并不会自动删除,clearsnapshot用于删除所有快照信息,所以为了避免误删,操作前,先把需要的快照移动到其他位置。使用 -t snapshotname 指定要删除快照的名字。使用 – keyspace 指定键空间
6.nodetool describecluster:输出集群信息。
7.nodetool describering keyspace :后面需要跟keyspace的名字,显示圆环的节点信息。
8.nodetool getendpoints : 查看key分布在哪一个节点上,需要三个参数:keyspace、table、keyname。
9.nodetool netstats: 获取节点的网络连接信息,可以指定参数 -h 查看具体节点信息。
10.nodetool rebuild : 当有新的数据中心加入,运行这个命令复制数据到数据中心。
11.nodetool repair: 在删除数据的时候,Casssandra并非真实的删除,而是重新插入一条的数据,记录了删除的记录的信息和时间,叫做tombstone墓碑。使用nodetool repair,可以删除tombstone数据。频繁修改的数据节点可以使用这个命令节省空间、提高读速度。
12.nodetool tpstats : 列出Cassandra维护的线程池的信息,你可以直接看到每个阶段有多少操作,以及他们的状态是活动中、等待还是完成。
13.nodetool cfstats: 查看表的一些信息,包括读的次数,写的次数,sstable的数量,memtable信息,压缩信息,bloomfilter信息。
14.nodetool compact : 合并sstable文件。
15.nodetool compactionstats : 显示当前正在压缩的任务进度。
16.nodetool flush : 会把memtable中的数据刷新到sstable,不需要重启节点。
用于压力测试,可以模拟写入和读取
cassandra-stress help option : 查看帮助
-node 指定连接的节点,多个节点逗号隔开
-port 指定端口,如果修改过端口,那就必须指定
cassandra-stress write n=1000000 # 插入一百万数据
cassandra-stress read n=200000 # 读取20万行数据
cassandra-stress read duration=3m # 持续三分钟,一直读取
第一步:修改cassandra.yaml配置文件中的
authenticator: AllowAllAuthenticator为
authenticator:PasswordAuthenticator
第二步:重启cassandra,使用默认用户名cassandra和默认密码cassandra登录。
./cqlsh -ucassandra -pcassandra
第三步:创建新用户
CREATE USER myusername WITH PASSWORD ‘mypassword’ SUPERUSER ; (NOSUPERUSER | SUPERUSER)
第四步:删除默认帐号
DROP USER cassandra;
第五步:无密码登录CQLSH
1.在linux环境下编辑~/.cassandra/cqlshrc文件,加入下面代码
2.Windows在用户目录下新建文件夹.cassandra.,在里面新建文件cqlshrc写入
至此,相信你已经掌握了Cassandra集群的入门技巧,在下一篇博文中,我将向你介绍Cassandra使用的核心内容——CQL,它将会让我们更加深入的操作NoSQL,敬请期待,如果你有任何疑问或者想对我说的话,都欢迎你在评论区下留言,我很乐意为你解答。