Cassandra初步学习和性能测试

1、cassandra安装

  • 下载并解压tar -xzvf apache-cassandra-3.11.10-bin.tar.gz -C /usr/local/

  • 创建三个存放数据的文件夹

    [root@hadoop102 cassandra-3.11.10]# mkdir data
    [root@hadoop102 cassandra-3.11.10]# mkdir commitlog
    [root@hadoop102 cassandra-3.11.10]# mkdir saved_caches
    
  • conf/cassandra.yaml配置上面三个文件夹

    data_file_directories:
        - /usr/local/cassandra-3.11.10/data
    commitlog_directory: /usr/local/cassandra-3.11.10/commitlog
    saved_caches_directory: /usr/local/cassandra-3.11.10/saved_caches
    
  • 启动cassandra:

    [root@hadoop102 cassandra-3.11.10]# bin/cassandra
    Running Cassandra as root user or group is not recommended - please start Cassandra using a different system user.
    If you really want to force running Cassandra as root, use -R command line option.
    

    提示:官方不推荐root启动,若必须用root用户启动,需加上-R参数。

    首次运行cassandra之后,会产生logs文件夹

    查看cassandra pid(ps -ef|grep cassandra),再用kill -9 命令即可结束进程

    为方便启动、关闭,自定义脚本:

    #!/bin/sh
    CASSANDRA_DIR="/usr/local/cassandra-3.11.10"
     echo "************cassandra***************"
    case "$1" in
            start)
    
                    echo "*                                  *"
                    echo "*            starting              *"
                    nohup $CASSANDRA_DIR/bin/cassandra -R >> $CASSANDRA_DIR/logs/system.log 2>&1 &
                    echo "*            started               *"
                    echo "*                                  *"
                    echo "************************************"
                    ;;
            stop)
    
                    echo "*                                  *"
                    echo "*           stopping               *"
                    PID_COUNT=`ps aux |grep CassandraDaemon |grep -v grep | wc -l`
                    PID=`ps aux |grep CassandraDaemon |grep -v grep | awk {'print $2'}`
                    if [ $PID_COUNT -gt 0 ];then
                            echo "*           try stop               *"
                            kill -9 $PID
                            echo "*          kill  SUCCESS!          *"
                    else
                            echo "*          there is no !           *"
                    echo "*                                  *"
                    echo "************************************"
                    fi
                    ;;
            restart)
    
                    echo "*                                  *"
                    echo "*********     restarting      ******"
                    $0 stop
                    $0 start
                    echo "*                                  *"
                    echo "************************************"
                    ;;
            status)
                    $CASSANDRA_DIR/bin/nodetool status
                    ;;
    
            *)
            echo "Usage:$0 {start|stop|restart|status}"
    
            exit 1
    esac
    

2、cassandra基本概念

2.1、数据模型

  • :是cassandra基本数据结构单元,具有三个值:名称、值、时间戳。不需要事先定义好,只需要在KeySpace里定义列族即可

  • 列族:包含了多行的容器,每行里面有列。

    cassandra_cf.png

    CF的两种类型:

    • 静态CF:字段名固定
    • 动态CF:字段名由程序计算提供,CF只能定义字段类型

    主键:cassandra可以通过PRIMARY KEY关键字创建主键,分为两种:

    • single column primary key:单列主键
    • composite primary key:多列主键
  • 键空间(KeySpace):类似于关系数据库里的库,键空间包含一个或者多个列族。创建的时候可以指定一些属性:副本因子,副本策略,Durable_writes(是否启用 CommitLog 机制)

    • 副本因子:决定数据有几份副本(所有的副本都同样重要,没有主从之分。可以为每个数据中心定义副本因子。副本策略设置应大于1,但是不能超过集群中的节点数。)

    • 副本策略:描述副本放在集群中的策略

      SimpleStrategy:适用于只有一个数据中心,为集群指定简单的副本因子

      NetworkTopologyStrategy(网络拓扑策略):推荐方式,可以扩展到多数据中心,可以单独为每个数据中心设置复制因子

