Cassandra学习笔记3

初学cassandra 如有错误请指正 谢谢                   

                 Cassandra  性能测试

目的:

验证Cassandra  是否达到如下性能:

在数据量为5000万下,读写数据1000/单台每秒,

准备工作:

一、Cassandra运行环境配置linux  jdk64位)

1、          Cassandra性能相关参数修改(cassandra.yaml文件)

(1) 最好将数据文件和日志文件存储在不同硬盘

# directories where Cassandra should store data on disk.

data_file_directories:

    - /var/lib/cassandra/data

# commit log

commitlog_directory: /var/lib/cassandra/commitlog

(2) 修改并发写的线程数量为128

# On the other hand, since writes are almost never IO bound, the ideal

# number of "concurrent_writes" is dependent on the number of cores in

# your system; (8 * number_of_cores) is a good rule of thumb.

concurrent_reads: 32

concurrent_writes: 128

       (3)

 

 

 

2  不能让Cassandra出现使用交换内存的情况,否则服务性能会出现严重下降。

二、Key Cache大小设置的原理

1       认为平常认证人员的数量符合平均值为2500,标准差为125万的正态分布。因此位于左右两个标准差之内人员的操作最多的。因此Key Cache的大小应该总量x百分比。X的值为上述四个标准差所占的面积比例。左右4个标准差之间的面积比例为99.99%,认为是5000万,因此,标准差大小为5000/(4+4)=625万。因此可以存入1250万。

三、创建数据库

1  创建keyspace

create keyspace mcas;

2  创建column family

create column family timebasedtoken with

  key_validation_class=UTF8Type and

  comparator = UTF8Type and

  column_metadata =

  [

         {column_name:seed ,validation_class:UTF8Type},

        {column_name: offset, validation_class: LongType},

        {column_name: state, validation_class: LongType},

         {column_name: modelType, validation_class: UTF8Type},

         {column_name: timeWindow, validation_class: LongType},

        {column_name: idType, validation_class: UTF8Type},

         {column_name: idNumber, validation_class: UTF8Type},

         {column_name: badPwCount, validation_class: LongType},

        {column_name: staticPwd, validation_class: UTF8Type},

            {column_name: staticPwVolity, validation_class: LongType},

            {column_name: algorith, validation_class: UTF8Type},

        {column_name: pwLength, validation_class: UTF8Type},

            {column_name: chgCode, validation_class: UTF8Type},

            {column_name: lastPwd, validation_class: UTF8Type}

  ];

3、修改key缓存大小

   update column family timebasedtoken with keys_cached = 7000000;

4、编写插入数据小程序mcas-jar-with-insertdatatest.jar,插入5000万条数据

小程序带有三个参数,第一个参数是-p,第二和第三个分别是开始位置和结束位置。

执行命令:java –jar mcas-jar-with-insertdatatest.jar  –p  0  50000000

 

5、编写读取并修改数据的程序  mcas-jar-with-mutiTest-ks-theadnum-count.jar

mcas-jar-with-mutithreadtest.jar  <keyspace>  <thread_count>  <readwrite_Number>

 

测试:

1、          执行16个线程读写数据

(1)执行命令  java -jar  mcas-jar-with-mutiTest-ks-theadnum-count  mcas  16  10000000;

(2)通过查看日志,在20分钟后每秒钟读写的数量趋于稳定,在16个线程并发下,每个线程处理的数量平均800左右,某线程部分日志输出如下:

 

 

 

 

 

(3)在执行过程中通过vmstats 2 查看服务器cpu使用率大约为65%

 



 

运行bin/nodetool -h localhost cfstats

 

Cassandra keyspace状态图

 

 



 

2、执行32个线程读写数据

(1)执行命令  java -jar  mcas-jar-with-mutiTest-ks-theadnum-count  mcas  32  10000000;

          (2)32个线程并发下,每个线程处理的数量大约400左右,某线程部分日志输出如下:



 

 

 

(3)在执行过程中通过vmstats 2 查看服务器cpu使用率大约为60-70%

 



  

 

 

Cassandra keyspace状态图

 



  

 

 

上图所圈项为key命中率

并且命中率会随着key cache capacity增大而增加。超过阈值后,运行一段时后由于内存的限制会出现严重性能问题。具体情况为当内存不足而运行垃圾回收的时候,Cassandra将不能提供服务,直到垃圾回收完成。

 

结论:

1、16个线程并发下,总处理能力为16 * 800= 12800/每台/每秒;32个线程并发下,总处理能力为32 * 400 = 12800/每台每秒。这两数值都完全能满足1000/每台/每秒的需求。

2、Cassandra的命中率随着内存中key的缓存容量增大会逐渐增加。

 

初学cassandra 如有错误请指正 谢谢   

猜你喜欢

转载自babydeed.iteye.com/blog/1325352