cassandra权威指南读书笔记--性能调优
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权威指南读书笔记--性能调优的更多相关文章
- cassandra权威指南读书笔记--客户端
DataStax驱动最成熟.默认,驱动程序会使用第一个连接的节点作为支持的版本协议.如果集群存在高低版本的节点(比如升级场景),如果驱动先连接不同不同版本的节点,可能会出现不兼容.驱动支持压缩客户端和 ...
- cassandra权威指南读书笔记--Cassandra架构(3)
分阶段事件驱动架构 SEDASEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处 ...
- cassandra权威指南读书笔记--数据建模
没有join操作.有轻量级事务和批处理,但是没有外键等.反规范化.3.0支持物化视图,允许在一个表上创建数据的多个物化视图.使用cassandra要从查询入手,而不是先从数据模型开始.先对查询建模,然 ...
- cassandra权威指南读书笔记--监控&维护
cassandra SLF4J API记录日志,具体采用Logback实现.在终端启动cassandra时,可以向程序输入-f,就能在终端看到这个输出.Java Mangement Extension ...
- cassandra权威指南读书笔记--读写数据
写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...
- cassandra权威指南读书笔记--配置cassadnra
配置集群时,要求所有节点的集群名,分区器,snitch必须相同.种子节点最好相同. 种子节点:最好每个DC,配置2个,这样即使一个DC中一个种子节点挂了,仍然有一个中子节点可用.种子节点被认为是最先加 ...
- cassandra权威指南读书笔记--Cassandra架构(2)
环和令牌cassandra的数据管理是用一个环来表示.为环中的每个节点分配一or多个数据范围,用token描述.token由64位整数ID表示,范围-2^(63)~2^(63)-1.使用对分区键进行一 ...
- cassandra权威指南读书笔记--Cassandra架构(1)
结构 集群-->数据中心-->机架-->节点. cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心. 为了去中心化和分区容错性,使用gos ...
- cassandra权威指南读书笔记--cassandra概述
cassandra是一个开源的.分布式.去中心化.弹性可扩展.高可用.容错.可调一致性.面向行数据库,分布式设计基于Amazon Dynamo,数据模型基于Google BigTable.cassan ...
随机推荐
- kafka如何保证消息得顺序性
1. 问题 比如说我们建了一个 topic,有三个 partition.生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到 ...
- Hive日期函数总结(转学习使用)
一.时间戳函数 1.获取当前时区的UNIX时间戳:select unix_timestamp(); 2.将指定时间转为UNIX时间戳: select unix_timestamp('2012-03-0 ...
- Liunx运维(十一)-系统管理命令
文档目录: 一.lsof:查看进程打开的文件 二.uptime:显示系统的运行时间及负载 三.free:查看系统内存信息 四.iftop:动态显示网络接口流量信息 五.vmstat:虚拟内存统计 六. ...
- SQL操作符的优化
操作符优化 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQ ...
- 新来的运维这样用HDFS,CIO都懵了···
摘要:本文主要研究了HDFS文件系统的读写流程以及基于MRS在windows客户端下读写HDFS文件的实现. HDFS(Hadoop分布式文件系统)是Apache Hadoop项目的一个子项目. HD ...
- vue-vite浅析
大家好,我是小雨小雨,致力于分享有趣的.实用的文章. 内容分为原创和翻译,如果有问题,欢迎随时评论或私信,很乐意和大家一起探讨,一起进步. 分享不易,希望能够得到大家的支持和关注. vite出了好久了 ...
- JS navigator.userAgent
var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...
- Python pip install 默认路径修改。
pip动不动就下载数百M的文件.这些文件默认在C:盘,那么为了节省空间需要修改这些路径: 打开cmd命令窗口.输入: python -m site C:\Users\hewei>python - ...
- 单片机—Arduino UNO-R3—学习笔记002
led控制 本篇主要介绍Arduino数字引脚及相关函数,通过数字I/O输出控制板载LED灯亮灭状态(数字引脚13). 数字信号是以0.1表示的电平不连续变化的信号,也就是以二进制的形式表示的信号. ...
- Pandas的数据分组-aggregate聚合
在对数据进行分组之后,可以对分组后的数据进行聚合处理统计. agg函数,agg的形参是一个函数会对分组后每列都应用这个函数. import pandas as pd import numpy as n ...