由于客户端写数据时需要阻塞写commitlog(默认64GB),所以可以把commitlog放在SSD或者较为空闲的盘中。执行一次刷操作成功后,commitlog文件将被删除。
commitlog_directory
最好把data文件和commitlog放在两个不同的硬盘中,确保data不会和commitlog争抢IO时间。可配置多个。
data_file_directories
代表cassandra在等待其他节点响应的最大失败时间,在cassandra.yaml中,rpc_timeout_in_ms,默认是5s,如果网络不好或者数据量较大的情况下,可以适当调大改时间。
Cassandra按照特定的时间间隔,将数据持久化,默认是periodic,可能会丢失数据。改为batch时,在数据持久化到磁盘上时,会阻塞写操作会造成性能下降。同时改为batch是需要给CommitLogSyncBatchWindowInMS一个合理的值。
在写入磁盘之前每个列族的数据都会先写入一个单独的memtable中,memtable的大小由binary_memtable_throughput_in_mb控制。
同时还有memtable_throughput_in_mb,这是代表memtable被刷到磁盘之前可以存储的最大列数。默认是0.3,大约333000。
通过memtable_flush_after_mins设置,当memtable被刷到磁盘之后可以保留多久。
在memtable刷到磁盘之前,先会写入到一个缓冲区里,可以使用flush_data_buffer_size_in_mb(默认:32M)控制。
通过memtable_flush_writers(默认:1)设置memtable写入磁盘时所需要使用的线程数量,如果堆设置的比较大,我们可以调高这个值。
Cassandra的写入性能高于读取性能,其中可以通过:concurrent_writes来修改Cassandra的写入操作的执行线程数量,这个应该设置为未来将会并发连接到服务器的客户端的数量。
Cassandra的读取性能可以通过:concurrent_reads来修改Cassandra的写入操作的执行线程数量,以提高读取性能,每个核对应两个线程最好,比如说8核的物理机应该配置16个读线程。
注意,缓存可能会占用相当大的内存,应该根据使用情况来小心的调整他们。
缓存分为行缓存和键缓存。
行缓存会缓存整行数据,因此他会包含键缓存,设置了行缓存就不需要设置键缓存。
缓存策略确定条件:
keys_cached是设置存储在内存之中的键位置的数量而不是键值的数量。这个值可以指定一个小数或一个整数。小数是指定了一个要缓存的键值的百分比,如果使用了一个整数,则是指定将要缓存的键值位置的绝对数值。
rows_cached是设置Cassandra中缓存的行数。默认是0,如果使用小数则是全部数据的百分比,如果是整数则要缓存一个绝对值。
在优化五中有一条关于缓冲区的优化配置,还有如下配制:flush_index_buffer_size_in_mb(默认8M),如果每个key之定义了很少的列则可以考虑增加该配置的大小,相反则减少。
在Cassandra中垃圾回收期采用的是CMS垃圾回收器,在这里最大、最小堆应该设置为相同的值。
最大内存: max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
新生代大小:min(100M * num_cores, 1/4 * max heap size)
176414M 1024M 88207M 8192M 8192M
100*56,2048 2048M
新生代:Eden区、From区、to区的占比是: 8:1:1
老年代:新生代 = 2:1
由于Cassandra中很多对象会长期存在所以增加old区占比是合适的。
MaxTenuringThreshold(默认:1)新生代对象会在from区和to区来回复制这个复制会造成性能的开销,可以将其改为0,代表存活过一次gc的新生代对象直接进入老年代。
在热点发生时会有许多争抢锁的情况,偏向锁适得其反。关闭:JVM_OPTS="$JVM_OPTS -XX:-UseBiasedLocking"