2.2、cassandra.yaml

  • cluster_name:同一集群下节点该项配置要一致

  • listen_address:cassandra需要监听的主机名,默认localhost

  • commitlog_directory:commit log的保存目录,压缩包安装方式默认是/var/lib/cassandra/commitlog。通过前面的了解,我们可以知道,把这个目录和数据目录分开存放到不同的物理磁盘可以提高性能。

  • data_file_directories:数据文件的存放目录,压缩包安装方式默认是/var/lib/cassandra/data。为了更好的效果,建议使用RAID 0或SSD。

  • save_caches_directory:保存表和行的缓存,压缩包安装方式默认是/var/lib/cassandra/saved_caches。

3、CQL Shell

cqlsh 默认连接本机9042端口

3.1键空间操作

  • 创建键空间:

    cqlsh> create KEYSPACE school with replication = {'class': 'SimpleStrategy','replication_factor': 3};
    cqlsh> DESCRIBE KEYSPACES;
    
    school  system_schema  system_auth  system  system_distributed  system_traces
    
    
    cqlsh> DESCRIBE school
    
    CREATE KEYSPACE school WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'}  AND durable_writes = true;
    
    

    durable_writes默认为true

  • 连接键空间:use school;

  • 修改键空间,比如修改副本因子:

    cqlsh:school> ALTER KEYSPACE school WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
    cqlsh:school> DESCRIBE school
    
    CREATE KEYSPACE school WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;
    
  • 删除键空间:DROP KEYSPACE school ;

3.2 表操作

首先要进入到键空间:use <KeySpace>

  • 创建表:

    CREATE TABLE student(
       id int PRIMARY KEY,  
       name text,  
       age int,  
       gender tinyint,  
       address text ,
       interest set<text>,
       phone list<text>,
       education map<text, text>
    );
    

    类似于sql

  • 查看表:DESCRIBE TABLE student

  • 删除表:drop table student

3.3、索引(Key)

cassandra有五种key:

  • primary key 主键:

    cassandra中primary key概念比较宏观,可以由一个或者多个列组合,用来获取某一行的数据

    如果主键由多列构成,就称作composite primary key,或compound primary key

    create table testTab (
    key_one int,
    key_two int,
    name text,
    PRIMARY KEY(key_one, key_two)
    );
    
  • partition key 分区key

    在组合主键的情况下(上面的例子),第一个部分称作partition key,第二个部分称作clustering key。

    partition key作用就是:Cassandra会对其做一个hash计算,并自己决定将这一条记录放在哪个节点

    分区键也可以组合而成,这叫做composite partition key:

    create table testTab (
    key_part_one int,
    key_part_two int,
    key_clust_one int,
    key_clust_two int,
    key_clust_three uuid,
    name text,
    PRIMARY KEY((key_part_one,key_part_two), key_clust_one, key_clust_two, key_clust_three)
    );
    

    一个组合分区键,三个集群键。

  • composite key 复合key

  • compound key 复合key

  • clustering key 集群

以下情况不要用索引:

