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 ...
随机推荐
- CSS系列 (05):浮动详解
浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止.由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样. -- W3C 文字环绕 float可以 ...
- jupyter安装插件Nbextensions,实现代码提示功能(终极方法)
jupyter安装插件,实现代码提示功能 第一步 pip install jupyter_contrib_nbextensions -i https://mirrors.tuna.tsinghua.e ...
- securefx 系统中不到指定文件 (转中文)
如何处理上传工具SecureFX中的中文乱码 工具/原料 SecureFX centos7 方法/步骤 转百度知道 https://jingyan.baidu.com/article/eae07 ...
- #2020征文-开发板# 用鸿蒙开发AI应用(一)硬件篇
目录: 前言 开发板简介 产品特色及功能 产品参数 各个主板功能简介 Hi3516DV300 芯片手册 前言鸿蒙2.0的系统刚开源出来,华为志在打造1+8+N万物互联的全场景智慧生活,不仅是国产操作系 ...
- openstack octavia的实现与分析(二)原理,架构与基本流程
[了解] 其实说白了,Octavia就是将用户的API请求经过逻辑处理,转换成Haproxy或者Nginx的配置参数,下发到amphora虚机中. Octavia的内部实现中,逻辑流程的处理主要使用T ...
- vue-vite浅析
大家好,我是小雨小雨,致力于分享有趣的.实用的文章. 内容分为原创和翻译,如果有问题,欢迎随时评论或私信,很乐意和大家一起探讨,一起进步. 分享不易,希望能够得到大家的支持和关注. vite出了好久了 ...
- SpringBoot配置文件(1)
配置文件 1.配置文件 SpringBoot使用一个全局的配置文件 application.properties application.yml 配置文件名是固定的: 他的作用是修改SpringBoo ...
- MySQL学习Day01
1.MySQL的层级关系 2.xampp的安装使用 如果之前安装过mysql那么就需要将原来的mysql完全卸载干净 1.卸载之前安装的MySQL 安装xampp需要先卸载之前的mysql,以及更改m ...
- ip访问本机vs调试项目
环境:win10 vs2019 webapi F5启动调试. 问题:localhost可以访问,127.0.0.1和本机ip访问不了.比如想让别人浏览一下看效果,或者测试人员测试功能,每次修改都有重新 ...
- 【Spring】Spring中的Bean - 1、Baen配置
Bean配置 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 什么是Spring中的Bean? Spring可以被看作是一个 ...