cassandra自带测试工具cassandra-stress。
nodetool proxyhistograms可以在多个节点运行,发现最慢的协调节点。
nodetool tablehistograms可以查看特定表的性能。

利用tracing去跟踪某个特定表和相关查询。可以知道每个查询涉及的客户端和节点之间的通信和每一步的时间。设置tracing,可以使用cqlsh设置 TRACING ON,然后查询,再TRACING OFF。也可以通过驱动去查询tracing的结果。
nodetool setraceprobability:可以用来配置单个节点跟踪一些或者全部查询,默认是0.0。
0.0表示禁止tracing。1.0表示完全tracing。一般建议0.01或者0.001。
tracing结果存在system_traces中,2.2开始,还用来跟踪修复操作。cassandra会限制这些表的TTL,可以通过cassandra.yaml的tracetype_query_ttl和tracetype_repair_ttl。

调优:建议一次改一个配置参数,然后测试结果。调优建议:cassandra.yaml和cassandra-env.sh节点配置属性,在表结构上的各种参数,进行调整测试。

缓存
键缓存,行缓存,计数器缓存。
行缓存会为每个分区缓存一定数量的行,这个数量可配置。如果在给定的表使用行缓存,不需要同时使用键缓存。
考虑查询,考虑堆和缓存大小比值,考虑行大小与键大小的比值。
键缓存:
存储分区键和行索引之间的一个映射,以便快速找到SSTable。可以对每个表分别使用键缓存。默认开启键缓存。AND caching={‘key’:‘ALL’, ‘rows_per_partition’:'NONE'} ALL或者NONE
key_cache_size_in_mb表示键缓存大小,默认为min(JVM堆的5%,100MB)
行缓存:
小心使用,使用不当,容易带来的问题比优化多。小数据集还好,大数据集,如果必须从磁盘都,性能会下降。读多写少比较适合。可以利用操作系统支持的文件缓存特性来代替行缓存。
‘rows_per_partition’:'NONE'或者‘ALL’或者‘一个正整数’。行缓存可自定义实现,通过row_cache_class_name属性设置,默认由org.apache.cassandra.OHCProvider类实现的堆外缓存。之前是SerializingCacheProvider
计数器缓存:
通过减少对最常访问的计数器的锁竞争来提供性能。没有提供为每个表单独配置的选项。counter_cache_size_in_mb设置,所有表共享。默认是min(JVM堆2.5%,50MB)
cassandra支持定期将缓存保存到磁盘,可以在启动时读取来快速预热缓存。缓存文件保存在saved_caches属性指定的目录下。会按key_cache_save_period、row_cache_save_period和counter_cache_save_period属性指定的间隔(单位为秒)写文件,这些值的默认是14000(3个多小时)、0(禁用)、7200(2小时)。
缓存按键值索引。文件中保存的键个数由key_cache_keys_to_save、row_cache_keys_to_save和counter_cache_keys_to_save属性指示。
nodetool管理缓存,使用invalidatekeycache、invalidaterowcache和invalidatecountercache命令清除缓存。使用setacchecapacity覆盖键缓存和行缓存的容量。setcachekeytosave覆盖一个文件中保存多少个行缓存和键缓存。重启之后会恢复为cassandra.yaml。

memtable
每个表维护一个memtable,达到commitlog阈值,或者memtable阈值,会把memtable刷新输出为SSTable。memtable存在java堆或堆外内存中。堆和堆外限制为:memtable_heap_space_in_mb和memtable_offheap_space_in_mb设置。默认这两个值都设置在cassandra-env.sh为1/4堆大小。为memtable分配内存会减少缓存以及其他可用内存,要增量调优。
memtable_allocation_type,可插拔,默认是org.apache.cassandra.utils.memory.MemtablePool实现,没经验不建议自己实现。默认headp_buffers会让cassandra使用java New I/O(NIO)API在堆上分配memtable。offheap_buffers会让cassandra用NIO在堆上和堆外都分配每个memtable的一部分。
memtable_flush_writers,默认是2。写memtable的线程数,如果使用SSD,应该改为内核数,但不能能超过8,如果有很大的堆,可以设置更大,提高性能。
memtable_flush_period_in_ms,可以设置定期刷新。默认0表示禁用。带来可预测的写IO,但是会导致更多的SSTable和频繁的合并,影响读性能。

commitlog
commitlog_segment_size_in_mb,默认值为32MB,commitlog达到多大,开始写新文件。
commitlog_total_space_in_mb,如果设置比较大,可以不需要太频繁输出到磁盘。
commitlog_compression,启用日志压缩,LZ4、Snappy、Deflate。压缩需要额外CPU时间。
commitlog_sync,默认periodic,按时间间隔flush,由commitlog_sync_period_in_ms指定,默认10秒。batch会同步写磁盘,会阻塞。

