Cassandra集群快速入门

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hellohellohhhhh/article/details/78468211

你好,朋友,很高兴能向你介绍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版本。


1.安装配置

<1>windows环境

第一步:安装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目录下,方便管理。

<2>linux环境

第一步:与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中的配置参数,在此不做演示。


2.启动服务

<1>windows环境

在安装配置完成以后,我们就可以开始启动服务,通过cmd命令进入Cassandra的bin目录,直接输入cassandra,即可启动Cassandra服务了。
在启动过程中你可能会遇到如下问题 :
这里写图片描述

此时右键标记复制红色框框内的语句,如下:

powershell Set-ExecutionPolicy Unrestricted

再次输入,你将会遇到如下问题:
这里写图片描述
此时根据提示,我们使用管理员身份启动cassandra服务即可启动成功了。如下所示:我的192.168.30.101已经成功假如了集群ring中了,并且等待gossip通信。
启动成功

<2>linux环境

进入cassandra的bin目录,使用以下命令启动cassandra服务

sh cassandra

使用 sh -x cassandra 命令可以详细查看cassandra启动中的每一步的执行过程。启动后使用如下命令查看日志输出:

tail -f /opt/cassandra/logs/system.log


3.动态增删机器节点

<1>增加机器节点

第一步:找一台新的机器节点,重复安装配置,和启动服务的操作。这里我找的是ip地址是192.168.30.170的机器,需要注意的是此时seeds节点列表,就不能填写本机的ip地址,必须是主节点的ip地址,比如此时子节点上的seeds为192.168.30.101。启动子节点的服务。

第二步:主节点上输入nodetool status 发现如下图所示,表示子节点加入成功:
这里写图片描述

<2>删除机器节点

1.关闭机器节点

第一步:关闭子节点,使用命令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目录,这必然会造成数据的丢失和错误。

2.移除宕机节点

第一步:手动停止子节点上的cassandra服务,使其宕机。
第二步:在主节点上使用nodetool status,如下图所示,原先192.168.30.170是UN的状态,后来192.168.170是DN,表示已经宕机了:
这里写图片描述

第三步:使用nodetool removenode HostID 命令删除已经宕机的节点。再次查看只剩下主节点了。
这里写图片描述


4.CQL使用

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;

如下图所示:
keyspace

第三步:建立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')

结果如下图所示:
insert


5.常用运维工具

<1>nodetool使用

1.nodetool version :查看nodetool版本

结果如下所示:
version

2.nodetool status : 查看节点状态

结果如下所示:
status

3.nodetool upgradesstables :当进行Cassandra版本升级时,需要运行这个命令更新SSTable

由于我的cassandra是最新的apache-cassandra-3.11.1版本,就不演示这个命令。

4.nodetool snapshot :用于创建keyspace或table的快照信息,即数据备份,可用于数据的恢复

结果如下所示:
snapshot
snapshot2

5.nodetool clearsnapshot : 当创建了新的快照后,旧的快照并不会自动删除,clearsnapshot用于删除所有快照信息,所以为了避免误删,操作前,先把需要的快照移动到其他位置。使用 -t snapshotname 指定要删除快照的名字。使用 – keyspace 指定键空间

结果如下图所示:
clearsnapshot

6.nodetool describecluster:输出集群信息。

结果如下图所示:
describe

7.nodetool describering keyspace :后面需要跟keyspace的名字,显示圆环的节点信息。
8.nodetool getendpoints : 查看key分布在哪一个节点上,需要三个参数:keyspace、table、keyname。

如下图所示:
ge

9.nodetool netstats: 获取节点的网络连接信息,可以指定参数 -h 查看具体节点信息。

结果如下图所示:
netstats

10.nodetool rebuild : 当有新的数据中心加入,运行这个命令复制数据到数据中心。

11.nodetool repair: 在删除数据的时候,Casssandra并非真实的删除,而是重新插入一条的数据,记录了删除的记录的信息和时间,叫做tombstone墓碑。使用nodetool repair,可以删除tombstone数据。频繁修改的数据节点可以使用这个命令节省空间、提高读速度。

12.nodetool tpstats : 列出Cassandra维护的线程池的信息,你可以直接看到每个阶段有多少操作,以及他们的状态是活动中、等待还是完成。

结果如下图所示:
net

13.nodetool cfstats: 查看表的一些信息,包括读的次数,写的次数,sstable的数量,memtable信息,压缩信息,bloomfilter信息。

结果如下图所示:
cf2

14.nodetool compact : 合并sstable文件。
15.nodetool compactionstats : 显示当前正在压缩的任务进度。
16.nodetool flush : 会把memtable中的数据刷新到sstable,不需要重启节点。

<2>cassandra-stress使用

用于压力测试,可以模拟写入和读取

cassandra-stress help option : 查看帮助
-node 指定连接的节点,多个节点逗号隔开
-port 指定端口,如果修改过端口,那就必须指定
cassandra-stress write n=1000000 # 插入一百万数据
cassandra-stress read n=200000 # 读取20万行数据
cassandra-stress read duration=3m # 持续三分钟,一直读取


6.设置 Cassandra 访问密码

第一步:修改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文件,加入下面代码
linux

2.Windows在用户目录下新建文件夹.cassandra.,在里面新建文件cqlshrc写入
window


至此,相信你已经掌握了Cassandra集群的入门技巧,在下一篇博文中,我将向你介绍Cassandra使用的核心内容——CQL,它将会让我们更加深入的操作NoSQL,敬请期待,如果你有任何疑问或者想对我说的话,都欢迎你在评论区下留言,我很乐意为你解答。


展开阅读全文

没有更多推荐了,返回首页