(原创)Cassandra数据库的优化总结
[TOC]
实验室的源代码分析系统的Cassandra数据库优化过程从十一放假开学起cassandra一直出现的超时,崩溃等一系列问题就一直得不到解决。现在已经解决,把解决过程记录与此。
0x01:分析原因
起初分析原因,认为是一些基础设置不够到位,例如cassandra.yaml等配置不够好。因为cassandra不只是查询速度慢,其他操作例如插入之类的也会出现链接失败的错误,因此第一步主要优化Linux和JVM设置。
0x02:优化Linux:
(1)下载jemalloc
一个在内存分配上比linux自带的malloc(ptmalloc)要优秀的分配工具。
Github地址:https://github.com/jemalloc/jemalloc
下载release版本之后,
解压
./configure
Make
Make install
即可安装完毕。
(2)关闭swap
最大限度的使用物理内存:
/etc/sysctl.conf
完成之后保存,执行sysctl -p 令其生效。
0x03:接下来优化JVM的配置:
Cassandra是用java语言开发的,可以通过修改JVM的配置来进行优化:
JVM配置在cassandra-evn.sh中:
/usr/local/apache-cassandra-3.9/conf/cassandra-evn.sh
添加如下两行,第一行是优化线程压缩级别,减少内存占用。
第二行是使用压缩后的指针,这一条仅仅在x64位机器上有用。
0x04:Cassandra本身的配置:
/usr/local/apache-cassandra-3.9/conf/cassandra.yaml
并发数目一般来说按照默认读写就可以。(8*num_cores=32)
disk_access_mode: mmap
使用内存映射的方法来进行文件IO,而不是传统的流式读写。
write性能提升5%
memtable_allocation_type: offheap_objects
0x05经过以上的配置之后,重启数据库,同时重启工作系统发现可以运行一段时间,但是之后又出现了崩溃。
针对工作系统和数据库的log进行分析,发现最初的问题产生源于一条数据库查询:
这个数据库查询函数出现了查询超时导致的cassandra内部崩溃,从而导致后来的一系列异常。
0x06:
因此针对其中的两条SQL语句进行数据库优化,添加二级索引:
针对project的优化
针对file的优化
完成索引添加之后,数据库再未出现崩溃的现象。今后如果在此出现也可以通过0x06里面分析出来的瓶颈进行针对性的进一步优化。
参考资料:
(1) cassandra官方文档
(2) Cassandra操作和性能优化 http://eric100.blog.51cto.com/2535573/1770036