SSTable
最好使用SSD,commitlog和数据文件使用不同的磁盘。
file_cache_size_in_mb:从磁盘读取SSTable时,cassadnra使用了一种缓冲缓存,即缓存池,来减少数据文件IO。缓存使用堆外内存,默认是min(512MB,Java堆的1/4)。
buffer_pool_use_heap_if_exhausted设置为true,允许cassandra使用堆外缓存满时使用java堆作为缓冲区。
index_summary_capacity_in_mb:cassandra可以覆盖默认java堆的5%。会在内存中维护SSTable索引摘要来加快对SSTable文件的访问。默认使用java堆的5%分配给这些索引。
为了保持索引摘要不超过限制,cassandra会缩减不需要表的相关索引。按时间频率重建索引,index_summary_resize_interval_in_minutes,默认60分钟。
min_index_inerval和max_index_inerval设置每个表的SSTable存储的最大和最小索引条数目。

hint handoff
hinted_handoff_throttle_in_kb:控制传输时使用的带宽,默认1024KB/秒。也可以通过nodetool sethintedhandoffthrottlekb。这是一个总的值,表示接受hint的节点的限制,如果有2个节点发hint,那么每个节点各分1/2的带宽。建议所有节点都设置一样,避免混淆。
3.0之前,hint存储在表中。3.0之后hint存在hints_directory属性指定的目录。通过max_hints_file_size_in_mb指定存储hint的磁盘大小。
nodetool truncatehints + IP/主机名/或者对应列表,可以清除向一个或者多个节点发送的hint。
max_hint_window_in_ms:只保存节点下线多久之内的hint。
还可以禁用和启用hint。

compact
SizeTieredCompactionStrategy(STCS),默认压缩策略。将SSTable分组为tier(层),按大小排列。如果一层有足够数量的SSTableI(默认为4个or更多),就会合并,组合成更大的SSTable。随着数据量的增长,会创建越来越多的层。适合写密集的表,不适合读密集。
LeveledCompactionStrategy(LCS),创建固定大小的SSTable,默认5MB,分组为leve(级),每一级包含前一级10倍的SSTable。LCS在IO上面开销更大,尽可能减少包含某一行的SSTable个数,给定的一个行平均在1.11个SSTable中。读远大于都,可以使用这个策略。如果IO很密集效果也不好。level的策略是L0层会在合并SSTable时,会同时选择L0和L1的有相同交集的rowkey的SSTabl一起合并。所以只有L0和L1之间会重复,其他都不会。L1之间也不会。
DateTieredCompactionStrategy(DTCS),2.0.11和2.1.1引入,为了提高时间序列数据的读性能,特别是访问模式涉及要访问最近写入的数据。做法是将时间窗SSTable分组,由数据的写入时间组织。合并只能在这些时间窗内完成。
compactionthreshold可以在每个表设置最大,最少多少个SSTable合并。也可以使用nodetool getcompactionthreshold 和 setcompactionthreshold获取和设置。
nodetool compactionstats查看合并状态
nodetool getcompactionthroughput和setcompactionthroughput获取和设置compact限流。
也可以在cassandra.yaml去设置compaction_throughput_mb_per_sec。设置为0表示禁用,默认16MB/s。
concurrent_compactors属性增加合并线程数。默认为min(磁盘数,内核数),最小2,最大8。
nodetool stop停止一个节点所有正在执行的合并,还可以按ID指定停止哪个compact。
nodetool compact命令可以强制完成一个主合并。合并开销很大。
nodetool compactionhistory可以看到已完成合并的统计。

JVM
适当调整-XX:SurvivorRatio,Eden区和Survivor区的比值,Eden放新对象,Survivor放GC之后还幸存的对象。设置-Xms和-Xmx一样,可以避免JVM花费大量时间扩展堆。使用CMS不建议设置超过8G的堆,因为堆太大,往往带来更长的GC耗时。
G1GC通常不需要太多调优,设置最大最小堆即可。G1GC在小于8G的场景不如CMS。
gc_warn_threshold_in_ms如果超过这个阈值,就打印告警日志。

可以使用cassandra-stress去测试性能
DataStax有个开源性能测试平台,cstar_perf。

可以在JVM参数加 -Dcassandra.write_survey=true和-Djoin_ring=false去测试节点的写。

