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 ...
随机推荐
- 使用docker制作Mysql镜像
一.过程说明 通过Dockerfile创建mysql镜像,使用的mysql软件包为mariadb二进制分发版,最终在宿主机启动mysql容器从而能在mysql容器外部访问mysql服务. 宿主机IP ...
- Linux 下 swap 分区及作用详解
我们在安装系统的时候已经建立了 swap 分区.swap 分区是 Linux 系统的交换分区,当内存不够用的时候,我们使用 swap 分区存放内存中暂时不用的数据.也就是说,当内存不够用时,我们使用 ...
- [Statistic] 置信度
背景 调研总体的情况时,常因调研成本等原因难以对总体情况逐一调研给出完全准确的结论.常以随机抽样的方式,通过统计样本估计总体. 单次随机抽样的结果可以看做是对总体结果的近似,但仍有不准确性.比如某次抽 ...
- 【函数分享】每日PHP函数分享(2021-1-8)
explode() 使用一个字符串分割另一个字符串. array explode( string $delimiter , string $string [, int $limit ]) 参数描述de ...
- 《犬夜叉2021》我想通过Binder找到你
前言 本故事纯属虚构,如有不通顺的逻辑请轻喷.️ <犬夜叉2021> 第一章:我还能找到你吗,阿篱 犬夜叉和奈落大决战之后,四魂之玉.食骨之井消失,谁也不知道去了哪,而犬夜叉和阿篱再次被分 ...
- Nginx 实现动态负载均衡(Nginx-1.10.1 + Consul v0.6.4)
一直也没有找到合适的类似Socat + Haproxy 的组合能用在Nginx,后来发现了Nginx的几个模块,但是也存在各种不足. 而且Nginx 在大流量的情况下nginx -s reload 是 ...
- 【Java】集合综合案例 - 播放器管理
集合综合案例 文章目录 集合综合案例 需求分析 项目演示 详细设计 代码实现 歌曲类 播放器类 播放列表类 测试 参考资料 播放器管理 需求分析 项目演示 详细设计 代码实现 重新搞一波 复习巩固 简 ...
- CTFHub - Web(六)
命令注入: 1.进入页面,测试127.0.0.1, 关键代码: <?php $res = FALSE; if (isset($_GET['ip']) && $_GET['ip'] ...
- ctfhub技能树—sql注入—过滤空格
手注 查询数据库 -1/**/union/**/select/**/database(),2 查询表名 -1/**/union/**/select/**/group_concat(table_name ...
- 使用 TensorBoard 可视化模型、数据和训练
使用 TensorBoard 可视化模型.数据和训练 在 60 Minutes Blitz 中,我们展示了如何加载数据,并把数据送到我们继承 nn.Module 类的模型,在训练数据上训练模型,并在测 ...