- 这列的值很多的情况下,因为你相当于查询了一个很多条记录,得到一个很小的结果。
- 表中有couter类型的列
- 频繁更新和删除的列
- 在一个很大的分区中去查询一条记录的时候(也就是不指定分区主键的查询

4、cassandra集群搭建

4.1、准备

三台centos7虚拟机:hadoop102:192.168.10.102;hadoop103:192.168.10.103;hadoop104:192.168.10.104;选择前两台主机作为seed节点。

seed节点作用:

一个新节点加入集群需要通过种子节点发现集群中其他的节点,至少需要一个活跃的seed,节点加入集群之后,下次启动就不需要种子节点了。可设置任何一个作为种子节点。

4.2、配置修改

需要在每台机器的配置文件cassandra.yml中进行一些修改,包括:

  • cluster_name 集群名字,每个节点都要一样

  • seeds 填写2个节点的ip作为 种子节点,每个节点的内容都要一样

    seed_provider:
        # Addresses of hosts that are deemed contact points. 
        # Cassandra nodes use this list of hosts to find each other and learn
        # the topology of the ring.  You must change this if you are running
        # multiple nodes!
        - class_name: org.apache.cassandra.locator.SimpleSeedProvider
          parameters:
              # seeds is actually a comma-delimited list of addresses.
              # Ex: "<ip1>,<ip2>,<ip3>"
              - seeds: "192.168.10.102,192.168.10.103"
    
  • listen_address 填写当前节点所在机器的IP地址

  • rpc_address 填写当前节点所在机器的IP地址

遇到的问题:

nodetool status报错:

error: No nodes present in the cluster. Has this node finished starting up?
-- StackTrace --
java.lang.RuntimeException: No nodes present in the cluster. Has this node finished starting up?

解决办法:将集群中的主机内的data、commitlog、saved_caches文件夹全部删除,重新创建

cassandra集群.png

5、YCSB测试Cassandra性能

官方文档地址:https://github.com/brianfrankcooper/YCSB/tree/master/cassandra

  1. 根据文档提示先创建测试所需要的keyspace和table:

    cqlsh> create keyspace ycsb
        WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 3 };
    cqlsh> USE ycsb;
    cqlsh> create table usertable (
        y_id varchar primary key,
        field0 varchar,
        field1 varchar,
        field2 varchar,
        field3 varchar,
        field4 varchar,
        field5 varchar,
        field6 varchar,
        field7 varchar,
        field8 varchar,
        field9 varchar);
    

    ycsb库表.png

    replication_factor 将会影响性能

    根据文档,设置cassandra的配置文件:cassandra.properties,这里我只设置了hosts为三个节点地址。

    bin/ycsb load cassandra-cql -P workloads/workloada -P cassandra.properties

    加载数据后,执行run指令:

    [OVERALL], RunTime(ms), 5770
    [OVERALL], Throughput(ops/sec), 173.3102253032929
    [TOTAL_GCS_PS_Scavenge], Count, 3
    [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 16
    [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.2772963604852686
    [TOTAL_GCS_PS_MarkSweep], Count, 0
    [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
    [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
    [TOTAL_GCs], Count, 3
    [TOTAL_GC_TIME], Time(ms), 16
    [TOTAL_GC_TIME_%], Time(%), 0.2772963604852686
    [READ], Operations, 503
    [READ], AverageLatency(us), 2882.1988071570577
    [READ], MinLatency(us), 1156
    [READ], MaxLatency(us), 51743
    [READ], 95thPercentileLatency(us), 5719
    [READ], 99thPercentileLatency(us), 10799
    [READ], Return=OK, 503
    [CLEANUP], Operations, 1
    [CLEANUP], AverageLatency(us), 2216960.0
    [CLEANUP], MinLatency(us), 2215936
    [CLEANUP], MaxLatency(us), 2217983
    [CLEANUP], 95thPercentileLatency(us), 2217983
    [CLEANUP], 99thPercentileLatency(us), 2217983
    [UPDATE], Operations, 497
    [UPDATE], AverageLatency(us), 2949.549295774648
    [UPDATE], MinLatency(us), 811
    [UPDATE], MaxLatency(us), 31791
    [UPDATE], 95thPercentileLatency(us), 5899
    [UPDATE], 99thPercentileLatency(us), 18767
    [UPDATE], Return=OK, 497
    

    同样和之前的HBase测试一样,通过改变读写请求比例、请求数、记录条数,测试数据如下:

    测试数据.png

如测试结果所示:当请求种类多读少写时,cassandra的性能表现并不如HBase优秀;但当请求偏向写操作时,cassandra的性能表现与HBase的性能表现差距并不大,但是读请求处理的延迟没有HBase的低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值