cassandra权威指南读书笔记--性能调优的更多相关文章

  1. cassandra权威指南读书笔记--客户端

    DataStax驱动最成熟.默认,驱动程序会使用第一个连接的节点作为支持的版本协议.如果集群存在高低版本的节点(比如升级场景),如果驱动先连接不同不同版本的节点,可能会出现不兼容.驱动支持压缩客户端和 ...

  2. cassandra权威指南读书笔记--Cassandra架构(3)

    分阶段事件驱动架构 SEDASEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处 ...

  3. cassandra权威指南读书笔记--数据建模

    没有join操作.有轻量级事务和批处理,但是没有外键等.反规范化.3.0支持物化视图,允许在一个表上创建数据的多个物化视图.使用cassandra要从查询入手,而不是先从数据模型开始.先对查询建模,然 ...

  4. cassandra权威指南读书笔记--监控&维护

    cassandra SLF4J API记录日志,具体采用Logback实现.在终端启动cassandra时,可以向程序输入-f,就能在终端看到这个输出.Java Mangement Extension ...

  5. cassandra权威指南读书笔记--读写数据

    写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...

  6. cassandra权威指南读书笔记--配置cassadnra

    配置集群时,要求所有节点的集群名,分区器,snitch必须相同.种子节点最好相同. 种子节点:最好每个DC,配置2个,这样即使一个DC中一个种子节点挂了,仍然有一个中子节点可用.种子节点被认为是最先加 ...

  7. cassandra权威指南读书笔记--Cassandra架构(2)

    环和令牌cassandra的数据管理是用一个环来表示.为环中的每个节点分配一or多个数据范围,用token描述.token由64位整数ID表示,范围-2^(63)~2^(63)-1.使用对分区键进行一 ...

  8. cassandra权威指南读书笔记--Cassandra架构(1)

    结构 集群-->数据中心-->机架-->节点. cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心. 为了去中心化和分区容错性,使用gos ...

  9. cassandra权威指南读书笔记--cassandra概述

    cassandra是一个开源的.分布式.去中心化.弹性可扩展.高可用.容错.可调一致性.面向行数据库,分布式设计基于Amazon Dynamo,数据模型基于Google BigTable.cassan ...

随机推荐

  1. C#:使用连接字符串连接数据库

    前言:在上学期选择专业时候,选择的是互联网(还有物联网),这学期相关课程便是使用c#完成一个管理系统:最近的作业是完成一个对数据库操作类,操作数据库?虽然是很简单的一个作业,但也是懵逼了很久,在网上找 ...

  2. MySQL中Exists和In的使用

    Exists关键字: exists表示存在,是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避 ...

  3. 【Flutter】容器类组件之填充

    前言 Padding可以给其子节点添加填充(留白). 接口描述 class EdgeInsets extends EdgeInsetsGeometry { // 分别指定四个方向的填充 const E ...

  4. 开源:AspNetCore 应用程序热更新升级工具(全网第一份公开的解决方案)

    1:下载.开源.使用教程 下载地址:Github 下载 .其它下载 开源地址:https://github.com/cyq1162/AspNetCoreUpdater 使用教程: 解压AspNetCo ...

  5. C#中的异步和多线程

    许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识.在这里,你将了解这两个概念之间的区别,并使用c#实现它们. 我:"服务员,这是我第一次来这家餐厅.通常需要4个小时才 ...

  6. 国人之光:大数据分析神器Apache Kylin

    一.简介 Apache Kylin是一个开源的.分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献 ...

  7. k8s集群中遇到etcd集群故障的排查思路

    一次在k8s集群中创建实例发现etcd集群状态出现连接失败状况,导致创建实例失败.于是排查了一下原因. 问题来源 下面是etcd集群健康状态: 1 2 3 4 5 6 7 8 9 10 11 [roo ...

  8. oracle创建恢复编录(recovery catalog)

    1.在要作为恢复编录的数据库创建用户 create user rman identified by oracle default tablespace system temporary TABLESP ...

  9. Java安全之ysoserial-JRMP模块分析(一)

    Java安全之ysoserial-JRMP模块分析(一) 首发安全客:Java安全之ysoserial-JRMP模块分析(一) 0x00 前言 在分析到Weblogic后面的一些绕过方式的时候,分析到 ...

  10. 大促密集,CDN如何保障电商体验如丝般顺滑?

    简介: 前不久,阿里云技术天团空降CSDN在线峰会,对核心技术竞争力进行解读.其中,阿里云高级技术专家曾福华分享了<双11: CDN如何保障电商大促如丝般顺滑>的议题.俗话说:养兵千日,用 ...